适用于 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 实时流式传输

将 iPhone 摄像头实时流式传输到媒体服务器的最佳方式是啥?

如何实时流式传输音频文件

从 URL 实时流式传输音频的 RadioKit 替代方案

iPhone 6S 在流式传输时出现音频问题

在移动浏览器上流式传输/播放音频文件