短視訊帶貨原始碼,ffmpeg hls動態切換解析度
阿新 • • 發佈:2022-04-07
短視訊帶貨原始碼,ffmpeg hls動態切換解析度實現的相關程式碼
HLS支援多解析度,在M3U8中會寫明支援的解析度,如下(隨便找的一個例子)
#EXTM3U
#EXT-X-STREAM-INF:BANDWIDTH=375000,RESOLUTION=640x360
360_out.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=750000,RESOLUTION=854x480
480_out.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720
720_out.m3u8
#EXT-X-STREAM-INF:BANDWIDTH=3500000,RESOLUTION=1920x1080
1080_out.m3u8
切換不同的解析度其實就是選擇不同的AVProgram,通過AVProgram的discard控制是否啟用
typedef struct AVFormatContext {
...
unsigned int nb_programs;
AVProgram **programs;
...
}
typedef struct AVProgram {
int id;
int flags;
enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller
unsigned int *stream_index;
unsigned int nb_stream_indexes;
AVDictionary *metadata;
int program_num;
int pmt_pid;
int pcr_pid;
int pmt_version;
int64_t start_time;
int64_t end_time;
int64_t pts_wrap_reference; ///< reference dts for wrap detection
int pts_wrap_behavior; ///< behavior on wrap detection
} AVProgram;
切換之後使用av_seek_frame到特定的時間點
動態切換需要注意的就是要銜接好,像位元組的西平視訊就比較激進切換之後馬上就用新的解析度,愛奇藝就緩和一些等快取播放完之後再銜接到新解析度上
以上就是短視訊帶貨原始碼,ffmpeg hls動態切換解析度實現的相關程式碼, 更多內容歡迎關注之後的文章