我正在尝试将HTTP实时视频流保存到文件中。我知道,为了这个目的,我需要定期请求M3U8文件,解析它以提取媒体片段的URL,下载这些片段并重新组合。我遇到的问题是找到正确的策略来实现流畅的回放。重新组装的视频总是起伏不定,音频跳过etc...only的头几秒钟是正常的。
我的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 * duration),但仍然遇到上述播放问题。
关于如何实现流畅播放,您有什么想法/策略吗?
发布于 2013-09-17 19:49:23
基本策略大致如下。
首先处理清单文件,然后下载前几个段来填充缓冲区。一旦您满意缓冲区中有足够的数据,您就开始回放,同时继续按顺序下载其他段,直到清单结束,此时您再次请求它。如果在刷新的清单中发现新段,则将这些URL添加到下载队列中。否则,您将等待一段预定的时间,然后再次刷新清单。例如,您的客户端可以根据(段的总持续时间*段的数量/ 2)来轮询M3U8清单。
我知道一些商业播放器进入偏执模式时,播放缓冲区越来越低,刷新的清单不包含任何新的片段下载。在这种情况下,他们开始更频繁地请求更新的清单。
您还需要注意客户端和HTTP服务器之间的内容缓存。例如,一些CDN会将清单文件缓存一段最短的强制时间段,因此,如果您尝试在此时间段内请求该文件,您可能会得到一个陈旧的清单文件。
从你上面的例子(我希望它只是在你手工制作的例子中),每个片段的持续时间似乎是1秒,这是相当低的。如果确实如此,您可能希望相应地调整初始缓冲区。
最后,我假设你已经用一个稳定的播放器验证了源码流,以确保问题不在另一端?
-- ab1
https://stackoverflow.com/questions/17141963
复制相似问题