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, MJPEGuint32_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)
:通过复制创建对象,引用计数+1int av_packet_ref(AVPacket *dst,const AVPacket *src)
:作用于函数2类似av_packet_unref(AVPacket *pkt)
void av_packet_free(AVPacket **pkt)
:清空对象,引用计数-1void av_init_packet(AVPacket *pkt)
:手动初始化对象int av_packet_from_data(AVPacket *pkt,uint8_t *data, int size)
:创建AVPacket对象并初始化
以上是关于FFMPEG解封装函数介绍的主要内容,如果未能解决你的问题,请参考以下文章