繁体   English   中英

重叠mp4文件的无缝播放

[英]gapless playback of overlapping mp4 files

是否可以使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个媒体播放器进行无pausedPlayer.start()播放,主要是因为在进入pausedPlayer.start()与实际播放之间存在不可预测的延迟。 延迟甚至可以是负数,因为未暂停的播放器会跳过几毫秒。

我试图从这里的2个媒体播放器中获取最大收益: https : //github.com/basinilya/piterfm/blob/7e1f62a2303d1a32f617eee629ab514bc6019437/src/ru/piter/fm/player/SmoothMediaPlayer.java

  • mp4 AAC fils上的getCurrentPosition()步骤大致为:〜46或〜92ms。 因此,要获得真实位置,我需要循环等待直到值改变。
  • 我不会在下一个播放器上调用seek(2000) ,而是通过静音并运行一段时间来对其进行预热
  • 快要切换到下一个播放器时,我会获得最精确的位置,然后入睡,然后恢复静音的播放器,再次入睡,然后取消静音。
  • 睡眠时间是根据位置和平均恢复延迟来计算的。

在实际设备上,点击次数保持不变,但不是很明显

我的第一个问题是将2秒精确到样本水平的2秒,还是小于2秒? 换句话说,一旦音频被解压缩并可以播放,如果以44.1KHz采样,则1秒钟您将获得44,100个采样。 因此,2秒将是88,200个样本。 因此,如果当您完成一个文件并开始下一个文件时...可以跳过一个文件的最后88,200个样本并开始播放下一个文件,它将无缝地进行吗? 如果不是这样,那么您可能永远也无法完全同步,而不会出现故障等。

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

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

请注意,此技术对任何平台都是通用的。

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM