HLS(HTTP Live Streaming)

HLS(HTTP Live Streaming)

HLS #

HLS工作原理如下:

  1. 切片(Segmentation): 媒体流被分割成一系列小的、独立的文件片段。
  2. 播放列表(Playlist): 一个包含有关媒体流信息的索引文件,指导客户端播放这些片段。播放列表通常是一个.m3u8文件。
  3. HTTP传输: 片段和播放列表通过HTTP协议传输到客户端。
  4. 自适应比特率: HLS支持多个版本的相同内容以不同的比特率进行编码,使客户端能够根据网络条件自动选择合适的版本。

ffmpeg for hls #

常规文件转hls直播: #

ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb output.m3u8

-bsf:v h264_mp4toannexb会将mp4中的H.264数据转换为H.264 AnnexB标准的编码,AnnexB标准的编码更常见于实时的传输流中。如果源文件为FLV,TS等可作为直播传输流的视频,则不需要这个参数。

start_number设置第一片的序列数 #

ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -start_number 300 output.m3u8

hls_time设置切片的duration #

控制转码切片长度为10秒左右一片,该规则会从关键帧处开始切片,所以时间并不会均匀。

ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_time 10 output.m3u8

hls_list_size设置切片的个数 #

ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb -hls_list_size 3 output.m3u8

hls_base_url设置前置基本路径 #

m3u8列表中的切片文件默认与m3u8的路径相同,通过这个参数可以设置TS切片存储的路径。

ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb \
    -hls_base_url http://192.18.0.1/live/ output.m3u8

hls_segment_filename设置TS切片文件名模板 #

-hls_segment_filename test_output-%d.ts

delete_segments删除不在m3u8列表中的旧文件 #

ffmpeg -re -i input.mp4 -c copy -f hls \
    -hls_flags delete_segments -hls_list_size 4 \
    -bsf:v h264_mp4toannexb output.m3u8

split_by_time #

使用split_by_time参数,会根据hls_time设定的时间进行切片,并不考虑关键帧,这么做有可能会影响首画面体验,例如花屏或首画而显示慢等问题。

ffmpeg -re -i input.mp4 -c copy -f hls -bsf:v h264_mp4toannexb \
    -hls_time 10 -hls_flags split_by_time output.m3u8

hls推流 #