是否可以将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秒。但有时候仍然可以听到差距。
相反,我想将音频解码为原始声音,然后将其合并。
答案 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步的答案后实施管理它的机制。
请注意,此技术适用于任何平台。
希望这有帮助。