iphone - HTTP 自适应比特率流式传输如何在 iPhone 上工作?

标签 iphone http video streaming http-live-streaming

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

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

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

消除最终用户的缓冲暂停对于直播和预录视频流都非常有吸引力,并且考虑到许多网络和政府正在限制非端口 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://iphone.akamai.com/

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

The encoder (or a separate segmenter process) will produce H.264/AAC content in a sequence of small content segments, in MPEG-2 TS format (.ts). There is also an M3U8 index file that references the segments; in the case of live content the M3U8 is continuously updated to reflect the latest content.

H.264 Encoding should be single-pass Baseline Profile, frame re-ordering disabled. Key frames are suggested every 5 seconds, ideally an even divisor of the chosen segment length.

该网站提供了一个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>

还有很多 Unresolved 问题,但这可能足以开始。

关于iphone - HTTP 自适应比特率流式传输如何在 iPhone 上工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1070800/

相关文章:

html - 使用 CSS 将视频替换为静态图像

iphone - UINavigationController 导航栏在横向模式下不会缩小

iphone - 滚动时 UITableView 应用程序崩溃

python - Flask 更新 SQLite 记录

C编写的HTTP服务器在回复后重置连接

java - 使用 matlab 或 java 的 144Hz 监视器的高帧率问题

iPhone 表格 View 滚动中止 - 无法识别的选择器

iphone - 如何在 objective-c 中使用属性的实际示例?

iphone - HTTP POST JSON 方法

mysql - 如何使用mysql将视频存储在数据库中?