多协议、性能稳定、丰富API的流媒体服务器软件
如何为Apple HLS创建一个只有I帧的播放列表?
iOS 5 的原生播放器支持快进快退,同时这个功能并不需要你对视频内容文件做特殊的处理,你要做的仅仅是告诉播放器I帧的位置。I帧,也就是intra-coded frames,它的编码不依赖于任何其它帧。要设置I帧的位置,iOS 5支持了只有I帧的HLS播放列表。 在HLS版本 4开始,EXT-X-I-FRAMES-ONLY tag 用来指明在播放列表中的每一个切片都只有I帧。

只有I帧的播放列表和常规的播放列表基本一样。唯一的区别是I帧的播放列表没有一个固有的播放时长,相反,它是两个I帧之间的时间间隔。如果到了最后一个I帧,那这个长度就是从这个I帧开始到视频的结束。 在只有I帧的播放列表中,采用EXT-X-I-FRAMES-ONLY tag来说明,EXTINF tag 是I帧的间隔时长。 这个时长是紧挨着的两个I帧之间的时长(或者是播放列表中最后一个I帧到视频结束的时长)。

注意:
  • I帧播放列表需要HLS 4以上的版本。默认设置下,Wowza Streaming Engine™ 软件使用的HLS版本是3。请阅读如何修改EXT-X-VERSION的版本? 来修改Wowza使用的版本

  • I帧播放列表仅适用于VOD业务。

配置


要使用I帧播放列表,在你的VOD Application中添加以下自定义参数。请阅读Wowza的配置参数 以了解如何为你的应用添加自定义参数的细节信息。

Path
Name
Type
Value
Notes
/Root/Application/HTTPStreamer cupertinoExtXVersion Integer 4 可以在HTTP Streamers Cupertino Settings 部分来设置(默认值: 3).
/Root/Application/HTTPStreamer cupertinoCreateKeyFrameOnlyPlaylist Boolean TRUE 必须作为一个自定义参数来设置 (默认值: FALSE).

cupertinoExtXVersion参数必须被设置为4或以上,I帧的播放列表才会生效。Wowza Streaming Engine 现在支持到版本6。

cupertinoCreateKeyFrameOnlyPlaylist 参数会启用只有I帧的播放列表,这样使得Apple终端的原生播放器可以在播放VOD时进行快速的定位。 这时,播放器在全屏状态下的屏幕底部会显示一个快进和快退的按钮。按住这些按钮将会使用只有I帧的播放列表来进行快速定位。快速点击这些按钮将跳过视频的开始或结束。

如果只有I帧的播放列表功能没有生效,你将会在播放器上看到默认的按钮,它允许你每次快进或快退30秒。www.ttstream.com

在原生播放器顶端的scrub bar 不支持只有I帧的播放列表,因此拖拽scrub bar进行定位时,将使用标准的播放列表,它会允许你拖拽到视频流的特定位置上。

播放列表看起来如下。你可以用curlwget 来检测这个播放列表:
curl http://localhost:1935/vod/mp4:sample.mp4/playlist.m3u8

#EXTM3U
#EXT-X-VERSION:4
#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=572079,CODECS="avc1.42c01e, mp4a.40.2",RESOLUTION=424x240
chunklist_w1616510757.m3u8
#EXT-X-I-FRAME-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=215,CODECS="avc1.42c01e",URI="chunklist_w1616510757_ko.m3u8"
		
如果你检查一下这个m3u8文件,你可以看到如下内容。这个列表中的每一个TS文件都只有一个关键帧。
curl http://localhost:1935/vod/mp4:sample.mp4/chunklist_w1616510757_ko.m3u8

#EXTM3U
#EXT-X-VERSION:4
#EXT-X-TARGETDURATION:6
#EXT-X-MEDIA-SEQUENCE:0
#EXT-X-I-FRAMES-ONLY
#EXTINF:3.75,
#EXT-X-BYTERANGE:999624@376
media_w1616510757_ko_0.ts
#EXTINF:3.75,
#EXT-X-BYTERANGE:999624@376
media_w1616510757_ko_1.ts
#EXTINF:3.75,
#EXT-X-BYTERANGE:999624@376
media_w1616510757_ko_2.ts
#EXTINF:3.75,
#EXT-X-BYTERANGE:999624@376
media_w1616510757_ko_3.ts
. . .
对于多码率视频流(ABR),你可以在SMIL文件中添加只有I帧的播放列表的输出流。 这个只有I帧的输出流需要一个keyFrameOnly的参数,它必须被设置为TRUE
<smil>
	<head>
	</head>
	<body>
		<switch>
			<video src="mp4:sample.mp4" width="320" height="240" video-bitrate="500000">
				<param name="videoCodecId" value="avc1.66.30" valuetype="data"/>
				<param name="audioCodecId" value="mp4a.40.2" valuetype="data"/>
			</video>
			<video src="mp4:sample.mp4" video-bitrate="5000">
				<param name="videoCodecId" value="avc1.66.30" valuetype="data"/>
				<param name="keyFrameOnly" value="TRUE" valuetype="data"/>
			</video>
		</switch>
	</body>
</smil>