9

Apple 已在 iPhone OS 3.0 中包含 HTTP 自适应比特率流,特别是 Safari 会自动处理这一点。

我想以低成本的方式使用它,但我希望它在最坏的情况下需要自定义 HTTP 服务器,在最好的情况下需要有趣的 PHP/etc 脚本。

但首先我需要知道协议差异或标准是什么。HTTP 作为一种协议相当简单,但自适应比特率意味着文件大小不同,块位置在不同比特率下不同等。例如,客户端是否在下载流时告诉服务器有关流的任何特殊信息,或者它是全部在服务器端处理?

消除最终用户的缓冲暂停对于实时和预先录制的视频流都非常有吸引力,并且鉴于许多网络和政府正在限制非端口 80 流量,通过 HTTP 进行这两种操作甚至更好。

  • HTTP 自适应比特率流的技术细节是什么,尤其是 Apple 的实现?
  • 这在哪里实现得最好 - HTTP 服务器本身的一部分,mod 的一部分,在脚本中......?

  • 如果要在应用程序中实现这一点,客户端需要进行哪些更改?

4

3 回答 3

21

更新

看起来 Apple 提出了 IETF 草案提案,并且有些人已经在研究分段器:

HTTP 直播流 - draft-pantos-http-live-streaming-01
http://tools.ietf.org/id/draft-pantos-http-live-streaming-01.txt

iPhone HTTP 流与 FFMpeg 和开源分段器
http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/


看起来 HTTP 服务器只是充当一个愚蠢的 HTTP 服务器。浏览 Akamai 提供的示例网站为我提供了足够的信息来开始使用静态内容流。

http://iphone.akamai.com/

白皮书 ( http://www.akamai.com/dl/akamai/iphone_wp.pdf ) 提供了有关传输流编码的信息,因此 .ts 流很简单。

编码器(或单独的分段器进程)将以 MPEG-2 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

med/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>

还有很多未解决的问题,但这可能足以开始。

于 2009-07-01T19:47:03.760 回答
3

还有一个 Python+GStreamer 中的小播放器http://code.google.com/p/hls-player/

于 2010-01-15T11:59:55.950 回答
2

看到这个开源编码器和分段器以及其他一些很酷的东西:)

http://www.ioncannon.net/programming/452/iphone-http-streaming-with-ffmpeg-and-an-open-source-segmenter/

于 2009-07-29T04:28:25.037 回答