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 毫秒),在音频文件的开头不会引起注意;它更多地与模拟乐器等应用程序的响应时间有关。