2

我正在尝试将 HTTP 实时视频流保存到文件中。我知道为此目的,我需要定期请求 M3U8 文件,解析它以提取媒体片段的 URL,下载片段并重新组合它们。我遇到的问题是找到正确的策略来实现流畅的播放。重新组装的视频总是断断续续,音频跳过等......只有前几秒钟还可以。

我的 M3U8 文件如下所示:

#EXTM3U
#EXT-X-TARGETDURATION:2
#EXT-X-VERSION:3
#EXT-X-ALLOW-CACHE:NO
#EXT-X-MEDIA-SEQUENCE:1105
#EXTINF:1.00000,
tmp/video1.ts
#EXTINF:1.00000,
tmp/video2.ts
#EXTINF:1.00000,
tmp/video2.ts
#EXTINF:1.00000,
tmp/video3.ts
#EXTINF:1.00000,
tmp/video4.ts
#EXTINF:1.00000,
tmp/video5.ts

解析文件后,我开始下载所有 TS 文件(一次一个),当我要下载倒数第二个时,我请求一个新的 M3U8 文件。这是错的吗?也许服务器还没有更新段?因此,我要重新下载相同的?在请求新的播放列表之前,我尝试等待 5 秒(number_of_videos * 持续时间),但我仍然遇到提到的播放问题。

关于如何实现流畅播放的任何想法/策略?

4

1 回答 1

1

基本策略或多或少如下。

您首先处理清单文件并下载前几个段以填充缓冲区。一旦您对缓冲区中有足够的数据感到满意,您就开始播放,同时继续按顺序下载其他段,直到清单结束,此时您再次请求它。如果您在刷新的清单中找到新的片段,则将这些 URL 添加到您的下载队列中。如果不这样做,则等待一段预定的时间并再次刷新清单。例如,您的客户端可以根据(段的总持续时间 * 段数 / 2)轮询 M3U8 清单。

我知道当播放缓冲区变低并且刷新的清单不包含任何要下载的新段时,一些商业播放器会进入偏执模式。在这种情况下,他们开始更频繁地请求更新清单。

您还需要注意在客户端和 HTTP 服务器之间缓存内容。例如,一些 CDN 会在最短的强制时间段内缓存清单文件,因此如果您尝试在此期限内请求它,您可能会收到一个陈旧的清单文件返回给您。

从你上面的例子(我希望它只是在你手工制作的例子中),每个片段的持续时间似乎是 1 秒,这是相当低的。如果确实如此,您可能需要相应地调整初始缓冲区。

最后,我假设您已经使用稳定的播放器验证了源流,以确保问题不在另一端?

-- ab1

于 2013-09-17T11:49:23.120 回答