1、了解FFmpeg库
库 | 介绍 |
---|---|
avcodec | 音视频编解码核心库 |
avformat | 音视频容器格式的封装和解析 |
avutil | 核心工具库 |
swscal | 图像格式转换的模块 |
swresampel | 音频重采样 |
avfilter | 音视频滤镜库 如视频加水印、音频变声 |
avdevice | 输入输出设备库,提供设备数据的输入与输出 |
FFmpeg 依靠以上几个库,实现了强大的音视频编码、解码、编辑、转换、采集等能力。
2、播放流程
-
解封装(Demuxing):就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。例如,FLV 格式的数据,经过解封装操作后,输出 H.264 编码的视频码流和 AAC 编码的音频码流。
-
软硬件解码(Decode):就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。通过解码,将压缩编码的视频数据 H.264,MPEG2 解码成为非压缩的颜色数据,例如 YUV 等等;将压缩编码的音频数据 AAC,MP3 解码成为非压缩的音频抽样数据,例如 PCM 数据。解码分为硬编码和软编码。
-
像素格式转换:将 YUV 数据格式转换成 RGB 数据格式。
-
重采样:对音频重新采样。
-
dts/pts:dts 是解码的时间戳,而 pts 是显示的时间戳。pts 用于获取当前播放进度。进度条移动需要用到
av_seek_frame
函数。 -
音视频同步:就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的音频和视频数据,并将音视频频数据送至系统的显卡和声卡播放出来(Render)。
4、ffmpeg解码流程
注意:新版本后不用再注册所有格式和编解码器 av_register_all();
5、实战
了解了这么多,接下来开始第一步,打开一个视频文件,打印出音视频流信息。
创建一个类 VideoInfo
,用于处理视频文件的打开和流信息打印。
运行环境macOS+Qt6.6+FFmpeg7.0.1+OpenGL