在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。)