标题:祖传独创/全网唯一/Qt结合ffmpeg实现读取ts文件节目流/动态切换多节目/实时切换不同轨道
作者:liudianwu
日期:2025-11-21 08:16
内容:
## 一、前言说明
之前已经实现过获取不同的视音频轨道信息,然后指定索引进行播放,相当于已经实现了一部分功能,但是还不全,vlc播放器上面就可以看到直接切换节目,而不是切换视音频轨道索引,每个节目都有属于自己的视音频轨道,而且可能有多个,比如节目1可能有一个视频两个音轨,一个中文一个英文,之前就没有考虑到这块,导致有些文件播放的时候错乱,画面和声音对不上,其实就是画面是节目1,而声音确是节目2的。查阅资料得知,ffmpeg本身就有接口可以获取到节目的信息,包括中文的节目名称等,我说怎么之前获取流的信息的时候,有个nb_streams表示流的数量,当时就看到还有个nb_programs以及nb_chapters,一开始以为nb是牛逼的简写,原来是number的简写,nb_programs就是有多少个节目,然后再根据数量逐个取出对应的AVProgram对象,获取对应的信息即可。
这里需要注意的是,AVProgram对象有个stream_index对象数组,这里存放的当前节目中视音频索引在全局AVFormatContext对象的流中的索引,这里需要取出来判断是属于音频还是视频,而且还可能有其他的比如DATA数据的轨道,这些不需要的就去掉。有了每个节目的所属视音频索引信息,切换的时候,只需要设置当前需要解码的索引即可。AVFormatContext对象在通过av_read_frame读取的时候,其实所有视频流数据都会读取出来,用户按照需要选择那些去解码即可,所以只需要切换这个索引即可,判断packet的index是不是当前选中节目的视音频轨道索引即可。效果非常好,实时切换瞬间,非常ok。
## 二、效果图
## 三、相关地址
1. 国内站点:[https://gitee.com/feiyangqingyun](https://gitee.com/feiyangqingyun)
2. 国际站点:[https://github.com/feiyangqingyun](https://github.com/feiyangqingyun)
3. 个人作品:[https://blog.csdn.net/feiyangqingyun/article/details/97565652](https://blog.csdn.net/feiyangqingyun/article/details/97565652)
4. 文件地址:[https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g](https://pan.baidu.com/s/1d7TH_GEYl5nOecuNlWJJ7g) 提取码:01jf 文件名:bin_video_demo
## 四、功能特点
1. 同时支持多种解码内核,包括qmedia内核(Qt4/Qt5/Qt6)、ffmpeg内核(ffmpeg2/ffmpeg3/ffmpeg4/ffmpeg5/ffmpeg6)、vlc内核(vlc2/vlc3)、mpv内核(mpv1/mp2)、mdk内核、海康sd ..