是否可以将 MediaPlayer
输出到原始缓冲区而不是播放设备?
有一个网络电台提供媒体文件供直接下载。例子: http://fresh.moskva.fm/files/2004/mp4/2013/11/13/203112.mp4 - 2004 年 channel ,2013 年 11 月 13 日 20:31:12 http://fresh.moskva.fm/files/2004/mp4/2013/11/13/203113.mp4 - 2004 年 channel ,2013 年 11 月 13 日 20:31:13
每个文件的长度为:1:02(重叠 2 秒)。
目前的解决方案是使用 2 个 MediaPlayer
实例,在一个实例播放时调用 prepare()
并调用 seekTo()
跳过 2 秒。但有时仍能听到间隙。
相反,我想将音频解码为原始声音,然后将其组合。
最佳答案
使用 2 个媒体播放器进行无缝播放是不可能的,主要是因为进入 pausedPlayer.start()
和实际播放之间存在不可预测的延迟。延迟甚至可以是负数,因为未暂停的播放器会跳过几毫秒。
我试图从这里的 2 个媒体播放器中获得最大的 yield :https://github.com/basinilya/piterfm/blob/7e1f62a2303d1a32f617eee629ab514bc6019437/src/ru/piter/fm/player/SmoothMediaPlayer.java
getCurrentPosition()
在 mp4 AAC 文件上的步骤是粗略的:~46 或 ~92ms。因此,为了获得真实位置,我在一个循环中等待,直到值发生变化。- 我不会对下一个玩家调用
seek(2000)
,而是通过静音和运行一段时间来预热 - 当需要切换到下一个播放器时,我会获得尽可能精确的位置,然后休眠,然后恢复静音播放器,再次休眠,然后取消静音。
- sleep 时间根据两个位置和平均恢复延迟计算得出。
在真实设备上,点击会保留,但不那么明显
关于android - 重叠的 mp4 文件的无缝播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23183648/