您当前的位置: 首页 > 

顺其自然~

暂无认证

  • 1浏览

    0关注

    1317博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

ffmpeg入门--结构体和类库

顺其自然~ 发布时间:2022-03-23 13:25:58 ,浏览量:1

​​​​​​入门推荐大神资料:

1. jerrywu145:ffmpeg小白10day

2. 雷神博客和视频

3.ffmpeg编程基础和一些常见问题的解答

4. ffmpeg专栏

bin文件中可以看到8个库:

在这里插入图片描述

一、FFmpeg的8个库
  1. avdevice:硬件的音视频采集、加速和显示。
  2. avfilter:滤镜特效处理。
  3. avformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息、读取音视频数据等功能。各种流媒体协议代码(如rtmpproto.c等)以及音视频格式的(解)复用代码(如flvdec.c、flvenc.c等)都位于该目录下。
  4. avcodec:编解码,音视频各种格式的编解码。各种格式的编解码代码(如aacenc.c、aacdec.c等)都位于该目录下。
  5. postproc: 用于后期效果处理,如图像的去块效应等。
  6. swresample:音频采样数据格式转换,提供音频重采样,采样格式转换和混合等功能。
  7. swscale:提供原始视频的比例缩放、色彩映射转换、图像颜色空间或格式转换的功能。
  8. avutil:包含一些公共的工具函数的使用库,包括算数运算,字符操作等。
二、FFmpeg的常用数据结构 1. 封装格式

AVFormatContext 描述媒体文件的构成及基本信息,封装格式上下文结构体,是统领全局的基本结构体,很多函数需要使用它作为参数,保存了视频文件封装格式相关信息。

AVFormatContext是FFMpeg格式转换过程中实现输入和输出功能、保存相关数据的主要结构。每一个输入和输出文件,都在如下定义的指针数组全局变量中有对应的实体。

static AVFormatContext *output_files[MAX_FILES];
static AVFormatContext *input_files[MAX_FILES];

对于输入和输出,因为共用的是同一个结构体,所以需要分别对该结构中如下定义的iformat或oformat成员赋值。

struct AVInputFormat *iformat;
struct AVOutputFormat *oformat;

对一个AVFormatContext来说,二个成员不能同时有值,即一个AVFormatContext不能同时含有demuxer和muxer。

主要变量

struct AVInputFormat *iformat:输入数据的封装格式AVIOContext *pb:输入数据缓存 unsigned int nb_streams:音视频流个数(输入视频的AVStream 个数)(number streams)AVStream **streams:音视频流(输入视频的AVStream []数组) char filename[1024]:文件名 int64_t duration:时长(单位:us)(输入视频的时长(以微秒为单位)) int bit_rate:比特率(输入视频的码率) AVDictionary *metadata:元数据

AVInputFormat / AVOutputFormat解复用器对象,每种作为输入的封装格式对应一个该结构体。复用器对象,每种作为输出的封装格式对应一个该结构体。

根据输入和输出流的不同,AVStream结构都是封装在AVInputStream和 AVOutputStream结构中,在av_encode( )函数中使用。

AVInputStream中还保存的有与时间有关的信息。 AVOutputStream中还保存有与音视频同步等相关的信息。

主要变量

long_name:封装格式的长名称 extensions:封装格式的扩展名 id:封装格式ID 一些封装格式处理的接口函数

AVStream 用于描述一个视频或者音频流的相关数据信息,视频文件中每个视频(音频)流对应一个该结构体。

AVStream结构保存与数据流相关的编解码器,数据段等信息。比较重要的有如下二个成员:

AVCodecContext *codec; /**< codec context */
void *priv_data;

其中codec指针保存的是encoder或decoder结构。

priv_data指针保存的是和具体编解码流相关的数据, 在ASF的解码过程中,priv_data保存的就是ASFStream结构的数据。

主要变量

