如何获得 Soundpool 的持续时间

Posted

技术标签:

【中文标题】如何获得 Soundpool 的持续时间【英文标题】:How to get the duration of Soundpool 【发布时间】:2012-03-05 04:37:22 【问题描述】:

我正在使用 soundpool 播放音频文件,我的目标是播放一个音频文件,完成后播放另一个音频文件。

这是我的代码

String source_path = "/sdcard/varun/audio.mp3";



mSoundPool = new SoundPool(10, AudioManager.STREAM_MUSIC, 0);
mSoundPool.setOnLoadCompleteListener(new OnLoadCompleteListener() 
public void onLoadComplete(SoundPool soundPool, int sampleId,
                                int status) 
                            loaded = true;
                        
                    );
                    sound1  = mSoundPool.load(source_path, 1);

                    hand1.postDelayed(new Runnable() 

                        public void run() 
                            // TODO Auto-generated method stub
                            if (loaded) 
                                mSoundPool.play(sound1, 1, 1, 1, time - 1, 1);
                                System.out.println("playing=== a");
                            
                        
                    , 21000);

在这里,我将值硬编码为 21000,但我需要获取音频文件的持续时间,因为每个文件的持续时间都会发生变化。我正在使用 android 2.2

如何实现这个请帮忙?

【问题讨论】:

【参考方案1】:

尝试使用这个代码老兄..

String[] fileNames = ...
MediaPlayer mp = new MediaPlayer();
for (String fileName : fileNames) 
    AssetFileDescriptor d = context.getAssets().openFd(fileName);
    mp.reset();
    mp.setDataSource(d.getFileDescriptor(), d.getStartOffset(), d.getLength());
    mp.prepare();
    int duration = mp.getDuration();
    // ...

【讨论】:

嘿我不想用 mediaplyer 我想用 soundpool 我遇到了类似的问题。我认为我们可能需要放弃 SoundPool :(【参考方案2】:

虽然看起来效率很低,但您可以创建一个带有所需声音的MediaPlayer,然后使用myMediaPlayer.getDuration() 方法为您提供剪辑中的毫秒数。

然后您可以调用myMediaPlayer.release() 以消除任何不需要的内存占用。在进行更多研究时,我发现我并不是唯一得出这个结论的人。这个库:

Get Duration Of Sound

使用这种精确的方法来解决问题。我认为这是一种合法的做法,因为这家伙看起来很合法。

【讨论】:

以上是关于如何获得 Soundpool 的持续时间的主要内容,如果未能解决你的问题,请参考以下文章

SoundPool 减慢应用程序

SoundPool 停止功能未停止

Sound Pool 只播放一次声音

SoundPool 加载缓慢,MotionEvent 很奇怪

android : 使用 SoundPool 播放具有短演变周期的短声音

Android - 连续音频播放?