短视频带货源码,ffmpeg hls动态切换分辨率
短视频带货源码,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动态切换分辨率实现的相关代码, 更多内容欢迎关注之后的文章