前言
与其他博客不同,本文不是讲解HLS 协议本身,而是讲解在FFMPEG 中是如何解析HLS的,当然FFMPEG 也是按照HLS 协议去封装/解析 HLS 流的,因此读完本文不但能了解HLS 协议本身,还能看到HLS 是如何落地的。
1 综述
HLS(Http Live Streaming )是有苹果公司基于HTTP 传输的协议,目的解决防火墙屏蔽问题,如RTMP 不是走HTTP,容易被防火墙阻难。我们首先来看一个简单的m3u8 文件:
#EXTM3U //固定格式,首行开头必须是#EXTM3U
#EXT-X-VERSION:3 //HLS V3
#EXT-X-TARGETDURATION:10 //切片最大duration ,下面5段ts 最大duration 是10, 因此这里为10
#EXT-X-MEDIA-SEQUENCE:1 //第一个切片序列号
#EXTINF:9.640000, //切片info 信息,下面紧跟切片
output1.ts //ts 切片
#EXTINF:5.600000,
output2.ts
#EXTINF:10.000000,
output3.ts
#EXTINF:10.000000,
output4.ts
#EXTINF:3.040000,
output5.ts
#EXT-X-ENDLIST //代表HLS 切片结束
工作原理其实也很简单,先下载M3U8 文件,然后根据M3U8文件中提供的ts url ,采用HTTP 去下载视频数据。因此HLS = m3u8 + http
2 使用FFMPEG 转换成HLS 切片
1)从常规文件转换HLS 切片:
./ffmpeg.exe -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8 //会生成一个m3u8 文件 及N 个 ts 流
2)通过start_number参数,设置第一片序列数
./ffmpeg.exe -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -start_number 100 output.m3u8 //第一片切片序数将从100 开始
3)通过hls_time 参数设置切片的duration
./ffmpeg.exe -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_time 10 output.m3u8 //生成的切片duration 维持在10s
本文重点是分析HLS 在FFMPEG 中是如何实现的, 关于HLS 字段 & 使用FFMPEG 转HLS 参数 见下图。
问题:播放 http://127.0.0.1/streaming/output.m3u8 与播放 http://127.0.0.1/streaming/output1.ts 有何区别?
答: 通过上述两个url,我们可以得知前者是hls 协议,后者是http 协议。 对于后者通过ffmpeg 直接下载http 网络数据,然后去demux。 前者需在后者的基础上 通过m3u8文本解析出ts 流的url。 因此我们可以概述:相比与http