音视频编程之FFmpeg解码视频保存为图片

基础知识

视频播放流程

视频播放器播放一个互联网上的视频文件,需要经过以下几个步骤:解协议,解封装,解码视音频,视音频同步。如果播放本地文件则不需要解协议,为以下几个步骤:解封装,解码视音频,视音频同步。
视频播放流程
解协议的作用,就是将流媒体协议的数据,解析为标准的相应的封装格式数据。
解封装的作用,就是将输入的封装格式的数据,分离成为音频流压缩编码数据和视频流压缩编码数据。
解码的作用,就是将视频/音频压缩编码数据,解码成为非压缩的视频/音频原始数据。
视音频同步的作用,就是根据解封装模块处理过程中获取到的参数信息,同步解码出来的视频和音频数据,并将视频音频数据送至系统的显卡和声卡播放出来。

FFmpeg的解码流程

1.注册FFmpeg的组件
2.分配一个FFmpeg上下文 AVFormatContext 结构体
3.打击开一个视频文件
4.查找视频流
5.根据视频流来打开一个解码器进行解码
6.解码读取视频帧数据
7.将编码压缩的视频帧进行解码转换为原始视频帧数据
8.显示视频帧

FFmpeg解码流程

①初始化FFmpeg环境以及上下文
②打开一个视频文件,且寻找到视频流
③根据寻找到的视频流查找并打开视频流解码器。
④从视频流中读取数据帧
⑤若是视频帧未曾读取完毕,则跳转到 ④
⑥处理视频帧数据
⑦跳转到④
⑧释放申请的FFmpeg资源

FFmpeg解码函数

FFmpeg解码函数 (重要)
av_register_all():注册所有组件。
▫ avformat_open_input():打开输入视频文件。
▫ avformat_find_stream_info():获取视频文件信息。
▫ avcodec_find_decoder():查找解码器。
▫ avcodec_open2():打开解码器。
▫ av_read_frame():从输入文件读取一帧压缩数据。
▫ avcodec_decode_video2():解码一帧压缩数据。
▫ avcodec_close():关闭解码器。
▫ avformat_close_input():关闭输入视频文件

FFmpeg组成

FFmpeg一共包含8个库:
▫ avcodec:编解码(最重要的库)。
▫ avformat:封装格式处理。
▫ avfilter:滤镜特效处理。
▫ avdevice:各种设备的输入输出。
▫ avutil:工具库(大部分库都需要这个库的支持)。
▫ postproc:后加工。
▫ swresample:音频采样数据格式转换。
▫ swscale:视频像素数据格式转换。

FFmpeg基础数据结构

▫ AVFormatContext
 封装格式上下文结构体,也是统领全局的结构体,保存了视频文件封装
格式相关信息。
▫ AVInputFormat
 每种封装格式(例如FLV, MKV, MP4, AVI)对应一个该结构体。
▫ AVStream
 视频文件中每个视频(音频)流对应一个该结构体。
▫ AVCodecContext
 编码器上下文结构体,保存了视频(音频)编解码相关信息。
▫ AVCodec
 每种视频(音频)编解码器(例如H.264解码器)对应一个该结构体。
▫ AVPacket
 存储一帧压缩编码数据。 即音视频压缩之后的数据
▫ AVFrame
 存储一帧解码后像素(采样)数据 即音视频原始数据

FFmpeg数据结构补充

FFmpeg数据结构分析
▫ AVFormatContext
 iformat:输入视频的AVInputFormat
 nb_streams :输入视频的AVStream 个数
 streams :输入视频的AVStream []数组
 duration :输入视频的时长(以微秒为单位)
 bit_rate :输入视频的码率
▫ AVInputFormat
 name:封装格式名称
 long_name:封装格式的长名称
 extensions:封装格式的扩展名
 id:封装格式ID
 一些封装格式处理的接口函数
AVStream
 id:序号
 codec:该流对应的AVCodecContext
 time_base:该流的时基
 r_frame_rate:该流的帧率
▫ AVCodecContext
 codec:编解码器的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。

FFmpeg解码流程图

在这里插入图片描述

参考博客连接

https://blog.csdn.net/leixiaohua1020/article/details/18893769
https://blog.csdn.net/qq_15893929/article/details/83009572

实例

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一路初心向前

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值