为何MediaPlayer延迟播放mp3音频?

时间:2018-11-02 19:21:34

标签: java android audio android-mediaplayer

我制作了一个小应用程序,用于使用MediaPlayer在android中练习音频播放,该应用程序很好用,但是单击播放按钮后延迟了1秒,这很明显,我注意到只有在启动音频文件时才会发生这种情况,暂停后,它可以立即恢复,没有延迟。我到处转悠,发现有人建议使用SoundPool而不是MediaPlayer,但是在我的应用播放完整歌曲时,建议使用SoundPool播放简短的音频剪辑,这是什么原因造成的?有没有解决或解决此问题的方法?

这是我的代码:

私有MediaPlayer 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建议检查一下。

2 个答案:

答案 0 :(得分:0)

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链接,有一个适用于Android的ffmpeg包装器。您可以轻松使用它。

using FFMPEG with silencedetect to remove audio silence,您可以通过导航找到相关的FFmpeg命令。

在包装程序中,不需要ffmpeg部分。您需要从-y替换它。导航到该包装器时,您可以获得这些详细信息

答案 1 :(得分:0)

您的歌曲在开始时有一个静默的暂停;)

如@Lucefer所述,由于音频堆栈的实现,Android平台有一些small unavoidable latency。或者,至少在几年前,还不确定当前的状况。无论如何,该延迟通常太小(〜10ms),无法在音频文件的开头注意到。它与模拟乐器等的应用程序的响应时间有关。