1 avformat_open_input
作用:打开媒体文件并获取媒体文件信息,可以是本地文件,也可以时网络流。
函数原型:
int avformat_open_input(AVFormatContext **ps, const char *url, const AVInputFormat *fmt, AVDictionary **options);
ps:输入文件的AVFormatContext,会将获取的信息填充进去;
url:流地址,可以是本地文件、RTMP、RTP协议流地址;
fmt:一般为NULL,表示自动检测流格式,否则会使用提供的值作为流格式;
options:一般为NULL;
返回值:0表示成功,负值表示失败。
注意:需要调用avformat_close_input关闭AVFormatContext。
2 avformat_find_stream_info
作用:读取音视频包来获取流信息,常用于avformat_open_input函数之后。像flv这种头很简单的格式,从头中只知道是否存在音视频流,但不知道流的编解码信息,该函数会去读音视频包来获取流的编解码信息。
函数原型:
int avformat_find_stream_info(AVFormatContext *ic, AVDictionary **options);
ic:输入文件的AVFormatContext;
options:用户自定义选项,一般为NULL;
返回值:>= 0表示成功。
3 av_dump_format
作用:用于将AVFormatContext中媒体格式的信息进行格式化输出。
函数原型:
void av_dump_format(AVFormatContext *ic, int index, const char *url, int is_output);
ic:输入文件的AVFormatContext;
index:输出音视频流的索引,-1表示输出所有音视频流信息;
url:媒体流地址;
is_output:0表示输入上下文,1表示输出上下文;
4 avformat_alloc_output_context2
作用:初始化一个用于输出的AVFormatContext结构体,需要调用avformat_free_context进行释放。
函数原型:
int avformat_alloc_output_context2(AVFormatContext **ctx, const AVOutputFormat *oformat, const char *format_name, const char *filename);
ctx:要新创建的AVFormatContext结构体;
oformat:指定AVFormatContext中的AVOutputFormat以确定输出格式。如果为NULL,可以通过设置format_name或者filename来让FFmpeg猜测输出格式;
format_name:输出格式的名称,例如”avi”、”flv”等。FFmpeg可以根据格式名称猜测出输出格式;
filename:输出文件名称,例如”a.flv”、”b.avi”等。FFmpeg可以根据文件名称猜测出输出格式;
返回值:>= 0表示成功,负值表示失败。
5 avformat_new_stream
作用:创建一个新的AVStream流并将其添加到AVFormatContext中。
函数原型:
AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c);
s:要添加新流的AVFormatContext;
c:流的编解码器,用于设置新创建流的编解码信息;
返回值:新创建的AVStream流的指针。
6 avcodec_copy_context
作用:将源编解码器的参数拷贝至目的编辑器参数中去。
函数原型:
int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src);
dest:目的编解码器参数;
src:源编解码器参数;
返回值:负值表示失败。
注意:在较新版本中,该函数已被弃用,取而代之的是avcodec_parameters_copy、avcodec_parameters_to_context和avcodec_parameters_from_context。
7 avcodec_parameters_copy
作用:将源编解码器的参数拷贝至目的编解码器参数中去,可用于解封装。
函数原型:
int avcodec_parameters_copy(AVCodecParameters *dst, const AVCodecParameters *src);
dest:目的编解码器参数;
src:源编解码器参数;
返回值:>= 0表示成功,负值表示失败。
8 codec_tag
作用:表示码流格式(不同封装格式的码流格式不同)。
用法:一般会将codec_tag设置为0,这样ffmpeg会自动找出匹配封装格式的码流格式。
9 AVFMT_GLOBALHEADER
作用:表示是否设置了全局头(全局头区别于局部头,全局头只有一个)。
用法:flags是掩码,它的某一位表示的就是全局头,与AVFMT_GLOBALHEADER相与,为1表示设置了全局头,为0表示没有设置全局头。
//ofmt_ctx: AVFormatContext
//oformat: AVOutputFormat
//flags: 掩码
ofmt_ctx->oformat->flags & AVFMT_GLOBALHEADER;
如果设置了全局头,则需要打上标签,这样ffmpeg才会自动加上全局头。
// out_stream是输出AVStream,codec是AVCodecContext
out_stream->codec->flags |= CODEC_FLAG_GLOBAL_HEADER;
注意:这些只在较低版本才需要,较高版本会自动识别并添加全局头。
10 AVFMT_NOFILE
作用:表示该上下文不依赖于文件的输入或输出,而通过其他方式进行文件的读取或写入。例如,使用网络流或者内存缓冲区作为输入源或者输出目标时,可以通过掩码与该常量相与来判断是否需要打开文件。如果为1则表示不需要打开文件,如果为0表示需要打开文件。
//ofmt_ctx: AVFormatContext, oformat是AVOutputFormat
ofmt_ctx->oformat->flags & AVFMT_NOFILE;
如果需要打开文件,可以使用avio_open或者avio_open2来打开文件。
11 avio_open2
作用:打开输入输出文件,用于创建并初始化一个AVIOContext。
函数原型:
int avio_open2(AVIOContext **s, const char *url, int flags, const AVIOInterruptCB *int_cb, AVDictionary **options);
s:指向创建好的AVIOContext;
url:要访问的文件或者流的地址;
flags:打开方式;
AVIO_FLAG_READ:只读;
AVIO_FLAG_WRITE:只写;
AVIO_FLAG_READ_WRITE:读写;
int_cb:在协议级别使用的中断回调,一般不使用,为NULL;
options:
协议的私有选项,不同的协议不同。ffmpeg会根据流地址自动识别是哪种协议。文件在ffmpeg其实也是一种协议。一般不使用,为NULL;
返回值:>= 0表示成功,负值表示失败。
注意:和avio_close配对使用。需要注意的是,调用前需要判断该上下文是否依赖文件的输入或输出。ofmt_ctx->oformat->flags & AVFMT_NOFILE为0表示依赖,即需要调用此函数。
//ofmt_ctx: AVFormatContext, oformat是AVOutputFormat
ofmt_ctx->oformat->flags & AVFMT_NOFILE;
12 avformat_write_header
作用:写入文件头。
函数原型:
int avformat_write_header(AVFormatContext *s, AVDictionary **options);
s:输出文件的AVFormatContext;
options:协议的私有选项;
返回值:负值表示失败。
13 av_read_frame
作用:读取码流中的若干帧音频或者一帧视频。
函数原型:
int av_read_frame(AVFormatContext *s, AVPacket *pkt);
s:输入AVFormatContext;
pkt:输出的AVPacket;
返回值:负值表示失败或者文件尾。
14 av_rescale_q_rnd
作用:计算a * bq / cq,也就是将以时间基bq表示的时间戳a转换成以时间基cq表示。
函数原型:
int64_t av_rescale_q_rnd(int64_t a, AVRational bq, AVRational cq, AVRounding rnd);
a:时间戳;
bq:当前时间基;
cq:目标时间基;
rnd:取整方式;
AV_ROUND_ZERO:向0取整,实际就是向下取整;
AV_ROUND_INF:向无穷取整,实际就是向上取整;
AV_ROUND_DOWN:向下取整,例如,88.1向下取整就是88;
AV_ROUND_UP:向上取整,例如,88.1向上取整就是89;
AV_ROUND_NEAR_INF:四舍五入;
AV_ROUND_PASS_MINMAX:需要与其他位组合使用,当a为INT64_MIN或INT64_MAX时,直接返回a;
返回值:以目标时间基表示的时间戳。
15 av_rescale_q
作用:和av_rescale_q_rnd的作用完全一样,也是将以时间基bq表示的时间戳a转换成以时间基cq表示,区别在于取整方式不可选,固定为AV_ROUND_NEAR_INF,也就是四舍五入。
函数原型:
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq);
a:时间戳;
bq:当前时间基;
cq:目标时间基;
返回值:以目标时间基表示的时间戳。
注意:实际上av_rescale_q就是调用的av_rescale_q_rnd,将取整方式设置为AV_ROUND_NEAR_INF。下面是它的源码。
int64_t av_rescale_q(int64_t a, AVRational bq, AVRational cq)
{
return av_rescale_q_rnd(a, bq, cq, AV_ROUND_NEAR_INF);
}
16 av_bsf_get_by_name
作用:通过名称获取对应的比特流过滤器。
函数原型:
const AVBitStreamFilter *av_bsf_get_by_name(const char *name);
name:比特流过滤器名称;
返回值:对应具体名称的比特流过滤器。
17 av_bsf_alloc
作用:为比特流过滤器分配上下文。调用者必须填充比特流上下文里的编解码器参数,然后将数据送到过滤器里之前调用av_bsf_init。
函数原型:
int av_bsf_alloc(const AVBitStreamFilter *filter, AVBSFContext **ctx);
filter:比特流过滤器;
ctx:待分配的AVBSFContext;
返回值:负值表示失败。
注意:必须和av_bsf_free配对使用,过滤完成后需要调用av_bsf_free对AVBSFContext进行释放。
18 av_bsf_free
作用:释放AVBSFContext。
函数原型:
void av_bsf_free(AVBSFContext **ctx);
ctx:待释放的AVBSFContext;
19 av_bsf_init
作用:初始化AVBSFContext。
函数原型:
int av_bsf_init(AVBSFContext *ctx);
ctx:已分配的AVBSFContext;
返回值:负值表示失败。
20 av_bsf_send_packet
作用:将数据送入过滤器进行过滤。
函数原型:
int av_bsf_send_packet(AVBSFContext *ctx, AVPacket *pkt);
ctx:已初始化的AVBSFContext;
pkt:待过滤的数据;
返回值:0表示成功, AVERROR(EAGAIN)表示当前的数据无法完成过滤,需要发送更多的数据,其他负值表示失败。