Adaptive-HLS流的优劣分析

HLS是Apple采用的基于http的流媒体格式。媒体切片为mpegts格式,manifest文件被称作m3u8。一个主master.m3u8里包含多个不同resolution/bitrate的子流,由客户端播放器根据显示屏size和网络状况选取其中一个子流进行播放,这就是自适应(adaptive)的过程。下面是一个典型的master.m3u8文件。

#EXTM3U
#EXT-X-VERSION:3
#EXT-X-MEDIA:TYPE=AUDIO,GROUP-ID="group_audio",NAME="audio_0",DEFAULT=YES,LANGUAGE="ZH",URI="waudio_zh.m3u8"
#EXT-X-STREAM-INF:BANDWIDTH=2926278,RESOLUTION=1920x1080,CODECS="avc1.4d4028,mp4a.40.2",AUDIO="group_audio"
1080p.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=1936278,RESOLUTION=1280x720,CODECS="avc1.4d401f,mp4a.40.2",AUDIO="group_audio"
720p.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=1056278,RESOLUTION=640x360,CODECS="avc1.4d401e,mp4a.40.2",AUDIO="group_audio"
480p.m3u8

#EXT-X-STREAM-INF:BANDWIDTH=616278,RESOLUTION=480x270,CODECS="avc1.4d401e,mp4a.40.2",AUDIO="group_audio"
320p.m3u8

Adaptive的适配过程是由hlsplayer来决定的,大概是这样:第一次访问时,按master.m3u8中的子流顺序来尝试,如果高清流在前,那就从高清流开始尝试。如果低清流在前,那就从低清流开始尝试。后续的播放,player取得了经验数据后,会直接从上次播放的子流开始尝试。

Adaptive-HLS流的优劣分析_第1张图片

Fragment MP4是经过改造后MP4文件,适合流式传输。fMP4最早是为dash定制的,后来HLS也支持。fMP4 is designed to be referenced by both a HLS playlist (.m3u8) and a DASH manifest (.mpd). 

为什么要采用fMP4呢?这就涉及到HLS的问题了。HLS在选流,无缝切换,seek-play,DRM支持上都不如dash。为了解决这些问题,Apple也就让HLS协议支持fMP4了。

查ffmpeg手册,在win10下面用下面的指令可以生成。

ffmpeg.exe -y -i %1 -g 25 -sc_threshold 1 -f hls -hls_segment_type fmp4  -hls_segment_filename %2/%%4d.m4s  -hls_time 8 -hls_init_time 4 -hls_fmp4_init_filename init.mp4 %2/index.m3u8

#EXTM3U

#EXT-X-VERSION:7

#EXT-X-TARGETDURATION:4

#EXT-X-MEDIA-SEQUENCE:0

#EXT-X-MAP:URI="init.mp4"

#EXTINF:4.166667,

0000.m4s

#EXTINF:4.166667,

0001.m4s

#EXTINF:2.433333,

0002.m4s

#EXT-X-ENDLIST

在linux下面执行有所不同,

cmd = f"ffmpeg -y -i {origin_file} -g 25 -sc_threshold 1 -f hls -hls_segment_type fmp4  -hls_segment_filename {out_dir}/%4d.m4s -hls_time 8 -hls_init_time 4 -hls_fmp4_init_filename {out_dir}/init.mp4 {out_dir}/{out_m3u8} "

你可能感兴趣的:(流媒体,m3u8,fMP4,adaptive-HLS,HLS自适应过程,dash)