FFMPEG解封装函数介绍

Posted 学杰杰杰杰.

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了FFMPEG解封装函数介绍相关的知识,希望对你有一定的参考价值。

1. 简介

使用FFmpeg对音视频流进行解封装是处理音视频输入的初始步骤,FFmpeg提供了丰富的接口函数进行该操作,下面对一些重要函数功能进行详细介绍。

2. 基本函数介绍

1. av_register_all()

函数原型:

void av_register_all(void);

函数功能:
初始化所有组件,在函数内部会对编解码器和复用器进行注册。

2. avformat_network_init()

函数原型:

int avformat_network_init(void);

函数功能:
加载socket库以及网络加密协议相关的库,为后续使用网络相关功能提供支持

3. avformat_open_input()

函数原型:

int avformat_open_input(AVFormatContext **ps, const char *filename, AVInputFormat *fmt, AVDictionary **options)

函数功能:
用于打开多媒体数据并且获取相关信息
参数说明:
AVFormatContext **ps:函数如果调用成功,会将获取到的音视频信息存入AVFormatContext结构体ps中。
const char *filename:打开的音视频流的URL。
AVInputFormat *fmt:可以强制指定AVFormatContext中的AVInputFormat。该参数一般情况都设置为NULL,表示FFmpeg可以自动检测AVInputFormat。
AVDictionary **options:附件的一些选项,一般也设置为NULL。
返回值:
调用成功返回值>=0

4. avformat_find_stream_info()

函数原型:

int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);

函数功能:
读取一部分音视频数据并由此获得一些该视频的相关信息。
参数说明:
AVFormatContext *ic:将获取到的流信息存入ic中供后续使用。
AVDictionary **options:额外的选项,一般设置为0。
返回值:
调用成功返回值>=0

5. av_find_best_stream()

函数原型:

int av_find_best_stream(AVFormatContext *ic, enum AVMediaType type, int wanted_stream_nb, int related_stream,
                        AVCodec **decoder_ret, int flags)

函数功能:
用于获取音频流、视频流索引。
参数说明:
AVFormatContext* ic:获取到的AVFormatContext。
enum AVMediaType type:输入对应要寻找的具体类型流信息(音频、视频)。
int wanted_stream_nb:一般设置为-1。
related_stream:一般设置为-1。
AVCodec** decoder_ret:一般设置为NULL。
int flags:一般设置为0。
返回值:
调用成功返回值>=0

6. av_read_frame()

函数原型:

int av_read_frame(AVFormatContext *s, AVPacket *pkt);

函数功能:
用于获取一帧完整的图像数据,或者获得多帧完整的音频数据。
参数说明:
AVFormatContext *s:获取到的形状格式上下文AVFormatContext。
AVPacket *pkt:这个值不能为NULL,必须是一个开辟好的空间,用于接收AVPacket数据
返回值:
调用成功返回值>=0

7. av_seek_frame()

函数原型:

int av_seek_frame(AVFormatContext *s, int stream_index, int64_t timestamp,                   int flags);

函数功能:
用于寻找某个特定帧。
参数说明:
AVFormatContext *s:获取到的形状格式上下文AVFormatContext。
int stream_index:基本流索引,表示seek是针对哪一类流数据(音频或视频)。
int64_t timestamp:要seek的时间点,以time_base为单位。
int flags:标志位,用于设置seek的方式。
返回值:
调用成功返回值>=0

3. 基础类型介绍

1. AVFormatContext

在使用FFMPEG进行开发的时候,AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。它是FFMPEG解封装(flv,mp4,rmvb,avi)功能的结构体。
重要变量说明:
AVIOContext *pb:输入数据的缓存
unsigned int nb_stream:音视频流的个数
AVStream **streams:音视频流
char filename[1024]:文件名
int64_t duration:时长(单位为微秒us)
int bit_rate:比特率(单位为bps)
AVDictionary *metadata:元数据

2. AVStream

AVStream是在FFmpeg使用过程中关于编解码至关重要的结构体之一,是对流(Stream)的封装和抽象,描述了视频、音频等流的编码格式等基本流信息。此外也是音频、视频、字母数据流的重要载体。
对于一个典型的mp4格式的媒体源来说,需要经过解封装(解复用),解码然后输出的过程。而解封装从容器中分离出来的流,在FFmpeg中对应的对象就是AVStream。解复用解出来几条AVStream,就会在AVFormateContext中的nb_streams+1(总流数+1),并且将AVStream保存在streams数组中。
重要变量说明:
AVRational time_base:表示时间基数,AVRational是一个分数类型结构体,有两个整形参数表示分子和分母,用于指示下一个参数int64_t类型中的duration表示多少分之一秒
int64_t duration:将duration单位转换成秒:duration*(time_base.num/time_base.den)
AVRational avg_frame_rate:帧率
AVCodecParameters *codecpar:音视频参数,用于替代AVCodecContext

3. AVCodecParameters

enum AVMediaType code_type:类型参数,表示媒体流是音频还是视频
enum AVCodecID codec_id:表示编码格式,h264,MPEG4, MJPEG
uint32_t codec_tag:一般不用
int format:表示视频的像素格式(YUV420,YUV422...)或者音频的采样格式
int width; int height:视频的宽、高(只有视频有)
uint64_t channel_layout:一般取默认值
int channels:声道数
int sample_rate:采样率
int frame_size:只针对音频,一帧音频的大小

4. AVPacket

AVBufferRef *buf:用于存储引用计数
int64_t pts:表示显示时间,通过pts*(num/den)换算
int64_t dts:表示解码时间
uint8_t *data
int size
AVPacket *av_packet_alloc(void):创建AVPacket对象并初始化
AVPacket *av_packet_clone(const AVPacket *src):通过复制创建对象,引用计数+1
int av_packet_ref(AVPacket *dst,const AVPacket *src):作用于函数2类似
av_packet_unref(AVPacket *pkt)
void av_packet_free(AVPacket **pkt):清空对象,引用计数-1
void av_init_packet(AVPacket *pkt):手动初始化对象
int av_packet_from_data(AVPacket *pkt,uint8_t *data, int size):创建AVPacket对象并初始化

以上是关于FFMPEG解封装函数介绍的主要内容,如果未能解决你的问题,请参考以下文章

流媒体开发19FFMpeg解封装流程分析

流媒体开发19FFMpeg解封装流程分析

流媒体开发19FFMpeg解封装流程分析

流媒体开发19FFMpeg解封装流程分析

音视频开发之旅(60) -调试分析FFmpeg (解封装部分的)常用结构体

音视频开发之旅(60) -调试分析FFmpeg (解封装部分的)常用结构体