AVCodecContext codec:视频/音频流的AVCodecContext AVRational time_base:时间基准,真正的时间 =PTStime_base int64_t duration:该视频/音频流时间长度 AVDictionary *metadata:元数据信息 AVRational avg_frame_rate:帧率 AVPacket attached_pic:附加图片

2. 编解码

AVCodecContext 描述编解码器上下文的数据结构(环境),包含了众多编解码器需要的参数信息。

保存AVCodec指针和与codec相关的数据,如video的width、height,audio的sample rate等。AVCodecContext中的codec_type,codec_id二个变量对于encoder/decoder的匹配来说,最为重要。

enum CodecType codec_type; /* see CODEC_TYPE_xxx */
enum CodecID codec_id; /* see CODEC_ID_xxx */

如上所示,codec_type保存的是CODEC_TYPE_VIDEO,CODEC_TYPE_AUDIO等媒体类型, codec_id保存的是CODEC_ID_FLV1,CODEC_ID_VP6F等编码方式。

以支持flv格式为例,在前述的av_open_input_file(…… ) 函数中,匹配到正确的AVInputFormatdemuxer后,通过av_open_input_stream( )函数中调用AVInputFormat的read_header接口来执行flvdec.c中的flv_read_header( )函数。在flv_read_header( )函数内,根据文件头中的数据,创建相应的视频或音频AVStream,并设置AVStream中AVCodecContext的正确的codec_type值。codec_id值是在解码过程中flv_read_packet( )函数执行时根据每一个packet头中的数据来设置的。

主要变量

codec:编解码器的AVCodec width, height:图像的宽高(只针对视频) pix_fmt:像素格式(只针对视频) sample_rate:采样率(只针对音频) channels:声道数(只针对音频) sample_fmt:采样格式(只针对音频)

AVCodec 编解码器对象,每种编解码格式对应一个该结构体,每一个AVCodecContext都包含一个AVCodec;

主要变量

name:编解码器名称 long_name:编解码器长名称 type:编解码器类型 id:编解码器ID 一些编解码的接口函数

AVCodecParameters编解码参数,每个AVStream中都含有一个AVcodecParameters,用于存放当前流的编解码参数。

主要变量

enum AVMediaType codec_type 编码数据的一般类型; enum AVCodecID codec_id 特定类型的编码数据(使用的编解码器); uint32_t codec_tag 有关编解码器的其他信息; uint8_t *extradata 初始化解码器所需的额外二进制数据,依赖于编解码器; int extradata_size extradata内容的大小(以字节为单位); int64_t bit_rate 编码数据的平均比特率(以每秒位数为单位)

3. 网络协议

AVIOContext管理输入输出的结构体。字节IO 上下文。

主要变量

unsigned char * buffer 启动缓冲区 int buffer_size 最大缓冲区大小 unsigned char * buf_ptr 缓冲区当前位置 unsigned char * buf_end 如果读取函数返回的数据少于请求数据,则数据结束可能小于buffer + buffer_size

URLProtocol 描述音视频数据传输所使用的协议,每种传输协议对应一个URLContext结构。

主要变量

AVPacket用于保存读取的packet数据。存储一帧压缩编码数据。存放编码后,解码前的压缩数据,即ES数据。

主要变量

uint8_t *data:压缩编码数据,一个AVPacket的data通常对应一个NAL。 int size:data的大小 int64_t pts:显示时间戳 int64_t dts:解码时间戳 int stream_index:标识该AVPacket所属的视频/音频流。

AVFrame 该结构描述了解码的(原始)音频或视频数据。存放编码前,解码后的原始数据,如YUV格式的视频数据或PCM|格式的音频数据等.

主要变量

data:解码后的图像像素数据(音频采样数据)。 linesize:对视频来说是图像中一行像素的大小;对音频来说是整个音频帧的大小。 width, height:图像的宽高(只针对视频)。 key_frame:是否为关键帧(只针对视频) 。 pict_type:帧类型(只针对视频) 。例如I,P,B。

在这里插入图片描述

关注
打赏
1662339380
查看更多评论
立即登录/注册

微信扫码登录

0.0548s