icecast audio.js没有缓冲

时间:2014-10-28 14:05:37

标签: javascript html5 audio latency icecast

我在服务器上运行了一个icecast设置。将要连接到它的客户端是网页中的标签,通过HTML5或Flash。我目前正在使用audio.js来实现这一目标(特别是flash后备)。

问题是,音频正在同时播放,但与图像流分开播放。 (这是一个10-fps的jpeg流。)我需要音频尽可能地与图像匹配。不幸的是,音频有时会在开始播放前延迟7秒钟。

一些信息:

  • 无法延迟图像流以匹配音频。音频必须加速以匹配图像。
  • icecast服务器配置将<burst-on-connect>设置为0以最大程度地减少延迟。
  • 通过VLC播放时基本上没有延迟(可能是几百毫秒,这是可以接受的)。

换句话说,当查看图像并通过vlc播放音频时,一切都充分对齐。不幸的是,在最后阶段使用VLC不是一个选项。

由于VLC没有延迟,这告诉我网络浏览器(Chrome,firefox,IE)在播放之前正在缓冲音频。

问题:如何阻止网络浏览器缓冲音频?我希望它在有任何可用的东西后立即播放。我目前正在使用audio.js,但其他类似技术也是可以接受的。

附加信息:我已将audio.js设置为autoplay,preload = none。

感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

缓冲区始终是必需的。网络是分组交换的。数据是块状的,而不是连续的。事实上,有很多缓冲区:

  • 捕获缓冲区(在声卡上)
  • 编解码器缓冲区(编解码器一次处理一大块样本)
  • 网络缓冲区到服务器
  • 服务器端缓冲区(通常非常大,10秒以上)
  • 网络缓冲区到客户端
  • 客户端缓冲区(通常为2-3秒)
  • 客户端编解码器缓冲区
  • 客户端声音设备缓冲区

正如您所注意到的,每个缓冲区都会增加延迟。您实际控制的唯一缓冲区是服务器端缓冲区,它由<burst-on-connect>设置配置。通过将此缓冲区的大小设置为更大的大小,您可以非常快速地填充所有下游缓冲区,从而实现极快的回放开始。您已将此值设置为零,这意味着下游缓冲区只能填充数据从编码器进入的速度。

客户端,你完全无法控制缓冲,也不应该。客户可以以他们选择的任何方式自由地实现编解码器。一些编解码器可以立即开始流式传输,而其他编解码器则无法开始流式传输。有些设备必须重新对您的音频进行重新采样以适应其播放,其他设备则不会。

您真正想要做的是同步视频流和音频流。为此,您应该只是流式传输视频流。视频用于保持音频和视频同步。 Icecast甚至支持几种格式的流媒体视频。