ffmpeg hls动态切换分辨率

本文介绍了HLS(HTTP Live Streaming)协议如何支持多分辨率,并通过M3U8文件示例解释了不同分辨率的切换。在视频流处理中,AVProgram用于指定不同的分辨率流,其discard属性决定是否启用。动态切换分辨率时,需要注意流畅性和无缝衔接,例如字节跳动和爱奇艺的不同策略。理解AVFormatContext和AVProgram结构对于实现平滑的视频流切换至关重要。
摘要由CSDN通过智能技术生成
  • 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到特定的时间点
  • 动态切换需要注意的就是要衔接好,像字节的西平视频就比较激进切换之后马上就用新的分辨率,爱奇艺就缓和一些等缓存播放完之后再衔接到新分辨率上
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值