FFmpeg源代码简单分析 avformat write header

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

               

=====================================================

FFmpeg的库函数源代码分析文章列表:

【架构图】

FFmpeg源代码结构图 - 解码

FFmpeg源代码结构图 - 编码

【通用】

FFmpeg 源代码简单分析:av_register_all()

FFmpeg 源代码简单分析:avcodec_register_all()

FFmpeg 源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)

FFmpeg 源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)

FFmpeg 源代码简单分析:avio_open2()

FFmpeg 源代码简单分析:av_find_decoder()和av_find_encoder()

FFmpeg 源代码简单分析:avcodec_open2()

FFmpeg 源代码简单分析:avcodec_close()

【解码】

图解FFMPEG打开媒体的函数avformat_open_input

FFmpeg 源代码简单分析:avformat_open_input()

FFmpeg 源代码简单分析:avformat_find_stream_info()

FFmpeg 源代码简单分析:av_read_frame()

FFmpeg 源代码简单分析:avcodec_decode_video2()

FFmpeg 源代码简单分析:avformat_close_input()

【编码】

FFmpeg 源代码简单分析:avformat_alloc_output_context2()

FFmpeg 源代码简单分析:avformat_write_header()

FFmpeg 源代码简单分析:avcodec_encode_video()

FFmpeg 源代码简单分析:av_write_frame()

FFmpeg 源代码简单分析:av_write_trailer()

【其它】

FFmpeg源代码简单分析:日志输出系统(av_log()等)

FFmpeg源代码简单分析:结构体成员管理系统-AVClass

FFmpeg源代码简单分析:结构体成员管理系统-AVOption

FFmpeg源代码简单分析:libswscale的sws_getContext()

FFmpeg源代码简单分析:libswscale的sws_scale()

FFmpeg源代码简单分析:libavdevice的avdevice_register_all()

FFmpeg源代码简单分析:libavdevice的gdigrab

【脚本】

FFmpeg源代码简单分析:makefile

FFmpeg源代码简单分析:configure

【H.264】

FFmpeg的H.264解码器源代码简单分析:概述

=====================================================


打算写两篇文章简单分析FFmpeg的写文件用到的3个函数:avformat_write_header(),av_write_frame()以及av_write_trailer()。其中av_write_frame()用于写视频数据,avformat_write_header()用于写视频文件头,而av_write_trailer()用于写视频文件尾。

本文首先分析avformat_write_header()。
PS:
需要注意的是,尽管这3个函数功能是配套的,但是它们的前缀却不一样,写文件头Header的函数前缀是“avformat_”,其他两个函数前缀是“av_”(不太明白其中的原因)。
avformat_write_header()的声明位于libavformat\avformat.h,如下所示。
/** * Allocate the stream private data and write the stream header to * an output media file. * * @param s Media file handle, must be allocated with avformat_alloc_context(). *          Its oformat field must be set to the desired output format; *          Its pb field must be set to an already opened AVIOContext. * @param options  An AVDictionary filled with AVFormatContext and muxer-private options. *                 On return this parameter will be destroyed and replaced with a dict containing *                 options that were not found. May be NULL. * * @return 0 on success, negative AVERROR on failure. * * @see av_opt_find, av_dict_set, avio_open, av_oformat_next. */int avformat_write_header(AVFormatContext *s, AVDictionary **options);
简单解释一下它的参数的含义:
s:用于输出的AVFormatContext。
options:额外的选项,目前没有深入研究过,一般为NULL。
函数正常执行后返回值等于0。

该函数最典型的例子可以参考:
最简单的基于FFMPEG的视频编码器(YUV编码为H.264)

函数调用关系图

avformat_write_header()的调用关系如下图所示。



avformat_write_header()

avformat_write_header()的定义位于libavformat\mux.c,如下所示。
int avformat_write_header(AVFormatContext *s, AVDictionary **options){    int ret = 0;    if (ret = init_muxer(s, options))        return ret;    if (s->oformat->write_header) {        ret = s->oformat->write_header(s);        if (ret >= 0 && s->pb && s->pb->error < 0)            ret = s->pb->error;        if (ret < 0)            return ret;        if (s->flush_packets && s->pb && s->pb->error >= 0 && s->flags & AVFMT_FLAG_FLUSH_PACKETS)            avio_flush(s->pb);    }    if ((ret = init_pts(s)) < 0)        return ret;    if (s->avoid_negative_ts < 0) {        av_assert2(s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_AUTO);        if (s->oformat->flags & (AVFMT_TS_NEGATIVE | AVFMT_NOTIMESTAMPS)) {            s->avoid_negative_ts = 0;        } else            s->avoid_negative_ts = AVFMT_AVOID_NEG_TS_MAKE_NON_NEGATIVE;    }    return 0;}

从源代码可以看出,avformat_write_header()完成了以下工作:
(1)调用init_muxer()初始化复用器
(2)调用AVOutputFormat的write_header()
下面看一下这两个函数。

init_muxer()

init_muxer()用于初始化复用器,它的定义如下所示。
static int init_muxer(AVFormatContext *s, AVDictionary **options){    int ret = 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值