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视频解码器的主要内容,如果未能解决你的问题,请参考以下文章

AndroidJNI实战——记录实现视频播放器

AndroidJNI实战——记录实现视频播放器

ffmpeg将yuv文件编码为mp4

ffmpeg

音视频处理 ffmpeg中级开发 视频转图片

ffmpeg 基本用法