减少 HLS 流 FFMPEG 的延迟

Reduce Latency For HLS Streaming FFMPEG

我通过 ffmpeg 使用 hls 流。
流式传输开始时存在几秒钟的延迟。
当我想在非常延迟的情况下从流中的 4k 视频中进行 straming 时。
我能做什么?

这很可能是播放器在开始播放之前用足够的内容填充了缓冲区。

您可以使用 'hls_time' 减小视频片段的大小,这样每个片段的下载速度会更快,但这会向您的服务器发出更多的 HTTP 请求。此外,您可以使用 'hls_init_time' 减少第一段,并保持其他段不变。

http://ffmpeg.org/ffmpeg-all.html#hls-1

hls_init_time seconds Set the initial target segment length in seconds. Default value is 0. Segment will be cut on the next key frame after this time has passed on the first m3u8 list. After the initial playlist is filled ffmpeg will cut segments at duration equal to hls_time

hls_time seconds Set the target segment length in seconds. Default value is 2. Segment will be cut on the next key frame after this time has passed.

另一种选择是减少播放器开始播放前所需的缓冲量。我不确定你用的是什么播放器,但大多数都有这个选项。

4k video

...

In start of streaming delay exists for few seconds

是的,当然可以。缓冲足够的数据以播放非常高的比特率需要时间。不仅如此,您的 HLS 播放器通常在解码开始之前需要一些片段。正如@iangetz 所说,您可以减少段的长度,但现在由于所有额外的 HTTP 请求,您将有更多的开销。

Reduce Latency For HLS Streaming

不要使用 HLS。 HLS 和任何其他分段流式传输协议(如 DASH)均针对低延迟进行了优化。它针对 HTTP CDN 的重用、可以在网络变化(例如当您从 WiFi 转到 LTE 时)以及客户端可选择的(通常是动态的)质量进行了优化。

分段协议的本质要求将相对较大的缓冲区分块,然后单独上传到 server/CDN。这确实很有用,但如果您需要低延迟,则不是一个好的权衡。

如果延迟对您很重要,那么您需要一种完全不同的技术。看看 WebRTC。有了这项技术,实时视频流、编解码器针对延迟而不是质量进行了优化,并且降低了可靠性以支持延迟。它还需要对分销基础设施进行大量投资。

我无法想象这样一种情况,即关心 4k 视频的人认为降低质量值得为低延迟进行权衡。你不可能拥有你想要的一切......你必须选择对你真正重要的东西并从那里优化。如果你想要低延迟,你将不得不降低你的质量,并在基础设施上花费大量的金钱和时间来支持这项工作。如果你想要高质量和可靠的流,你可以在现有的基于 HTTP 的 CDN 上使用 DASH(或 HLS)分发时保持良好的编码参数。

现在有 low latency HLS in ffmpeg. Whilst the 'community' Low Latency (LHLS) is currently supported, in one of the main HLS players (hls.js) there are moves to deprecate it in favour of Apple's latest evolution of their Low Latency HLS 的特定选项。