【问题标题】:Gapless Playback with android MediaPlayer使用 android MediaPlayer 进行无缝播放
【发布时间】:2013-03-09 13:28:47
【问题描述】:

我正在尝试连续重复播放音频,没有任何间隙。我试过了,

mediaplayer.setLooping(true);

但它给出了重复时间之间的差距。并尝试了这个,

mediaplayer.setOnCompletionListener(new MediaPlayer.OnCompletionListener()  {
    @Override
    public void onCompletion(MediaPlayer mp)
    {
        mediaplayer.start();
    }
});

它也提供了一个间隙。我尝试过不同的音频格式。但两种方法都不适合我。 android中还有其他方法吗?

【问题讨论】:

  • 我认为您的媒体文件在媒体文件的开头或结尾可能有 2 到 3 秒的无音乐。所以你觉得有一个差距......
  • 不,先生,我已经检查过了。 Mediaplayer 给出一个间隙,文件没问题。

标签: android media-player


【解决方案1】:

播放完成后,播放器引擎会检查是否所有曲目都已完成,一旦完成,它将检查looping 标志。基于 looping 标志,seek0 秒。作为搜索的一部分,播放器引擎将从特定位置读取数据并开始播放。

延迟可能是由于seek 实现以及由存储介质(如sdcard)引入的延迟,除了重新初始化所有轨道并重新启动它们。因此,玩家回到起始位置时会有一定的延迟。

底层循环实现可以在这个函数AwesomePlayer::onStreamDone中找到,如下所示:http://androidxref.com/4.2.2_r1/xref/frameworks/av/media/libstagefright/AwesomePlayer.cpp#834

编辑 1:

要实现真正的gapless playback,您还可以考虑setNextMediaPlayer() 功能。

【讨论】:

    【解决方案2】:

    可能MediaPlayer 正在从服务器(甚至从设备本身)重新预取数据,这可能需要几秒钟。仅当缓冲完成后,它才会重新开始播放。
    如果你想绕过这个,你可以AFAIK只使用第二个MediaPlayer,它在第一个停止播放前不久开始缓冲媒体文件。然后您可以在OnCompletionListener 上启动第二个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-29
      • 2017-05-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多