ffmpeg视频解码器
Posted 一二三o-0-O
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ffmpeg视频解码器相关的知识,希望对你有一定的参考价值。
【ffmpeg】视频解码器
个人简介
📦个人主页:一二三o-0-O的博客
🏆技术方向:C/C++客户端(直播+音视频剪辑)
📣专栏目标:务实的掌握FFmpeg相关专业知识
🧡如果对您有帮助的话辛苦点赞支持。👍👍👍
音频基础专栏系列
(一)【音视频基础】音频基础理论
(二)【音视频基础】视频基础理论
(三)【音视频基础】封装格式与编码数据
ffmpeg专栏系列
(一)【ffmpeg】ffmpeg命令工具的使用
(二)【ffmpeg】视频解码器
(三)【ffmpeg】SDL视频显示
(四)【ffmpeg】ffmpeg+SDL实现播放器
视频解码知识
- 纯净的解码流程
- 压缩编码数据->像素数据。
- 例如解码H.264,就是”H.264码流->YUV“
- 一般的视频解码流程
- 视频码流一般存储在一定的封装格式(例如MP4、AVI等)中。封装格式中通常还包含音频码流等内容。
- 对于封装格式中的视频,需要先从封装格式中提取中视频码流,然后再进行解码。
- 例如解码MKV格式的视频文件,就是”MKV->H.264码流->YUV“。
源码环境搭建
- 环境配置
- IDE:QCreator
- ffmpeg版本:4.2.2
当将ffmpeg环境配置完成后,在代码中打印以下内容,如果运行无误,则代表FFmpeg已经配置完成。
qDebug() << avcodec_configuration();
- FFmpeg库简介
FFmpeg一共包含8个库:- avcodec:编解码(最重要的库)。
- avformat:封装格式处理。
- avfilter:滤镜特效处理。
- avdevice:各种设备的输入输出。
- avutil:工具库(大部分库都需要这个库的支持)。
- postproc:后加工。
- swresample:音频采样数据格式转换。
- swscale:视频像素数据格式转换。
FFmpeg解码的函数
FFmpeg解码的流程图
- FFmpeg解码的流程如下图所示:
FFmpeg解码函数简介
- avformat_open_input():读取视频文件。
- av_find_best_stream():返回流ID(这里是返回视频流ID)。
- avcodec_find_decoder():查找解码器。
- avcodec_alloc_context3():返回解码器的配置信息。
- avcodec_parameters_to_context():根据提供的解码器参数中的值填充解码器上下文。
- avcodec_open2():打开解码器。
- av_frame_alloc():初始化frame。
- av_read_frame():读取一个packet。
- avcodec_send_packet:将一个packet进行解码操作。
- avcodec_close():关闭解码器。
- avformat_close_input():关闭输入视频文件。
FFmpeg解码的数据结构
- 解码的数据结构如下图所示:
FFmpeg数据结构简介
- AVFormmatContext
- 封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装格式相关信息。
- AVInputFormat
- 每种封装格式(例如FLV、MKV、MP4、AVI)对应一个该结构体。
- AVStream
- 视频文件中每个视频(音频)流对应一个该结构体。
- AVCodecContext
- 编码器上下文结构体,保存了视频(音频)编解码相关信息。
- AVCodec
- 每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。
- AVPacket
- 存储一帧压缩编码数据。
- AVFrame
- 存储一帧解码后像素(采样)数据。
FFmpeg数据结构分析
- AVFormmatContext
- iformat:输入视频的AVInputFormat
- nb_streeams:输入视频的AVStream个数
- streams:输入视频的AVStream[]数组
- duration:输入视频的时长(以微妙为单位)
- bit_rate:输入视频的码率
- AVInputFormat
- name:封装格式名称
- long_name:封装格式的长名称
- extensions:封装格式的扩展名
- id:封装格式ID
- 一些封装格式处理的接口函数
- AVStream
- id:序号
- codec:该流对应的AVCodecContext
- time_base:该流的时基
- r_frame_rate:该流的帧率
- AVCodecContext
- 编解码器的AVCodec
- width,height:图像的宽高(只针对视频)
- pix_fmt:像素格式(只针对视频)
- sample_rate:采样率(只针对音频)
- channels:声道数(只针对音频)
- sample_fmt:采样格式(只针对音频)
- AVCodec
- name:编解码器名称
- long_name:编解码器长名称
- type:编解码器类型
- id:编解码器ID
- 一些编解码的接口函数
- AVPacket
- pts:显示时间戳
- dts:解码时间
- data:压缩编码数据
- size:压缩编码数据大小
- stream_index:所属的AVStream
- AVFrame
- data:解码后的图像像素数据(音频采样数据)
- linesize:对视频来说是图像中一行像素的大小;对音频来说是整个音频帧的大小
- width,height:图像的宽高(只针对视频)
- key_frame:是否为关键帧(只针对视频)
- pict_type:帧类型(只针对视频)。例如I,P,B
参考资料
【1】雷神博客
【2】ffmpeg官方文档
以上是关于ffmpeg视频解码器的主要内容,如果未能解决你的问题,请参考以下文章