android - 为什么 MediaPlayer 延迟播放 mp3 音频?
android - Why MediaPlayer delayes in playing mp3 audio?
我制作了一个小应用程序来练习使用 MediaPlayer 在 android 中播放音频,该应用程序运行良好但在单击播放按钮后有 1 秒的小延迟并且很明显,我注意到这种情况只发生启动音频文件时,暂停后立即恢复,没有延迟,我用谷歌搜索,看到有人建议使用 SoundPool 而不是 MediaPlayer,但建议在我的应用程序播放完整歌曲时使用 SoundPool 播放短音频片段,这是什么原因造成的延迟?是否有修复或解决此问题的方法?
这是我的代码:
私人媒体播放器 mMediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMediaPlayer = MediaPlayer.create(this,R.raw.this_is_america);
Button btnPlay = findViewById(R.id.btnPlay);
Button btnPause = findViewById(R.id.btnPause);
Button btnStop = findViewById(R.id.btnStop);
btnPlay.setOnClickListener(this);
btnPause.setOnClickListener(this);
btnStop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnPlay:
Toast.makeText(getApplicationContext(), "Playing song",
Toast.LENGTH_SHORT).show();
mMediaPlayer.start();
break;
case R.id.btnPause:
Toast.makeText(getApplicationContext(), "Pausing song",
Toast.LENGTH_SHORT).show();
mMediaPlayer.pause();
break;
case R.id.btnStop:
Toast.makeText(getApplicationContext(), "Song stopped",
Toast.LENGTH_SHORT).show();
mMediaPlayer.reset();
mMediaPlayer = MediaPlayer.create(this,R.raw.this_is_america);
break;
}
}
更新:原来是 mp3 音频文件在开始时有无声停顿,尝试了另一首歌曲,它工作正常,没有明显的延迟,谢谢 greeble31 建议检查。
Android 操作系统中存在音频延迟问题。录音和播放音频时有几毫秒的延迟。您可以通过浏览以下 URL 了解更多相关信息。而这种延迟与设备类型有关。
https://developer.android.com/ndk/guides/audio/audio-latency
https://source.android.com/devices/audio/latency/measurements
您可以使用本机工具包或本机程序(C、C++ ndk 基础)来最小化此延迟。但是你不能将它减少到 0 秒。只最小化延迟。
有https://superpowered.com/superpowered-android-media-server。您可以从中获得支持,但据我所知您需要为此付费。我没试过。因此我不知道它减少了多少延迟。
如果您想从 mp3 中删除无声部分。你可以为它使用 ffmpeg 包装器。转到 https://github.com/WritingMinds/ffmpeg-android-java link Android 有一个有效的 ffmpeg 包装器。你可以轻松使用它。
using FFMPEG with silencedetect to remove audio silence 您可以通过导航找到相关的 FFmpeg 命令。
在包装器中您不需要 ffmpeg 部分。您需要从 -y 替换它。您可以在导航到该包装器时获取这些详细信息
你的歌曲在开头有一个无声的停顿;)
正如@Lucefer 所提到的,由于音频堆栈的实现,Android 平台有一些 small unavoidable latency。或者,至少几年前是这样,不确定目前的情况。无论如何,这种延迟通常太小(~10 毫秒),在音频文件的开头不会引起注意;它更多地与模拟乐器等应用程序的响应时间有关。
我制作了一个小应用程序来练习使用 MediaPlayer 在 android 中播放音频,该应用程序运行良好但在单击播放按钮后有 1 秒的小延迟并且很明显,我注意到这种情况只发生启动音频文件时,暂停后立即恢复,没有延迟,我用谷歌搜索,看到有人建议使用 SoundPool 而不是 MediaPlayer,但建议在我的应用程序播放完整歌曲时使用 SoundPool 播放短音频片段,这是什么原因造成的延迟?是否有修复或解决此问题的方法?
这是我的代码:
私人媒体播放器 mMediaPlayer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mMediaPlayer = MediaPlayer.create(this,R.raw.this_is_america);
Button btnPlay = findViewById(R.id.btnPlay);
Button btnPause = findViewById(R.id.btnPause);
Button btnStop = findViewById(R.id.btnStop);
btnPlay.setOnClickListener(this);
btnPause.setOnClickListener(this);
btnStop.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.btnPlay:
Toast.makeText(getApplicationContext(), "Playing song",
Toast.LENGTH_SHORT).show();
mMediaPlayer.start();
break;
case R.id.btnPause:
Toast.makeText(getApplicationContext(), "Pausing song",
Toast.LENGTH_SHORT).show();
mMediaPlayer.pause();
break;
case R.id.btnStop:
Toast.makeText(getApplicationContext(), "Song stopped",
Toast.LENGTH_SHORT).show();
mMediaPlayer.reset();
mMediaPlayer = MediaPlayer.create(this,R.raw.this_is_america);
break;
}
}
更新:原来是 mp3 音频文件在开始时有无声停顿,尝试了另一首歌曲,它工作正常,没有明显的延迟,谢谢 greeble31 建议检查。
Android 操作系统中存在音频延迟问题。录音和播放音频时有几毫秒的延迟。您可以通过浏览以下 URL 了解更多相关信息。而这种延迟与设备类型有关。
https://developer.android.com/ndk/guides/audio/audio-latency https://source.android.com/devices/audio/latency/measurements
您可以使用本机工具包或本机程序(C、C++ ndk 基础)来最小化此延迟。但是你不能将它减少到 0 秒。只最小化延迟。
有https://superpowered.com/superpowered-android-media-server。您可以从中获得支持,但据我所知您需要为此付费。我没试过。因此我不知道它减少了多少延迟。
如果您想从 mp3 中删除无声部分。你可以为它使用 ffmpeg 包装器。转到 https://github.com/WritingMinds/ffmpeg-android-java link Android 有一个有效的 ffmpeg 包装器。你可以轻松使用它。
using FFMPEG with silencedetect to remove audio silence 您可以通过导航找到相关的 FFmpeg 命令。
在包装器中您不需要 ffmpeg 部分。您需要从 -y 替换它。您可以在导航到该包装器时获取这些详细信息
你的歌曲在开头有一个无声的停顿;)
正如@Lucefer 所提到的,由于音频堆栈的实现,Android 平台有一些 small unavoidable latency。或者,至少几年前是这样,不确定目前的情况。无论如何,这种延迟通常太小(~10 毫秒),在音频文件的开头不会引起注意;它更多地与模拟乐器等应用程序的响应时间有关。