FFmpeg库常用函数介绍(一)

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)表示当前的数据无法完成过滤,需要发送更多的数据,其他负值表示失败。

  • 22
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录 第一章 多媒体概念介绍 6 1.1视频格式 6 1.1.1常见格式 6 1.2音频格式 9 1.2.1常见格式 9 1.2.2比较 15 1.3字幕格式 15 1.3.1外挂字幕与内嵌字幕的阐述 15 1.3.2外挂字幕视频与内嵌字幕视频的画面比较 15 1.3.3外挂字幕的三种格式 15 1.4采集录制和播放渲染 16 1.4.1视频采集 16 1. 4.2视频录制 17 1.4.3视频渲染 17 1.5编解码器 18 1.6容器和协议 19 1.6.1容器格式和编码格式 19 1.6.2协议 26 1.6.2.1 视频协议 26 1.6.2.2 音频协议. 26 1.6.2.3 上层通讯协议 27 1.7常用概念介绍 27 1.7.1硬解 27 1.7.2 IBP帧 28 1.7.3 DTS和PTS 31 1.7.4 分辨率 31 1.7.5 码率 32 1.7.6 帧率 32 1.7.7 RGB和YUV 32 1.7.8 实时和非实时 32 1.7.9 复合视频和s-video 32 1.7.10 硬件加速 32 1.7.11 FFmpeg Device 32 第二章 FFmpeg框架 34 2.1 FFmpeg概述 34 2.1.1简介 34 2.1.2功能 34 2.1.3模块组成 35 2.1.4命令集 35 2.2 媒体播放器三大底层框架 37 第三章 编译及简单应用 41 3.1 FFmpeg编译和入门介绍 41 41 3.2 流媒体数据流程讲解 49 3.3 简单应用 51 3.4 SDL( Simple Direct Layer) 55 3.4.1 SDL显示视频 55 3.4.2 SDL显示音频 55 3.5 ffmpeg程序的使用(ffmpeg.exe,ffplay.exe,ffprobe.exe) 56 3.5.1 ffmpeg.exe 56 3.5.2 ffplay.exe 56 3.5.3 ffprobe.exe 56 第四章 数据结构 57 4.1 AVCodec结构体 59 4.2 AVCodecContext结构体 59 4.3 AVInputFormat结构体 60 4.4 AVFormatContext结构体 61 4.5 MovContext结构体 62 4.6 URLProtocol结构体 62 4.7 URLContext结构体 63 4.8 AVIOContext结构体(老版本为:ByteIOContext) 63 4.9 AVStream结构体 64 4.10 MOVStreamContext 结构体 65 4.11 AVPacket 结构体 66 4.12 AVPacketList 结构体 67 4.13 AVFrame结构体 67 第五章 重要模块 76 5.1 libavutil公共模块 76 1 文件列表 76 2 common.h 文件 76 3 bswap.h 文件 78 4 rational.h 文件 79 5 mathematics.h 文件 80 6 avutil.h 文件 80 5.2 libavcodec编解码模块 82 1 文件列表 82 2 avcodec.h 文件 82 3 allcodec.c 文件 87 4 dsputil.h 文件 87 5 dsputil.c 文件 88 6 utils_codec.c 文件 88 7 imgconvert_template.h 文件 99 8 imgconvert.c 文件 121 9 msrle.c 文件 164 10 turespeech_data.h 文件 171 11 turespeech.c 文件 174 5.3 libavformat容器模块 184 1 文件列表 184 2 avformat.h 文件 184 3 allformat.c 文件 190 4 cutils.c 文件 190 5 file.c 文件 192 6 avio.h 文件 194 7 avio.c 文件 196 8 aviobuf.c 文件 200 9 utils_format.c 文件 209 10 avidec.c 文件 220 5.4 libswscale视频色彩空间转换 243 5.5 libswresample音频重采样 243 5.6 libavfilter音视频滤器 243 5.7 libavdevice设备输入和输出容器 243 5.8 libpostproc视频后期处理 243 第六章 播放器 243 6.1 视频播放器 243 6.1.1 ffmpeg的配置 243 6.1.2 一个简单的视频播放器 244 6.2 音频播放器 247 6.3 一个完整的播放器--ffplay 253 6.3.1 ffplay流程图 253 6.3.2 ffplay源码剖析 254 第七章 应用开发 275 7.1 ffmpeg的使用:编码 275 第八章 关键函数介绍 280 8.1 avformat_open_input 280 8.2 avcodec_register_all() 281 8.3 av_read_frame() 283 8.4 avcodec_decode_video2() 283 8.5 transcode_init() 283 8.6 transcode() 294 第九章 ffmpeg相关工程 301 9.1 ffdshow 301 ffdshow 源代码分析1 : 整体结构 302 ffdshow 源代码分析 2: 位图覆盖滤镜(对话框部分Dialog) 304 ffdshow 源代码分析 3: 位图覆盖滤镜(设置部分Settings) 312 ffdshow 源代码分析 4: 位图覆盖滤镜(滤镜部分Filter) 317 ffdshow 源代码分析 5: 位图覆盖滤镜(总结) 322 ffdshow 源代码分析 6: 对解码器的dll的封装(libavcodec) 322 ffdshow 源代码分析 8: 视频解码器类(TvideoCodecDec) 344 ffdshow 源代码分析 9: 编解码器有关类的总结 352 9.2 LAV filters 357 LAV Filter 源代码分析 1: 总体结构 357 LAV Filter 源代码分析 2: LAV Splitter 358 LAV Filter 源代码分析 3: LAV Video (1) 382 LAV Filter 源代码分析 4: LAV Video (2) 400 9.3 MPlayer 427 9.3.1 Mplayer支持的格式 427 9.3.2 Mplayer 中头文件的功能分析 427 9.3.3 MPlayer.main 主流程简要说明 428 9.3.4 Mplayer源码分析 429 第十章 开发实例 436 第十一章 mp4文件封装协议分析 436 11.1 概述 436 11.2 mp4的物理结构 436 11.3 数据的组织结构 437 11.4 mp4的时间结构 437 11.5 文件结构分析 438 11.5.1 File Type Box(ftyp) 438 11.5.2 Movie Box(moov) 438 第十二章 flv 文件格式分析 457 12.1 概述 457 12.2 文件总体结构 457 12.3 文件结构分析 458 12.3.1 flv文件头的结构 458 12.3.2 body主体结构 459 附录A:常见问题 465 1 ffmpeg 从内存中读取数据 465 2 MFC中使用SDL播放音频没有声音的解决方法 465 附录B:经典代码示例 466 附录C:ffmpeg参数中文详细解释 477 附录D:ffplay的快捷键以及选项 479 附录E: ffmpeg处理rtmp流媒体 481

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值