文章目录
- 🎬 FFmpeg 解码播放流程概览(以音视频文件为例)
- 1️⃣ 创建结构体
- 2️⃣ 打开音视频文件
- 3️⃣ 查找解码器并打开解码器
- 4️⃣ 循环读取数据包(Packet)
- 5️⃣ 解码成帧(Frame)
- 6️⃣ 播放 / 显示 / 播放音频
- 7️⃣ 清理资源
- ✅ 总结一句话流程:
🎬 FFmpeg 解码播放流程概览(以音视频文件为例)
1️⃣ 创建结构体
准备容器结构体,用于打开媒体文件并读取信息
-
创建
AVFormatContext
AVFormatContext *fmt_ctx = NULL;
-
【可选】使用
avformat_alloc_context
手动分配(很多时候由avformat_open_input
自动完成)
2️⃣ 打开音视频文件
打开媒体文件并读取格式头部信息
- 使用
avformat_open_input()
打开文件 - 使用
avformat_find_stream_info()
读取流信息(视频流、音频流)
3️⃣ 查找解码器并打开解码器
- 遍历
fmt_ctx->streams[i]
,找到视频流和音频流的索引 - 获取
AVCodecParameters
- 使用
avcodec_find_decoder()
找到对应的解码器 - 使用
avcodec_alloc_context3()
创建解码器上下文AVCodecContext
- 使用
avcodec_parameters_to_context()
拷贝参数 - 使用
avcodec_open2()
打开解码器
4️⃣ 循环读取数据包(Packet)
将原始的压缩音视频数据读取出来
- 使用
av_read_frame()
读取AVPacket
- 判断
packet.stream_index
来区分是视频包还是音频包
5️⃣ 解码成帧(Frame)
将压缩包解码成原始帧
- 使用
avcodec_send_packet()
将AVPacket
发送给解码器 - 使用
avcodec_receive_frame()
获取解码后的AVFrame
6️⃣ 播放 / 显示 / 播放音频
这一步跟平台相关:
- 视频帧可以用 SDL、OpenGL、Qt 等显示
- 音频帧可以送给音频设备播放(如 SDL、PortAudio、ALSA)
7️⃣ 清理资源
av_packet_unref()
和av_frame_unref()
用于复用avcodec_free_context()
释放解码器上下文avformat_close_input()
和avformat_free_context()
释放格式上下文
✅ 总结一句话流程:
创建结构体 → 打开文件 → 查找流 → 找解码器 → 解码成帧 → 播放 → 释放资源