HTTP 自适应比特率流媒体如何在 iPhone 上工作?
-
21-08-2019 - |
题
Apple 在 iPhone OS 3.0 中包含了 HTTP 自适应比特率流,特别是 Safari 会自动处理此功能。
我想以低成本的方式使用它,但我预计在最坏的情况下它需要一个自定义的 HTTP 服务器,在最好的情况下需要有趣的 PHP/etc 脚本。
但首先我需要知道协议差异或标准是什么。HTTP 作为一种协议相当简单,但自适应比特率意味着文件大小不同、块位置在不同比特率下不同等。例如,客户端在下载流时是否告诉服务器有关流的任何特殊信息,或者全部在服务器端处理?
消除最终用户的缓冲暂停对于实时视频流和预先录制的视频流都非常有吸引力,并且考虑到许多网络和政府都限制非端口 80 流量,通过 HTTP 进行这两种操作甚至更好。
- HTTP 自适应比特率流媒体的技术细节是什么,尤其是 Apple 的实现?
最好在哪里实现 - HTTP 服务器本身的一部分,mod 的一部分,脚本中......?
如果要在应用程序中实现这一点,客户端需要进行哪些更改?
解决方案
更新
看起来 Apple 提出了 IETF 提案草案,并且有些人已经在研究分段器:
HTTP 直播 - Draft-pantos-http-live-streaming-01
http://tools.ietf.org/id/draft-pantos-http-live-streaming-01.txt
使用 FFMpeg 和开源分段器进行 iPhone HTTP 流传输
http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/
看起来 HTTP 服务器只是充当一个愚蠢的 HTTP 服务器。浏览 Akamai 提供的示例网站为我提供了足够的信息来开始静态内容流。
白皮书( http://www.akamai.com/dl/akamai/iphone_wp.pdf )提供有关传输流编码的信息,因此 .ts 流很简单。
编码器(或单独的分段过程)将以MPEG-2 TS格式(.TS)以一系列小内容段(.TS)生成H.264/AAC内容。还有一个M3U8索引文件,引用了这些段。在实时内容的情况下,M3U8将不断更新以反映最新内容。
H.264编码应为单个通用基线配置文件,框架重新排序禁用。建议每5秒提出一次关键帧,理想情况下是所选段长度的均匀分裂。
该网站提供了一个M3U8文件,它只是一个M3U播放列表,但是采用UTF-8字符编码格式。
然后,该文件链接到每个比特率的 M3U8 文件。我认为它们必须在相同的位置进行切换(例如,每 2 秒或 10 秒),这样切换才能无缝进行。它似乎完全是客户端驱动的——客户端决定如何测量带宽以及将获得哪个版本。
主文件的内容是:
#EXTM3U
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=860000
hi/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=512000
med/prog_index.m3u8
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=160000
lo/prog_index.m3u8
然后其他每个文件是:
你好/prog_index.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
#EXTINF:1,
fileSequence4.ts
#EXT-X-ENDLIST
医学/prog_index.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
#EXTINF:1,
fileSequence4.ts
#EXT-X-ENDLIST
lo/prog_index.m3u8
#EXTM3U
#EXT-X-TARGETDURATION:10
#EXT-X-MEDIA-SEQUENCE:0
#EXTINF:10,
fileSequence0.ts
#EXTINF:10,
fileSequence1.ts
#EXTINF:10,
fileSequence2.ts
#EXTINF:10,
fileSequence3.ts
#EXTINF:1,
fileSequence4.ts
#EXT-X-ENDLIST
这适用于 HTML 5 视频标签:
<video width="640" height="480">
<source src="content1/content1.m3u8" />
</video>
仍有很多未解答的问题,但这可能足以开始。
其他提示
以及Python+GStreamer中的小播放器 http://code.google.com/p/hls-player/
请参阅此了解开源编码器和分段器以及其他一些很酷的东西:)