(原文地址)
https://developer.apple.com/library/ios/#documentation/networkinginternet/conceptual/streamingmediaguide/Introduction/Introduction.html
为了能够搭建好一个HTTP Live Streaming 的服务,你需要下载几个相关的软件。这些工具包括文件流切割器,文件切割器,文件流验证器,一个ID3的标签生成器,和一个播放列表生成器。
由于工具也是在不停的更新,因此你需要通过官方网站下载和HTTP Live Streaming相关的最新版本的工具。最直接的一种下载方式就是访问“connect.apple.com ”然后登陆你的账户,进行搜索下载工具。
mediastreamsegmenter 这个命令行工具能够接受MPEG-2类型的数据流,然后会产生一系列对等长度的片文件。从而能够在HTTP Live Streaming中使用。同样他也产生了一个索引播放列表文件。加密的媒体文件,和相关的密钥信息。你可以通过Man mediastreamsegmenter在命令行模式下获取更多信息。
示例:
mediastreamsegmenter -s 3 -D -f /Library/WebServer/Documents/stream 239.4.1.5:20103
如上的这个示例表示切割器从一个网络的视频捕获器中获取数据流 239.4.1.5:20103 (IP+端口),然后通过传递进来的数据流进行切割。其中切割的片段为3S一个区间,当媒体片段文件使用完成之后就会被删除(-D),这个过程产生的索引播放列表文件和切割之后的媒体片段文件保存在 /Library/WebServer/Documents/stream. 目录下面。
mediafilesegmenter 这个命令可以把一个文件进行一个切割,但是这个文件必须要是MPEG-2编码格式的文件。然后就会生成一系列的媒体片文件和索引播放列表文件。其实文件切割器就如同文件流切割器是一样的,只是数据源不一样。你可以通过man mediafilesegmenter 这个命令获取更多的信息.
通过mediastreamvalidator 这个命令你可以对已经生成好的切割片文件和播放列表文件进行一个验证。你可以测试一个已经发布到网络服务器上的文件是否能够正常工作。
你可以通过man mediastreamvalidator 获取更多的使用信息。
你可以使用variantplaylistcreator 这个命令创建依据不同字节率而产生的索引文件了播放列表文件。在生成切割文件的时候必须声明一个-generate-variant-playlis 的参数来创建切割的文件。你可以通过man variantplaylistcreator 获取更多的使用信息。
通过id3taggenerator 这个命令可以帮你生成ID3的元数据标签,这些标签可以写进一个文件,或者是一个编码流切割文件中去。你可以通过如下小节"Adding Metadata"来进行获取更多信息。
HTTP Live Streaming 的协议支持在线直播的会话,或者是在线点播的会话(VOD)。这个会话生命周期能够记录一次完整的事件过程,或者作为一个优先的窗口,用户能够在一定的时间内进行一个观看。
对于直播时的会话生命周期,当一个新的视频片文件生成的时候,这个索引文件就会更新。这个最新的索引文件罗列了最新添加的切割片文件。老的切割片文件将会从索引文件中移除。从而达到一个视频流畅的播放的目的。另外,这个索引文件也可以添加新的切割片文件到已经存在的索引文件列表中。同样这种操作也适用于在线点播(VOD).
对于在线点播的生命周期,媒体文件将会在这个有效的周期中呈现。这个索引文件时静态的,不可更改的,包含了所有需要播放的文件。这种形式能够让客户端获取一个完整的流。
对于创建一个在线直播的应用是非常有必要性的。为了把一个在线直播转化成在线点播的形式,仅仅所需要做的就是在直播的同时不会移除老的切割片文件或者索引文件。而是采用在索引文件中添加 #EXT-X-ENDLIST 这个标签来表示直播或者点播结束。这样就可以让那些客户端能够在直播都开始进行之后还能看到之前的文件信息。这样,当直播的信息完成之后我们仍然可以再次的进行一个播放,而不需要额外的操作。
切割完成之后的数据片文件一般是需要进行一个加密的过程的。在采用加密的时候,通过索引中的密钥文件来解密并且获取相对应的视频片文件。
当一个密钥文件出现在索引文件中,这个密钥文件必须包含一个密码钥匙,用于解密随后的媒体文件中列出的索引文件。对于当前,HTTP Live Stream 支持AES-128来进行加密,长度为16个字节。密钥文件的格式是由一个16字节数组的包装起来以二进制形式存储下来。
媒体流分段程序可以通过苹果提供加密和所支持的三种配置加密的方式来操作。
l 第一种模式可以让你指定一个当前密钥文件存在的路径,这种模式下,切割器将会把密钥文件的URL插入到索引文件中去,将会把所有的媒体分段程序通过一个key来进行加密。
l 第二中模式是通过切割器来生成一个随机的Key文件并把它保存在一个指定的路径下面。然后再索引文件中添加它的引用。所有的媒体流分段程序都会根据这个随机生成的Key来进行一个机密的动作。
l 第三种模式是根据一个指定媒体分段程序的数量,然后来随机生成一个Key文件,然后并保存在一个指定的路径下面。这种模式会让有n个加密文件,每个文件来对一组流媒体分段程序进行一个加密。
注意 所有的媒体流分段程序都可以使用同一个密钥进行加密。或者是一组新的密钥。通常理论上将是针对一个媒体文件一个密钥,但是由于每一个密钥在请求和传递的时候都会有开销,因此按照时间来产生密钥相对于根据每一个媒体分段程序来生成密钥的开销要小很多。
你可以通过HTTP或者HTTPS来进行密钥文件的传递,你也可以选择通过你自己的一种会话认证方式来进行传递。你可以参考“Serving Key Files Securely Over HTTPS.” 进行进一步的处理。
我们通常建议通过HTTPS来进行密钥文件的传递,同理也建议对于索引文件或媒体流分段程序也采用这种形式。但是这种形式并不利于扩展。由于HTTPS请求通常会绕过web服务器的缓存,常常会导致绕过EDGE网络直接路由到你的服务器上去。
对于这种情况,我们就需要做均衡考虑,当对于在线直播这种方式的时候,我们通常是要随时更新".M3U8"索引播放文件的,这样我们就不需要缓存的产生。
一个主索引文件通常包含了各种不同速率的子索引文件。这样就可以提供多种不同速率的文件播放效果。但是呢这个一般要考虑到带宽的问题。HTTP Live Streaming提供根据带宽动态切换不同速率的文件信息。
如下图是主索引文件指向交替流媒体索引文件在导向流媒体片文件,如图2 - 1所示
Figure 2-1 Stream alternates
主索引文件和不同速率的子索引文件都是以".M3U8"的形式存在的,这个主索引文件一般都是下载一次,但是对于直播类型的的,这个主索引文件是在随着时间的变化不停的更新。
在主文件中罗列的第一个速率一般是客户端最先选用的速率,然后会随着时间根据带宽自动选择相应的速率文件。
需要注意的是客户端能够在任意时间来选择任何的一个速率,比如说当一个终端设备在进入或者离开一个wifi热点的时候能够平滑的进行一个速率的切换。
你可以通过variantplaylistcreator这个命令,并且制定-generate-variant-playlist 一个选择项来进行文件的切割或者文件流的切割。
当使用速率来自动切换的时候你需要注意如下几个问题。
l 由于第一个子索引文件一般是用来进行一个播放速率测试的,其他的几个不同速率的播放顺序可以不用考虑。
l 通常情况下如果可能的话,为了更好的提供用户体验,请尽量提供如下几个中速率的编码格式,150 kbps, 350 kbps, 550 kbps, 900 kbps, 1500 kbps.
l 如果可能的话请尽量在子索引文件中使用一个相对路径。
l 音频音轨在所有速率下都应该是完全相同的
注意当你需要同步不同的点播视屏流的时候,你需要拷贝音频的音轨然后再粘贴到其他的媒体文件中。这个操作应该是在切割之前,压缩之后。
l 视频的比例大小不应该随着速率的变化产生变化,应该前后保持一致。但是可以有不同的像素尺寸交替进行,例如说,两个不同速率的视频流应该有4:3相同的比例大小,尺寸可以是400X300或者800X600。
l 如果你是iOS的开发者,你可以通过获取用户的设备信息,然后向用户提示是否采用蜂窝煤数据通道还是WIFI数据通道然后根据主索引文件进行视频的获取。
为了让用户在一开始的时候有一个更流畅的用户体验,你应该最多个主索引文件包含着相同的子索引文件,只是这些索引文件所放的位置不一样。(备份)
对于蜂窝煤类型的数据通道,我们一般建议是150K的流。
对于Wi-Fi类型的我们一般建议是240k或者440k
如何查询ios系统的设备的网络连接类型,参见下面的示例代码 :Reachability.
当你申明了一种比特率的时候,BANDWIDTH 这个属性应该非常的接近你所提供的一个流的比特率。如果实际的带宽和你自己所指定的带宽有很大区别的话,那么自动的切割比特率的时候就会出现不平滑的现象。
当你给一个iPhone或者iPad推送视频信息的时候,这些终端的网络可能是处于蜂窝网络下的。HTTP Live Streaming 允许终端在网络频道更换的时候选择不同速率的视频信息。提供做完美的体验。例如在3G和EDGE网络下,如果你是在下载过程中的话你会有很明显的体验。
我们强烈的建议你在推送你的视频数据的时候才用HTTP Live Streaming 进行传递。即使是在蜂窝煤的网络通道下面也没有什么问题。
总之,挡在蜂窝煤的网络通道下面,你最好才用64Kbps速率或者更小的来进行一个传输。如果你不能够提供相匹配的速率的视频的话,那么你就最好的只提供音频或者图像。
对于蜂窝煤的通道,我们觉得400x224 16:9或者是400x300 4:3这样的尺寸是比较好的。
如果你想了解更多,请参考Preparing Media for Delivery to iOS-Based Devices”.
如果你的app是在蜂窝煤的通道下进行视频的传输的话,那么这个视频不能超过10分钟或者5M在每5分钟的阶段中。而且是必须要使用HTTP Live Streaming.
如果你是在蜂窝煤通道下使用HTTP Live Streaming,你至少要提供一个64Kbps或者少于他的比特视频流信息,或者仅仅是音频或者仅仅是图片。
如果你不遵循上面的几个原则的话,你的应用肯定会审核不通过的。
如果你的索引播放文件包含了几种不同比特数据流的话,他们不仅仅要考虑带宽的问题,设备的问题,还要考虑故障发生之后的回滚问题。在iOS3.1以后,客户端设备如果不能够从新加载索引文件比如说当产生404类似的错误,那么这个时间就应该自动的尝试切换到其他的视频比特流频道下。
如果在获取索引文件失败的时候,这个客户端就会根据当前网络所支持的最高带宽来选择匹配的流文件,如果在这个带宽下有多个,那么客户端会按照顺序依次尝试。
为了很好的处理产生故障时候的问题,我们需要创建或者自动生成一个主索引文件。然后再把相关的信息添加进去。如下做了一个简短的实例,APPHA是主服务器,BETA是备份服务器
#EXTM3U |
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000 |
http://ALPHA.mycompany.com/lo/prog_index.m3u8 |
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=200000 |
http://BETA.mycompany.com/lo/prog_index.m3u8 |
|
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=500000 |
http://ALPHA.mycompany.com/md/prog_index.m3u8 |
#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=500000 |
http://BETA.mycompany.com/md/prog_index.m3u8 |
您可以给媒体流段添加各种类型的元数据。例如,您可以添加的专辑,艺术家的名字,和歌曲的标题至音频流。或者你可以根据你自己的喜好添加任何信息,比如说你喜欢的棒球的名字等等。
如果你想在音频文件中添加一个图片作为标签,从而让apple的客户端设备能够自动的展现他。那么目前客户端还是只能提供识别图片和音频流同时存在的方式。
如果你是自己实现这个客户端软件,那么无论你使用的是MPMoviePlayerController 或者AVPlayerItem 的话,你都是可以利用timedMetaData 这个属性来获取到这个标签的。
我们可以一个事件的偏移量可以给这个地方插入一个源数据标签。这个源数据标签可以是一个ID3类型的文件或者是一个图像(JPEG或者PNG).
通常对于直播类型的数据流,我们需要使用id3taggenerator 这个工可以帮助我们生成ID3类型的源数据,然后把它传递给我们的流文件切割器进行一个整合。
Tag 生成器一边是来自一个Shell 脚本文件。例如,在我们一个设定的时间点添加一个标签,新的元数据标签将会添加进去即使在某个点已经有了标签。
一旦这个源数据标签添加进去了,那么他就是永久的,就好比说一个直播类型的的视频,我们添加了一些标签,那么这些标签也是依然存在,当我们再次回放的时候。
对于已经存在好的视频文件进行标签的添加是比较复杂的,我们一般需要用到如下几步。
一、首先,你需要生成一个源数据的实例,你可以利用id3taggenerator 这个小工具来生成ID3的源数据,然后再生成到一个指定的文件中。
二、然后,创建一个metadata macro file ,这个文件的每一行都包含一个事件来添加一个源数据,还有源数据的类型。如下例子,表示在1.2秒的时候添加一个图片标签,
在第10秒的时候添加一个ID3类型的标签。
1.2 picture /meta/images/picture.jpg
10 id3 /meta/id3/title.id3
三、最后,给你的这个文件指定一个名字,这样你在使用切割器进行文件切割的时候就能引入这个文件。一般是采用"-M"你可以采用man, mediastreamsegmenter, mediafilesegmenter, id3taggenerator 获取更多的用法信息。
HTTP Live Streaming 可以支持添加隐藏字幕信息。
隐藏式字幕不应混淆字幕。
如果你是采用文件流切割器,你需要为MPEG-2的传输编码数据流添加CEA-608的隐藏字母,依据ATSC A/72 的规定
如果你是采用文件切割器,你应该先把你的文件压缩成QuickTime 电影的文件形式,然后再添加隐藏的字幕信息。
通常我们可以采用Compressor来对MPEG-2的文件或者电影文件进行添加隐藏字母。如果你需要了解更多信息,你需要参考Compressor 的使用手册。
你过你想给你自己写一个工具,那么你就需要采用AVFoundation 这个框架包来实现。
如下表是我们推荐针对不同的iOS设备提供的编码格式。对于直播类型的,这个应该是需要你的硬件和软件一起合作进行编码支持的。如果你想从一个主索引文件来对视频进行从新编码,那么你就需要用到一个工具Compressor 。
对于文件切割器,你可以提供MPEG-4,MP3或者QuickTime的数据。
对于文件流切割器,目前支持MPEG-2的数据,通常你需要使用如下形式进行编码。
l 对已视频文件进行H.264形式的压缩
一、iPhone 3G以后的产品,或者iPod touch以后的产品,都支持最新H.264的压缩格式,如果你的应用在更老以前的平台上面跑,你应该采用3.0的H.264进行压缩。
l 对于iPad,Apple TV2,iPhone 4,你可以使用 Baseline profile 3.0,Baseline profile 3.1 ,Main profile 3.1 来进行压缩,
需要注意一点的就是 Baseline profiles 压缩方式和Main profiles 是不一样的。iPhone和iPod Touch是采用Baseline profiles,iPad 和Apple TV是采用Baseline profiles或者Main profiles 方式。一般我们对对大屏幕的设备都是采用Main profiles 这种方式。而Baseline profiles一般都是针对小屏幕的设备。
l 我们一般建议10 帧fps建议视频流格式在200 kbps ,对于视频流格式在300kbps,我们一般建议12到15帧fps,对于其他的,我们建议在29.97
l 对音频文件进行编码,我们可以采用如下形式。
一、 HE-AAC or AAC-LC, stereo
二、MP3 (MPEG-1 Audio Layer 3), stereo
l 建议在所有的情况下音频采样率为22.05千赫和音频比特率40 kbps。
iPhone, iPod touch, iPad, and Apple TV, 长宽比为16:9
网络 尺寸 总比特率 视频比特率 关键帧
Cellular |
480 x 320 |
64 kpbs |
audio only |
none |
Cellular |
480 x 224 |
150 kpbs |
110 kbps |
30 |
Cellular |
480 x 224 |
240 kpbs |
200 kbps |
45 |
Cellular |
480 x 224 |
440 kpbs |
400 kbps |
90 |
WiFi |
640 x 360 |
640 kpbs |
600 kbps |
90 |
iPhone, iPod touch, iPad, and Apple TV, 长宽比为4:3
Cellular |
480 x 320 |
64 kpbs |
audio only |
none |
Cellular |
480 x 300 |
150 kpbs |
110 kbps |
30 |
Cellular |
480 x 300 |
240 kpbs |
200 kbps |
45 |
Cellular |
480 x 300 |
440 kpbs |
400 kbps |
90 |
WiFi |
640 x 480 |
640 kpbs |
600 kbps |
90 |
对于16:9比例的Ipad,Apple TV 额外的解码
WiFi |
640 x 360 |
1240 kpbs |
1200 kbps |
90 |
WiFi |
960 x 540 |
1840 kpbs |
1800 kbps |
90 |
WiFi |
1280 x 720 |
2540 kpbs |
1500 kbps |
90 |
WiFi |
1280 x 720 |
4540 kpbs |
4500 kbps |
90 |
对于4:3比例的Ipad,Apple TV 额外的解码
|
|
|
|
|
WiFi |
640 x 480 |
1240 kpbs |
1200 kbps |
90 |
WiFi |
960 x 720 |
1840 kpbs |
1800 kbps |
90 |
WiFi |
960 x 720 |
2540 kpbs |
2500 kbps |
90 |
WiFi |
1280 x 960 |
4540 kpbs |
4500 kbps |
90 |
iOS version 3.0 or later to play these samples on your iPhone or iPod touch. Safari 4.0 or later
http://devimages.apple.com/iphone/samples/bipbopgear1.html
http://devimages.apple.com/iphone/samples/bipbopgear2.html
http://devimages.apple.com/iphone/samples/bipbopgear3.html
http://devimages.apple.com/iphone/samples/bipbopgear4.html
http://devimages.apple.com/iphone/samples/bipbopall.html