适用于 iPhone 的 HTTP 实时流式传输
Posted
技术标签:
【中文标题】适用于 iPhone 的 HTTP 实时流式传输【英文标题】:HTTP Live Streaming for IPhone 【发布时间】:2010-02-07 20:13:48 【问题描述】:我正在关注 Apple 在 https://datatracker.ietf.org/doc/html/draft-pantos-http-live-streaming-01 中的提议。 尝试对我的 iPhone 进行虚拟 HTTP Live Streaming,我用 Django 编写了一个 Web 服务,对应于一个 .m3u8 文件。我开始回复
#EXTM3U
#EXT-X-TARGETDURATION:#10
#EXT-X-MEDIA-SEQUENCE:#0
然后我在响应中写入片段的 URL(6 个片段,每个片段 10 秒):
#EXTINF:10,
http://...../sample_low-1.ts
...
仅此而已。我每分钟都会更改包含片段 URL 的部分,所以理论上我期待持续的直播。
但是,当我使用 iphone 检查流时,我观察到以下情况:
手机连接到 ...m3u8 ,获取其内容,开始下载 .ts 文件并开始播放视频。然后,在下载第 6 段(.m3u8 中的最后一段)后,它到达文件末尾,没有看到
EXT-X-ENDLIST
并搜索新的 .m3u8。此时新的 .m3u8 已在服务器上准备就绪,因为我每 60 秒更新 .m3u8 的内容。
但是,手机暂停,我无法在手机上实现连续流。
所以,显然我在某个地方犯了一个大错误。非常欢迎任何帮助和建议。
编辑:事实证明递增媒体序列有效。
【问题讨论】:
【参考方案1】:如何发回响应?
如果你return
Django 响应对象,那么服务器只是简单地发送一个包含六个段的响应,然后会静静地坐着,等待来自客户端的新请求。
如果你想从服务器连续发送数据,你应该改为yield
结果,并使用某种同步,这样你就确定你不会一遍又一遍地发送相同的数据。
【讨论】:
我返回 Django 响应对象,其中包含我在原帖中提到的内容。但是,我认为这是我应该做的,只需定期更改 .m3u8 索引文件即可。我错了吗? 如果使用“return”关键字,则响应完成,Django 将等待来自客户端的新请求。另一方面,如果您使用“yield”关键字,则响应不完整,Django 将继续向客户端提供新数据,直到您停止它,或者直到连接断开。以上是关于适用于 iPhone 的 HTTP 实时流式传输的主要内容,如果未能解决你的问题,请参考以下文章
使用 Apple mediastreamsegmenter 的 HTTP 实时流式传输