短视频带货源码,ffmpeg hls动态切换分辨率
短视频带货源码,ffmpeg hls动态切换分辨率实现的相关代码
HLS支持多分辨率,在M3U8中会写明支持的分辨率,如下(随便找的一个例子)
1 | #EXTM3U<br>#EXT-X-STREAM-INF:BANDWIDTH=375000,RESOLUTION=640x360<br>360_out.m3u8<br>#EXT-X-STREAM-INF:BANDWIDTH=750000,RESOLUTION=854x480<br>480_out.m3u8<br>#EXT-X-STREAM-INF:BANDWIDTH=2000000,RESOLUTION=1280x720<br>720_out.m3u8<br>#EXT-X-STREAM-INF:BANDWIDTH=3500000,RESOLUTION=1920x1080<br>1080_out.m3u8 |
切换不同的分辨率其实就是选择不同的AVProgram,通过AVProgram的discard控制是否启用
1 | typedef struct AVFormatContext {<br> ...<br> unsigned int nb_programs;<br> AVProgram **programs;<br> ...<br>}<br>typedef struct AVProgram {<br> int id;<br> int flags;<br> enum AVDiscard discard; ///< selects which program to discard and which to feed to the caller<br> unsigned int *stream_index;<br> unsigned int nb_stream_indexes;<br> AVDictionary *metadata;<br> int program_num;<br> int pmt_pid;<br> int pcr_pid;<br> int pmt_version;<br> int64_t start_time;<br> int64_t end_time;<br> int64_t pts_wrap_reference; ///< reference dts for wrap detection<br> int pts_wrap_behavior; ///< behavior on wrap detection<br>} AVProgram; |
切换之后使用av_seek_frame到特定的时间点
动态切换需要注意的就是要衔接好,像字节的西平视频就比较激进切换之后马上就用新的分辨率,爱奇艺就缓和一些等缓存播放完之后再衔接到新分辨率上
以上就是短视频带货源码,ffmpeg hls动态切换分辨率实现的相关代码, 更多内容欢迎关注之后的文章
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现