我正在尝试将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 *持续时间),但我仍然遇到提到的播放问题。
有关如何实现流畅播放的任何想法/策略?
答案 0 :(得分:1)
基本策略或多或少如下。
首先处理清单文件并下载前几个段以填充缓冲区。一旦您感到高兴,在缓冲区中有足够的数据,您就会开始播放,同时继续按顺序下载其他段,直到清单结束,此时您再次请求它。如果在刷新的清单中找到新段,则将这些URL添加到下载队列中。如果不这样做,则等待一段预定的时间并再次刷新清单。例如,您的客户可以根据(段的总持续时间*段数/ 2)轮询M3U8清单。
我知道当播放缓冲区变低并且刷新的清单不包含任何要下载的新段时,一些商业播放器会进入偏执模式。在这种情况下,他们会更频繁地开始请求更新的清单。
您还需要注意客户端和HTTP服务器之间的内容缓存。例如,某些CDN会将清单文件缓存一段最短的强制性时间,因此如果您尝试在此期间内请求清单文件,则可能会收到一份陈旧的清单文件。
从上面的例子中(我希望它只是在你的手工制作的例子中),每个片段的持续时间似乎是1秒,这是非常低的。如果确实如此,您可能需要相应地调整初始缓冲区。
最后,我假设您已经使用稳定的播放器验证了源流,以确保问题不在另一端?
- ab1