在android中使用媒体播放器时如何避免音频剪辑重复之前的延迟

Posted

技术标签:

【中文标题】在android中使用媒体播放器时如何避免音频剪辑重复之前的延迟【英文标题】:how to avoid the delay before the audio clip repeating while using media player in android 【发布时间】:2013-06-25 08:47:46 【问题描述】:

我希望我的程序连续播放特定的音频剪辑而没有任何启动延迟,因为我已经创建了一个程序,但它没有按照我的描述工作,所以请有人帮我解决这个问题

代码

import android.app.Activity;
import android.media.MediaPlayer;
import android.media.MediaPlayer.OnCompletionListener;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;

public class MainActivity extends Activity implements OnClickListener 
    LocalService mService;
    boolean mBound = false;
    Button btn1;
    Button btn2;
    MediaPlayer yourStereo;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
         btn1=(Button)findViewById(R.id.a_button);
         btn2=(Button)findViewById(R.id.b_button);


        btn1.setOnClickListener(this);


    

    @Override
    public void onClick(View arg0) 
            // play music here
            btn1.setVisibility(Button.GONE);
            btn2.setVisibility(Button.VISIBLE);
            // TODO Auto-generated method stub
            yourStereo = MediaPlayer.create(this, R.raw.pl);
                    yourStereo.start();
                    yourStereo.setOnCompletionListener(new OnCompletionListener() 

                        @Override
                        public void onCompletion(MediaPlayer mp) 
                            // TODO Auto-generated method stub
                            yourStereo.start();
                        
                    );
            // pause music here

            btn2.setOnClickListener(new View.OnClickListener() 

                @Override
                public void onClick(View v) 
                    // TODO Auto-generated method stub
                    yourStereo.stop();
                    btn2.setVisibility(Button.GONE);
                    btn1.setVisibility(Button.VISIBLE);

                
            );

    

【问题讨论】:

【参考方案1】:

只需在 MediaPlayer 上使用 setLooping(true),而不是再次播放 onCompletion

http://developer.android.com/reference/android/media/MediaPlayer.html#setLooping(boolean)

将播放器设置为循环播放或非循环播放。

随着循环,它会无限期地自行重复而不会中断,您不必担心自己处理它。

yourStereo = MediaPlayer.create(this, R.raw.pl);
yourStereo.setLooping(true);
yourStereo.start();

【讨论】:

您确定您的文件没有延迟?喜欢在开始或结束时保持沉默? 您可以尝试使用处理程序将搜索设置为在文件结束前 x 毫秒开始:***.com/a/10423155/833647 setLooping 确实存在问题:结束和开始之间的延迟很小。这可能是由于重新加载文件或 MediaPlayer 寻求启动 code.google.com/p/android/issues/detail?id=18756【参考方案2】:

使用 SoundPool 代替 MediaPlayer 进行低延迟媒体播放。

【讨论】:

检查这个edumobile.org/android/android-programming-tutorials/… SoundPool 不是解决大约 > 3 秒较长音频循环的解决方案【参考方案3】:

我找到了其他解决方案:

afd = assetManager.openFd(nameSound);

player.setDataSource(afd.getFileDescriptor(),
                     afd.getStartOffset(), afd.getLength() - 1000);
afd.close();
player.prepare();
player.setLooping(true);
player.start();

您只需定义总持续时间少 1000(0.1ms) 的持续时间。

【讨论】:

以上是关于在android中使用媒体播放器时如何避免音频剪辑重复之前的延迟的主要内容,如果未能解决你的问题,请参考以下文章

[数字媒体] PR视频剪辑之自定义音频视频加速转场和特显停顿

[数字媒体] PR视频剪辑之自定义音频视频加速转场和特显停顿

iOS 5.0 AVAudioPlayer 加载音频剪辑时出错:操作无法完成。 (OSStatus 错误 -50。)

在android的listview中实现音频播放器

如何在 Flash 中创建一个音乐播放器来创建音频文件的波形?

使用另一个声音引擎