Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/221.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 重叠mp4文件的无间隙播放_Android_Audio_Android Mediaplayer - Fatal编程技术网

Android 重叠mp4文件的无间隙播放

Android 重叠mp4文件的无间隙播放,android,audio,android-mediaplayer,Android,Audio,Android Mediaplayer,是否可以将MediaPlayer输出到原始缓冲区而不是播放设备 有一个互联网电台提供直接下载的媒体文件。例子: -频道2004,2013-11-13 20:31:12 -频道2004,2013-11-13 20:31:13 每个文件的长度为:1:02(重叠2秒) 当前的解决方案是使用两个MediaPlayer实例,一个实例在另一个实例播放时调用prepare(),然后seekTo()跳过2秒。但有时仍能听到差距 相反,我想将音频解码成原始声音,然后再将其组合。我的第一个问题是,2秒是采样级别的2

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

有一个互联网电台提供直接下载的媒体文件。例子: -频道2004,2013-11-13 20:31:12 -频道2004,2013-11-13 20:31:13

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

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


相反,我想将音频解码成原始声音,然后再将其组合。

我的第一个问题是,2秒是采样级别的2秒,还是小于2秒?换句话说,一旦音频被解压并可播放,如果以44.1KHz的频率进行采样,1秒后您将得到44100个样本。因此,2秒将是88200个样本。所以,如果你完成一个文件,开始下一个…你能跳过最后88200个样本,开始播放下一个,它将是无缝的吗?如果没有,那么你可能永远无法让它像你希望的那样完全同步,而不会出现故障,等等

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

总而言之:第一步是确保数据是您认为的数据。第2步是在知道第1步的答案后,实现管理它的机制

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


希望这能有所帮助。

使用两个媒体播放器进行无间隙播放是不可能的,主要是因为在输入
pausedPlayer.start()
和实际播放之间存在不可预测的延迟。延迟甚至可以是负的,因为未授权的玩家跳过了几毫秒

我试图从这里的两个媒体播放器中榨取最多的资源:

  • getCurrentPosition()
    mp4 AAC文件上的步骤非常粗糙:~46或~92毫秒。所以为了得到真实的位置,我在一个循环中等待,直到值改变
  • 我不会在下一个播放器上调用
    seek(2000)
    ,而是通过静音和运行一段时间来预热它
  • 当切换到下一个播放器时,我会得到最精确的位置,然后睡觉,然后恢复静音播放器,再次睡觉,然后取消静音
  • 睡眠时间根据位置和平均恢复延迟来计算

在真正的设备上,咔嗒声持续存在,但不太明显

尾巴和头部的波形略有不同,但这不是问题。当我在一个编辑器中组合这两个原始文件时,听起来很好。当我调用
meadiplayer.start()
时,它有时不会立即启动。我能很好地听到这种差距,所以为了避免这种差距,你需要使用另一种(较低级别)的机制,除非MediaPLayer有一种方法使自己充满活力。我不熟悉安卓系统,所以不知道这一点。