无缝播放重叠的mp4文件

时间:2014-04-20 14:36:44

标签: android audio android-mediaplayer

是否可以将MediaPlayer输出到原始缓冲区而不是播放设备?

有一个网络电台提供直接下载的媒体文件。例: http://fresh.moskva.fm/files/2004/mp4/2013/11/13/203112.mp4 - 频道2004,2013-11-13 20:31:12 http://fresh.moskva.fm/files/2004/mp4/2013/11/13/203113.mp4 - 频道2004,2013-11-13 20:31:13

每个文件的长度为1:02(重叠2秒)。

当前的解决方案是使用MediaPlayer的2个实例,在另一个实例正在播放时调用prepare(),在seekTo()跳过2秒。但有时候仍然可以听到差距。

相反,我想将音频解码为原始声音,然后将其合并。

2 个答案:

答案 0 :(得分:1)

无法使用2个媒体播放器进行无缝播放,主要是因为输入pausedPlayer.start()和实际播放之间存在不可预测的延迟。延迟甚至可以是负数,因为未经过调整的播放器会跳过几毫秒。

我试图从这里的2位媒体播放器中挤出最多:https://github.com/basinilya/piterfm/blob/7e1f62a2303d1a32f617eee629ab514bc6019437/src/ru/piter/fm/player/SmoothMediaPlayer.java

  • getCurrentPosition()踩到mp4 AAC fils是粗糙的:~46或~92ms。因此,为了获得真实的位置,我会在循环中等待,直到值发生变化。
  • 我不会在下一个播放器上拨打seek(2000),而是通过静音和运行一段时间来预热它
  • 当关于切换到下一个玩家的时间时,我会获得最准确的位置,然后睡觉,然后恢复静音播放器,再次睡眠,然后取消静音。
  • 从两个位置和平均恢复延迟计算睡眠时间。

在真实设备上,点击次数仍然存在,但不是那么明显

答案 1 :(得分:0)

我的第一个问题是样品水平的2秒是2秒还是小于那个?换句话说,一旦音频被解压缩并播放,1秒钟,如果以44.1KHz采样,则最终会得到44,100个样本。因此,2秒将是88,200个样本。所以,如果当你完成一个文件并开始下一个...你能跳过最后一个88,200个样本并开始播放下一个并且它将是无缝的吗?如果没有,那么你可能永远不会像你想要的那样完美同步而没有故障等等。

我的建议是单独下载每个文件并在音频编辑器中查看原始数据(一旦解压缩),以确定是否是这种情况。如果是这样,那么一旦你决定如何实现它,它应该在代码中正常工作。有很多方法 - 你可以使用两个媒体播放器,但可能更好的方法是使用一个循环缓冲区,你填充文件中的样本并同时播放。可能性是媒体播放器本身根本不是"立即"在寻求或开始播放时足够 - 你需要样本准确度才能真正无缝播放。

总结一下:第1步是确保数据符合您的想法。第2步是在您知道第1步的答案后实施管理它的机制。

请注意,此技术适用于任何平台。

希望这有帮助。