HTTP自适应比特率流如何在iPhone上运行?

时间:2009-07-01 19:08:16

标签: iphone http video streaming http-live-streaming

Apple已在iPhone OS 3.0中包含HTTP自适应比特流,特别是Safari会自动处理此问题。

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

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

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

  • HTTP自适应比特率流的技术细节是什么,特别是Apple的实现?
  • 最好的实现方式 - HTTP服务器本身的一部分,是脚本中mod的一部分......?

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

3 个答案:

答案 0 :(得分:21)

更新

看起来Apple制定了IETF草案提案,有些人已经在开发分段器了:

HTTP Live Streaming - 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://iphone.akamai.com/

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

  

编码器(或单独的分段器   过程)将产生H.264 / AAC   内容以一系列小内容   段,MPEG-2 TS格式(.ts)。   还有一个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

然后每个其他文件都是:

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

仍然有很多未解决的问题,但这可能已经足够开始了。

答案 1 :(得分:3)

Python + GStreamer中的小玩家http://code.google.com/p/hls-player/

答案 2 :(得分:2)

有关开源编码器和分段器以及其他一些很酷的东西,请参阅此内容:)

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