赞
踩
最近做一个转码切片播放测试,使用HLS(HTTP Live Streaming)
来做直播, 每个TS分片时间为10s,根据TS分片文件生成以下live m3u8
文件
#EXTM3U #EXT-X-MEDIA-SEQUENCE:1 #EXT-X-TARGETDURATION:10 #EXTINF:10 hls/1.ts #EXTINF:10 hls/2.ts #EXTINF:10 hls/3.ts #EXTINF:10 hls/4.ts #EXTINF:10 hls/5.ts #EXTINF:10 hls/6.ts #EXTINF:10 hls/7.ts #EXTINF:10 hls/8.ts #EXTINF:10 hls/9.ts #EXTINF:10 hls/10.ts
将上述m3u8
文件保存为live.m3u8
,放到Apache
文档目录下,用VLC
播放以下网址:
http://localhost/live.m3u8
测试发现,开始播放的第一个文件不是1.ts,多次测试后发现:
只要列表中的文件超过三个,播放的总是列表中的最后三个文件
很悲惨的是,上网搜索后,没有找到任何有效的信息,有个哥们遇到同样的情况,解决后有没有将经验分享出来。
向一位同事请教后,同事说,这是有可能的,因为live m3u8
文件列表是需要实时更新的,我们做测试的话,可以先在最后面加上#EXT-X-ENDLIST
,这个方法经测试有效,但这样已经不是live m3u8
模式
再次上网搜索后,确认,终于找到一篇live m3u8
说明
Live Playlist (Sliding Window)
For live sessions, the index file is updated by removing media URIs from the file as new media files are created and made available.
Important: The
EXT-X-ENDLIST
tag is not present in the Live playlist, indicating that new media files will be added to the index file as they become available.See Listing 3 for an example live playlist as it would appear at the beginning of a session.
Listing 3 Live Playlist at the beginning of a session.
#EXTM3U #EXT-X-TARGETDURATION:10 #EXT-X-VERSION:3 #EXT-X-MEDIA-SEQUENCE:1 #EXTINF:10, fileSequence1.ts #EXTINF:10, fileSequence2.ts #EXTINF:10, fileSequence3.ts #EXTINF:10, fileSequence4.ts #EXTINF:10, fileSequence5.tsThe
EXT-X-MEDIA-SEQUENCE
tag value MUST be incremented by 1 for every media URI that is removed from the playlist file. Media URIsmust be removed from the playlist file in the order that they appear in the playlist. The updated index file presents a moving window into a continuous stream. This type of session is suitable for continuous broadcasts.Here's the same playlist after it has been updated with new media URIs:
Listing 4 Live Playlist after updating the media URIs.
live m3u8
更新规则 live m3u8
文件列表需要不断更新,更新规则:
EXT-X-MEDIA-SEQUENCE
标签,以步长为1进行递增写了一个生成live m3u8的小程序,进行测试
- Usage:
- m3u8_gen.exe start_num list_count duration filename.m3u8 [prefix]
使用示例:
m3u8_gen.exe 1 3 10 live.m3u8 hls/
生成live.m3u8
文件为
- #EXTM3U
- #EXT-X-MEDIA-SEQUENCE:1
- #EXT-X-TARGETDURATION:10
- #EXTINF:10
- hls/1.ts
- #EXTINF:10
- hls/2.ts
- #EXTINF:10
- hls/3.ts
写一个BAT脚本,每10s
循环更新live.m3u8
文件
@echo off for /l %%i in (1,1,420) do ( echo m3u8_gen.exe %%i 3 10 live.m3u8 hls/ m3u8_gen.exe %%i 3 10 live.m3u8 hls/ call :SLEEP 10000 ) ::延时函数实现 :SLEEP ping 192.168.11.1 -n 1 -w %1 > nul
经VLC播放测试正常!!
//======================================================================================================
//直播过程中 需要保持实时更新m3u8 文件,也就是一个paylist,服务器如果是8秒一个片,那么每隔5秒就得更新文件,如果之前是
#EXTM3U
#EXT-X-TARGETDURATION:5
#EXT-X-MEDIA-SEQUENCE:912
http://10.10.2.167/t00000000000086/test912.ts
http://10.10.2.167/t00000000000086/test913.ts
http://10.10.2.167/t00000000000086/test914.ts
由于是实时视频,因此不需要加 endlist
文件中总是保存最新三个ts文件,以滑动窗口的方式进行更新,序号如下 (3个文件)
1,2,3
2,3,4
4,5,6
#EXT-X-MEDIA-SEQUENCE:1 ,下一次就从 2 开始 依次类推,
客户端也会实时的去请求该 playlist.m3u8,如果有改变 就需要下载该文件,可以查看文件的最后修改日期
直播过程中,服务器切片ts文件,需要每一个文件的开始是I帧,如何确定
这样就不能保证时间,m3u8文件list的duration
//=======================================================================
为什么会使用ts 封装,而不是MP4,因为 ts 可以无缝拼接,MP4文件不能,而且编码必须是h264 和aac
//hls 推流过程 ; 视频源 推送流给服务器的时候,用的是http协议的 post方法,post的是ts文件
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。