ffmpeg主要数据结构和函数

合集下载

ffmpeg编码函数

ffmpeg编码函数

ffmpeg编码函数FFmpeg是一个免费开源的跨平台音视频处理工具库,提供了许多编码、解码、过滤和播放的函数。

编码函数是其中一部分功能强大的函数,可以将不同格式的音视频文件转换为其他格式。

下面是一些常用的编码函数及其使用方法。

1. avcodec_encode_video2此函数用于编码视频帧。

首先需要初始化编码器的context,然后将需要编码的帧发送给编码器,调用该函数进行编码。

使用方法如下:```AVPacket packet;av_init_packet(&packet);packet.data = NULL;packet.size = 0;AVFrame *frame = av_frame_alloc();//填充帧数据int got_packet;AVCodecContext *enc_ctx = ...;//编码器contextint ret = avcodec_encode_video2(enc_ctx, &packet, frame,&got_packet);if (ret < 0) {//处理错误情况}if (got_packet) {//packet.data是编码后的数据,packet.size是数据大小}av_packet_unref(&packet);av_frame_free(&frame);```2. avcodec_encode_audio2此函数用于编码音频帧。

同样需要先初始化编码器context,将需要编码的帧发送给编码器,调用该函数进行编码。

使用方法如下:```AVPacket packet;av_init_packet(&packet);packet.data = NULL;packet.size = 0;AVFrame *frame = av_frame_alloc();//填充帧数据int got_packet;AVCodecContext *enc_ctx = ...;//编码器contextint ret = avcodec_encode_audio2(enc_ctx, &packet, frame, &got_packet);if (ret < 0) {//处理错误情况}if (got_packet) {//packet.data是编码后的数据,packet.size是数据大小}av_packet_unref(&packet);av_frame_free(&frame);```3. avcodec_send_frame和avcodec_receive_packet这两个函数一般用于编码过程的异步处理。

ffmpeg中avframe的结构

ffmpeg中avframe的结构

ffmpeg中avframe的结构在FFmpeg中,AVFrame是一个重要的数据结构,用于存储音视频帧的关键信息。

它包含了视频或音频帧的像素数据、采样数据以及相关的元数据。

AVFrame结构体的定义如下:```ctypedef struct AVFrame {uint8_t *data[AV_NUM_DATA_POINTERS];int linesize[AV_NUM_DATA_POINTERS];uint8_t **extended_data;int width, height;AVPixelFormat format;[...]} AVFrame;```下面是对其中一些重要字段的解释:1. `data`:是一个指针数组,用于存储视频或音频数据的指针。

对于视频帧,data数组保存了每个平面(plane)的指针,例如YUV 格式中的Y、U和V平面。

对于音频帧,data数组保存了每个声道(channel)的指针。

2. `linesize`:是一个整型数组,用于存储每个平面或声道的行大小(stride)。

这是因为图像或音频数据可能不是连续存储的,可能存在间隔,linesize记录了每行的字节数。

3. `extended_data`:是一个指向data数组的指针,用于访问data中保存的实际数据。

它的作用是提供更方便的访问方式,尤其对于多平面的数据。

4. `width`、`height`:表示帧的宽度和高度。

5. `format`:表示帧的像素格式(对于视频帧)或采样格式(对于音频帧),用枚举值AVPixelFormat或AVSampleFormat表示。

除了上述字段,AVFrame还包含了其他一些用于存储帧的时间戳、时基等元数据的字段。

AVFrame的作用不仅仅是存储音视频数据,还允许进行像素格式转换、音频重采样等操作。

通过访问AVFrame的字段和使用FFmpeg 提供的函数,我们可以从中提取数据,进行各种处理,并将其传递给其他组件,如编码器、解码器或渲染器,以完成音视频处理的任务。

ffmpeg参数

ffmpeg参数

ffmpeg参数
FFmpeg是一款开源的音视频解码和处理软件,已被广泛应用于电影、电视、实时多媒体等领域,可以快速编码、转码、优化、格式转换和录制音频/视频流。

FFmpeg命令行中的参数包括:
-i:指定输入文件的路径。

-y:指定覆盖输出文件的路径,如果路径已存在则会被覆盖。

-b:rate:指定码率,如果不指定使用默认码率。

-c:指定转码后文件的编码格式,支持mpeg4、h264等编码格式。

-s:resize:指定视频的宽高(如1920x1080),如果不指定宽高则按照源文件的宽高比缩放。

-r:可以指定帧率,支持24/25/30/60等帧率设置。

-strict:FFmpeg在支持多种编码格式的同时,默认使用比较古老的标准,可以使用-strict 指定更完善的编码格式。

-ac:指定音频的采样率,可以支持44100Hz、48000Hz、22050等常规采样率。

-an:将音频流剔除,仅抽取视频流。

-t:指定文件截取时长。

-vn:将视频流剔除,仅抽取音频流。

-aspect:指定视频的比例,可以设置4:3或16:9等比例。

-filter_complex:支持通过滤镜操作图片或视频,可以调节饱和度、亮度、对比度等参数。

FFMpeg SDK 开发手册

FFMpeg SDK 开发手册

FFMpeg SDK 开发手册FFMpeg 中比较重要的函数以及数据结构如下:1.数据结构:(1)A VFormatContext(2)A VOutputFormat(3)A VInputFormat(4)A VCodecContext(5)A VCodec(6)A VFrame(7)A VPacket(8)A VPicture(9)A VStream2.初始化函数:(1)av_register_all()(2)avcodec_open()(3)avcodec_close()(4)av_open_input_file()(5)av_find_input_format()(6)av_find_stream_info()(7)av_close_input_file()3.音视频编解码函数:(1)avcodec_find_decoder()(2)avcodec_alloc_frame()(3)avpicture_get_size()(4)avpicture_fill()(5)img_convert()(6)avcodec_alloc_context()(7)avcodec_decode_video()(8)av_free_packet()(9)av_free()4.文件操作:(1)avnew_steam()(2)av_read_frame()(3)av_write_frame()(4)dump_format()5.其他函数:(1)avpicture_deinterlace()(2)ImgReSampleContext()以下就根据,以上数据结构及函数在ffmpeg测试代码output_example.c中出现的前后顺进行分析。

在此之前还是先谈一下ffmpeg的编译问题。

在linux下的编译比较简单,这里不多说了。

在windows下的编译可以参考以下网页:/viewthread.php?tid=1897&extra=page%3D1值得一提的是,在使用编译后的sdk进行测试时(用到ffmpeg目录下的output_example.c)编译过程中可能会有以下两个问题:1.Output_example.c用到了snprintf.h这个头文件。

ffmpeg学习六:avcodec_open2函数源码分析(以mp4文件为例)

ffmpeg学习六:avcodec_open2函数源码分析(以mp4文件为例)

ffmpeg学习六:avcodec_open2函数源码分析(以mp4文件为例)avformat_open_input函数的源码,这个函数的虽然比较复杂,但是它基本是围绕着创建和初始化一些数据结构来展开的,比如,avformat_open_input函数会创建和初始化AVFormatContext,AVClass ,AVOption,URLContext,URLProtocol ,AVInputFormat ,AVStream等数据结构,这些数据结构的关系如下:(这里的箭头是包含关系,不是继承关系)那么,我们可以推测,同样作为Open系列的函数,avcodec_open2的使命也必然是构建和初始化一系列的数据结构,那么是不是这样呢?avcodec_open2函数定义在libavcodec/aviocodec.h中:/*** Initialize the AVCodecContext to use the given AVCodec. Prior to using this* function the context has to be allocated withavcodec_alloc_context3().** The functions avcodec_find_decoder_by_name(),avcodec_find_encoder_by_name(),* avcodec_find_decoder() and avcodec_find_encoder() provide an easy way for* retrieving a codec.** @warning This function is not thread safe!** @note Always call this function before using decoding routines (such as* @ref avcodec_receive_frame()).** @code* avcodec_register_all();* av_dict_set(&opts, "b", "2.5M", 0);* codec = avcodec_find_decoder(AV_CODEC_ID_H264);* if (!codec)* exit(1);** context = avcodec_alloc_context3(codec);** if (avcodec_open2(context, codec, opts) < 0)* exit(1);* @endcode** @param avctx The context to initialize.* @param codec The codec to open this context for. If a non-NULL codec has been* previously passed to avcodec_alloc_context3() or* for this context, then this parameter MUST be either NULL or* equal to the previously passed codec.* @param options A dictionary filled with AVCodecContext and codec-private options.* On return this object will be filled with options that were not found.** @return zero on success, a negative value on error* @see avcodec_alloc_context3(), avcodec_find_decoder(),avcodec_find_encoder(),* av_dict_set(), av_opt_find().*/int avcodec_open2(AVCodecContext *avctx, const AVCodec *codec, AVDictionary **options);从它的注释中我们可以得到如下信息:1.使用所给的AVCodec结构体构造AVCodecContext结构体。

ffmpeg 参数

ffmpeg 参数

ffmpeg 参数FFmpeg参数是一个强大的多媒体处理软件,它可以用来进行编解码、格式转换、流媒体传输等功能。

它通常用于为视频和音频流添加各种特效,提升用户的体验。

本文将详细介绍FFmpeg中的一些经常使用的参数,以及它们的使用场景。

FFmpeg的安装是使用参数的第一步,在Windows操作系统上安装它的方法有很多,包括从官网下载安装程序安装包,也可以使用外部工具来完成安装,比如Ninite。

安装成功后,FFmpeg可以使用参数来进行处理流媒体文件。

FFmpeg中最常用的参数是-i、-f和-c,这三个参数分别表示输入文件、格式和编解码器。

它们可以结合使用,也可以单独使用,比如:-i [filename] //用来指定要处理的流媒体文件-f [format] //来指定输出格式-c [codec] //来指定编解码器除此之外,FFmpeg还提供了-ss和-t两个参数,可以用来设定处理的起始位置和时长。

比如:-ss [time] //用来指定从哪个位置开始处理-t [time] //用来指定处理的时长此外,FFmpeg中还有一些其他参数,比如-a和-v,它们可用来指定音频和视频参数,比如:-a [audio_parameters] //用来指定音频参数-v [video_parameters] //用来指定视频参数此外,我们还可以使用-b参数来指定比特率,以获得更好的压缩效果,比如:-b [bitrate] //用来指定比特率另外,FFmpeg还支持多种不同的参数,可以用来调节图像和音频的质量,比如:-q:a [audio_quality] //用来指定音频质量-q:v [video_quality] //用来指定视频质量FFmpeg还支持添加水印,给视频添加元数据等功能,可以使用-map参数来指定要添加水印的图片:-map [file_name] //用来指定要添加水印的文件最后,FFmpeg还支持其他的一些参数,可以用来控制输出文件的名称、格式、比特率等,比如:-of [output_file] //用来指定输出文件的名称-ofmt [output_format] //用来指定输出文件的格式-ab [bitrate] //用来指定输出文件的比特率以上就是FFmpeg中常用的参数以及它们的使用场景。

ffmpeg 时间函数

ffmpeg 时间函数

FFmpeg 是一个非常强大的开源多媒体处理库和工具集,用于处理音频、视频和其他多媒体文件。

在FFmpeg 中,可以使用时间函数来处理和操作时间相关的信息。

以下是一些常见的FFmpeg 时间函数:1.av_gettime(): 这个函数返回当前的精确时间,单位为微秒(microseconds)。

2.av_usleep(int microseconds): 这个函数让当前线程休眠指定的微秒数。

3.av_sleep(int microseconds): 这个函数与av_usleep类似,但是它允许使用更长的休眠时间。

4.av_gettimeofday(struct timeval *t, struct timezone *tz): 这个函数返回从Epoch(1970年1月1日00:00:00 UTC)到现在的秒数。

5.av_rescale_rnd(int64_t a, int64_t b, int64_t c, enum AVRounding rnd): 这个函数用于重新缩放时间,它可以处理各种不同的时间和分辨率。

6.av_rescale(int64_t a, int64_t b, int64_t c): 类似于av_rescale_rnd,但这个函数使用四舍五入作为舍入方法。

7.av_clip(int a, int min, int max): 这个函数用于将值限制在指定的范围内。

8.av_clip64(int64_t a, int64_t min, int64_t max): 这个函数用于将64 位整数限制在指定的范围内。

9.av_compare_ts(int64_t a, int64_t b, int64_t unit): 这个函数用于比较两个时间戳,返回一个整数,表示它们之间的差异。

10.av_add_ts(int64_t *ts, int64_t add, int64_t unit): 这个函数用于将一个时间戳增加指定的值。

avformatcontext 详解

avformatcontext 详解

avformatcontext 详解在FFmpeg中,A VFormatContext是用于处理音频和视频数据的基本结构。

它是一个用于解析、封装和转换音频和视频格式的核心组件。

本文将详细介绍A VFormatContext的结构及其功能。

一、A VFormatContext概述A VFormatContext是FFmpeg中的核心数据结构,用于处理音频和视频数据。

它包含了有关输入和输出格式的所有信息,如容器格式、编码格式、音频编码器、视频编码器等。

A VFormatContext的主要功能包括:1. 解析输入格式:A VFormatContext可以解析输入文件的格式,包括容器格式、音频编码器和视频编码器等。

2. 创建新的格式:A VFormatContext可以创建新的音频和视频格式,以便在编码和解码过程中使用。

3. 封装输出格式:A VFormatContext可以将编码后的音频和视频数据封装到特定的容器格式中,如MP4、MKV等。

4. 转换格式:A VFormatContext可以在不同的音频和视频格式之间进行转换。

二、A VFormatContext结构A VFormatContext是一个复杂的结构,包含了许多属性和字段。

以下是一些主要属性和字段的简要说明:1. 版本:A VFormatContext的版本号,用于兼容性和未来扩展。

2. 格式类型:表示输入或输出的格式类型,如视频格式、音频格式等。

3. 容器格式:表示输入或输出的容器格式,如MP4、MKV等。

4. 流信息:包含所有流的信息,如流索引、流类型(音频或视频)、编码器、比特率等。

5. 时间基:表示时间戳和持续时间的单位,如毫秒或秒。

6. 帧率:表示视频流的帧率。

7. 音频采样率:表示音频流的采样率。

8. 音频频道布局:表示音频流的通道布局。

9. 字节流信息:包含字节流的起始位置、长度和编码器等信息。

10. 文件指针:指向输入或输出文件的文件指针。

python ffmpeg参数说明

python ffmpeg参数说明

python ffmpeg参数说明FFmpeg是一个开源的多媒体处理工具,可以用于音频和视频文件的转码、剪切、合并等操作。

使用Python调用FFmpeg时,需要理解一些常用的参数说明。

1. `-i`参数:用于指定输入文件,其后面需要跟着输入文件的路径。

例如,`-i input.mp4`表示输入文件为`input.mp4`。

2. `-ss`参数:用于指定从输入文件的哪个时间点开始处理,其后面需要跟着时间戳或时间标识。

例如,`-ss 00:01:30`表示从1分30秒处开始处理。

3. `-t`参数:用于指定处理的时长,其后面需要跟着时间戳或时间标识。

例如,`-t 00:00:30`表示处理30秒的数据。

4. `-s`参数:用于指定输出的分辨率,其后面需要跟着宽度x高度的格式。

例如,`-s 1280x720`表示输出分辨率为1280x720。

5. `-c:v`参数:用于指定视频编码器,其后面需要跟着编码器名称。

例如,`-c:v libx264`表示使用H.264编码器。

6. `-c:a`参数:用于指定音频编码器,其后面需要跟着编码器名称。

例如,`-c:a aac`表示使用AAC编码器。

7. `-b:v`参数:用于指定视频的比特率,其后面需要跟着比特率数值。

例如,`-b:v 1M`表示视频比特率为1Mbps。

8. `-b:a`参数:用于指定音频的比特率,其后面需要跟着比特率数值。

例如,`-b:a 128k`表示音频比特率为128kbps。

9. `-r`参数:用于指定输出的帧率,其后面需要跟着帧率数值。

例如,`-r 30`表示输出帧率为30fps。

以上是一些常用的FFmpeg参数说明,通过灵活组合这些参数,可以完成各种音视频处理任务。

需要根据具体的需求来选择合适的参数组合,以达到预期的效果。

请注意,参数的顺序可以根据需要进行调整,但务必保证参数名称的正确性和完整性。

ffmpeg 参数解释

ffmpeg 参数解释

FFmpeg是一个开源的音视频处理工具,其参数非常复杂,下面列举一些常用的参数及其解释:
--i:指定输入文件路径。

--f:指定输出文件格式。

--vcodec:指定视频编码器。

--acodec:指定音频编码器。

--s:指定输出视频分辨率。

--b:指定输出视频比特率。

--r:指定输出视频帧率。

--y:覆盖输出文件而不进行确认提示。

--c:启用兼容模式,用于旧版与新版之间的转换。

--preset:设置编码速度和压缩比的平衡点。

--crf:设置视频质量的控制参数。

--threads:设置线程数,用于多线程处理。

--max_muxing_queue_size:设置最大复用队列长度,用于控制多线程并发处理的数量。

--stats:显示编码信息统计结果。

--hide_banner:隐藏FFmpeg版本信息和版权信息。

FFMPEG解码流程详细分析

FFMPEG解码流程详细分析

*@注意的业余头不弱者受制与正确的 START_TIME 的业余
*分路器必须不设定此。
*/
int64_t start_time;
/ **
*解码:时间流流时基。
*如果源文件中没有指定的时间,但不指定
*比特率,这个值将被从码率和文件大小的估计。
*/
int64_t duration;
#if LIBAVFORMAT_VERSION_INT < (53<<16)
FFMPEG 解码流程:
1. 注册所有容器格式和 CODEC: av_register_all()
2. 打开文件:
av_open_input_file()
3. 从文件中提取流信息:源自av_find_stream_info()
4. 穷举所有的流,查找其中种类为 CODEC_TYPE_VIDEO
5. 查找对应的解码器:
time_base:流的时间基准,是一个实数,该流中媒体数据的 pts 和 dts 都将以这个时间 基准为粒度。通常,使用 av_rescale/av_rescale_q 可以实现不同时间基准的转换。
start_time:流的起始时间,以流的时间基准为单位,通常是该流中第一个帧的 pts。 duration:流的总时间,以流的时间基准为单位。 need_parsing:对该流 parsing 过程的控制域。 nb_frames:流内的帧数目。 r_frame_rate/framerate/avg_frame_rate:帧率相关。 codec:指向该流对应的 AVCodecContext 结构,调用 avformat_open_input 时生成。 parser:指向该流对应的 AVCodecParserContext 结构,调用 avformat_find_stream_info 时生成。。

ffmpeg参数表

ffmpeg参数表

ffmpeg参数表
FFmpeg是一款常用的跨平台开源多媒体处理工具,支持多种音视频格式的编解码、转换、流媒体处理等功能。

在使用FFmpeg进行音视频处理时,需要使用一些参数来指定操作类型、输入输出文件、编码格式等,下面是FFmpeg常用参数表:
1. 输入和输出文件参数
参数t说明
-itinput,指定输入文件路径
-yt覆盖输出文件
-nt不覆盖输出文件
-ftformat,指定输出文件格式
-codect指定编解码器
-mapt选择输入流进行处理
2. 视频参数
参数t说明
-vframest指定输出视频帧数
-rt指定输出视频帧率
-st指定输出视频分辨率
-bt指定输出视频比特率
-c:vt指定输出视频编码格式
3. 音频参数
参数t说明
-art指定输出音频采样率
-act指定输出音频声道数
-abt指定输出音频比特率
-c:at指定输出音频编码格式
4. 滤镜参数
参数t说明
-vft指定视频滤镜
-aft指定音频滤镜
5. 其他参数
参数t说明
-tt指定输出文件时长
-sst指定输入文件起始时间
-metadatat指定输出文件元数据
-loglevelt指定输出日志级别
以上是FFmpeg常用参数表,根据实际需求选择合适的参数进行设置可以达到更好的音视频处理效果。

ffmpeg简介及命令选项参数

ffmpeg简介及命令选项参数

ffmpeg简介及命令选项参数一、ffmpeg简介 (1)二、ffmpeg基本用法 (1)三、ffmpeg选项 (1)四、ffmpeg使用 (4)一、ffmpeg简介ffmpeg包括一组软件,ffmpeg用于对媒体文件进行处理,ffserver是一个http的流媒体服务器,ffplay是一个基于SDL的简单播放器。

两个库文件libavcodec和libavformat。

ffmpeg项目由以下几部分组成:●ffmpeg 视频文件转换命令行工具,也支持经过实时电视卡抓取和编码成视频文件。

●ffserver 基于HTTP(RTSP正在开发中)用于实时广播的多媒体服务器,也支持时间平移●ffplay 用SDL和FFmpeg库开发的一个简单的媒体播放器●libavcodec 一个包含了所有FFmpeg音视频编解码器的库.为了保证最优性能和高可复用性,大多数编解码器从头开发的.●libavformat 一个包含了所有的普通音视格式的解析器和产生器的库.二、ffmpeg基本用法ffmpeg作为媒体文件处理软件,基本用法如下:ffmpeg -i INPUTfile [OPTIONS] OUTPUTfile输入输出文件通常就是待处理的多媒体文件了。

可以是纯粹的音频文件,纯粹的视频文件,或者混合的。

大部分常见的格式都能够“通杀”。

象常见的各种mpeg,A VI封装的DIVX 和Xvid等等,具体的格式支持列表可以使用ffmpeg -formats查看或直接查阅文档。

另:由于Linux把设备视为文件,因此-i选项后可以跟设备名。

比如DV,视频卡,光驱或者其它的各类设备。

如果没有输入文件,那么视音频捕捉就会起作用。

作为通用的规则,选项一般用于下一个特定的文件。

如果你给–b 64选项,改选会设置下一个视频速率。

对于原始输入文件,格式选项可能是需要的。

缺省情况下,ffmpeg试图尽可能的无损转换,采用与输入同样的音频视频参数来输出。

FFMPEGSDK结构分析

FFMPEGSDK结构分析
件和加载方法。
【 关键 词】 F f mp e g 多媒 体 媒体流 数据帧 编码 解码 中图分类号 : T P 3 9 1 . 4文献标识码 :A 文章编号 : 1 0 0 8 — 1 7 3 9 ( 2 0 1 3 ) 1 1 — 4 8 — 3
A na l ys i s o f FFm pe g S D K St r uc t ur e
e a c h at d a s t r u c t u r e i n he t S DK  ̄ b r a r y i f l e s . h e ̄ t b r a r y le i f s nd a l o a d i n g me ho t d r e q u i r e d b y VC++ d e v e l o p me n t a g e p r e s e n t e d . Ke y wo r d s : F f mp e g ; mu lt i me ia d ; me d i a s r t e a t n ; at d a f r a me ; e n c o d i n g ; d e c o d i n g
me mb e r v a r i a b l e s o f e a c h s t r u c ur t e a l e e pl x a i n e d b r i e l f y , nd a i t s r o l e i n t h e p r o c e s s o f e n c o d i n g a n d d e c o d i n g i s a n ly a z e d . Th e l o c a i t o n o f
技 术 论 坛
4 8 计 算 机 与 网 络 创 新 生 活

ffmpeg 函数

ffmpeg 函数

FFmpeg是一个开源的音视频处理工具,它提供了许多函数和库,可以用于处理音视频数据、转码、流媒体传输等方面的开发。

以下是一些常用的FFmpeg函数:1.avcodec_register_all():注册所有编解码器。

2.avcodec_find_encoder_by_name():根据名称查找编码器。

3.avcodec_open2():打开编解码器并返回上下文。

4.avcodec_send_frame():将输入帧发送给编码器进行编码。

5.avcodec_receive_packet():从编码器接收编码后的输出包。

6.avcodec_close():关闭编解码器并释放资源。

7.av_frame_alloc():分配一个新的帧。

8.av_frame_free():释放帧的内存。

9.av_frame_ref():引用一个已存在的帧。

10.av_frame_clone():克隆一个帧。

11.av_frame_make_writable():使帧可写。

12.av_frame_get_buffer():分配一个新的数据缓冲区给帧。

13.av_frame_release_buffer():释放帧的数据缓冲区。

14.av_packet_alloc():分配一个新的包。

15.av_packet_free():释放包的内存。

16.avformat_open_input():打开输入流并读取元数据。

17.avformat_find_stream_info():读取流信息并填充上下文。

18.avformat_new_stream():创建并添加一个新的流。

19.avformat_write_header():写入文件头并打开输出。

20.avformat_write_uncompressed_header():写入无损文件头。

21.avformat_write_trailer():写入文件尾并关闭输出。

22.avformat_close_input():关闭输入流并释放资源。

avformatcontext avcodeccontext 编码

avformatcontext avcodeccontext 编码

avformatcontext avcodeccontext 编码Avformatcontext和Avcodeccontext编码是关于音视频编码的重要概念。

在音视频处理中,通过使用这两个结构体,可以实现音视频的读取、解码、处理和编码等功能。

本文将对Avformatcontext和Avcodeccontext的定义、常用函数和应用进行介绍。

一、Avformatcontext结构体Avformatcontext是FFmpeg中最重要的数据结构之一,用于存储音视频格式上下文。

它包含了音视频封装格式相关的信息,例如文件名、流数量、流数组等。

通过Avformatcontext,可以对音视频文件进行读取、解封装和封装等操作。

在使用Avformatcontext之前,需要首先进行初始化。

可以通过调用avformat_open_input函数实现初始化。

该函数会打开输入音视频文件,并将相关信息填充到Avformatcontex结构体中。

在Avformatcontext结构体中,比较常用的字段包括:1. filename:音视频文件的路径。

2. nb_streams:音视频流的数量。

3. streams:音视频流数组,每个元素是一个AvStream结构体,存储了各个流的相关信息。

4. duration:音视频文件的时长。

5. metadata:音视频文件的元数据,例如作者、标题、描述等。

6. bit_rate:音视频的总比特率。

通过Avformatcontext结构体,可以实现音视频文件的读取、解封装等操作。

例如,可以通过av_read_frame函数读取音视频帧数据。

二、Avcodeccontext结构体Avcodeccontext是FFmpeg中用于存储编解码器相关信息的结构体。

它包含了音视频编解码器的相关参数,例如编码器类型、编码格式、宽高等。

在音视频处理中,首先需要根据音视频流的编码器信息创建一个Avcodeccontext结构体。

ffmpeg 命令行参数

ffmpeg 命令行参数

ffmpeg 命令行参数FFmpeg是一个强大的音视频处理工具,通过命令行参数可以实现许多复杂的功能。

本文将介绍一些常用的FFmpeg命令行参数及其使用方法。

一、基本参数1. -i 输入文件:指定要处理的音视频文件,可以是本地文件或网络文件。

例如:ffmpeg -i input.mp42. -ss 开始时间:指定从输入文件的哪个时间点开始处理。

例如:ffmpeg -ss 00:00:10 -i input.mp43. -t 持续时间:指定处理的时长。

例如:ffmpeg -t 60 -i input.mp4二、音频参数1. -ab 音频比特率:指定输出音频的比特率。

例如:ffmpeg -i input.mp4 -ab 128k output.mp32. -ar 音频采样率:指定输出音频的采样率。

例如:ffmpeg -i input.mp4 -ar 44100 output.mp33. -ac 音频通道数:指定输出音频的通道数。

例如:ffmpeg -i input.mp4 -ac 2 output.mp3三、视频参数1. -vb 视频比特率:指定输出视频的比特率。

例如:ffmpeg -i input.mp4 -vb 500k output.mp42. -r 帧率:指定输出视频的帧率。

例如:ffmpeg -i input.mp4 -r 30 output.mp43. -s 分辨率:指定输出视频的分辨率。

例如:ffmpeg -i input.mp4 -s 640x480 output.mp4四、格式参数1. -f 输出格式:指定输出文件的格式。

例如:ffmpeg -i input.mp4 -f gif output.gif2. -vcodec 视频编码器:指定输出视频的编码器。

例如:ffmpeg -i input.mp4 -vcodec libx264 output.mp4 3. -acodec 音频编码器:指定输出音频的编码器。

ffmpegAVFrame结构体及其相关函数

ffmpegAVFrame结构体及其相关函数

ffmpegAVFrame结构体及其相关函数0. 简介AVFrame中存储的是原始数据(例如视频的YUV, RGB, ⾳频的PCM), 此外还包含了⼀些相关的信息, 例如: 解码的时候存储了宏块类型表, QP表, 运动⽮量等数据. 编码的时候也存储了相关的数据.1. AVFrame 数据结构定义FFmpeg 版本3.4.1struct AVFrame 定义于<libavutil/frame.h>结构体源码(我去除了注释):1 typedef struct AVFrame {2#define AV_NUM_DATA_POINTERS 834 uint8_t *data[AV_NUM_DATA_POINTERS];56int linesize[AV_NUM_DATA_POINTERS];78 uint8_t **extended_data;910int width, height;1112int nb_samples;1314int format;1516int key_frame;1718enum AVPictureType pict_type;1920 AVRational sample_aspect_ratio;2122 int64_t pts;2324#if FF_API_PKT_PTS2526 attribute_deprecated27 int64_t pkt_pts;28#endif2930 int64_t pkt_dts;3132int coded_picture_number;3334int display_picture_number;3536int quality;3738void *opaque;3940#if FF_API_ERROR_FRAME4142 attribute_deprecated43 uint64_t error[AV_NUM_DATA_POINTERS];44#endif4546int repeat_pict;4748int interlaced_frame;4950int top_field_first;5152int palette_has_changed;5354 int64_t reordered_opaque;5556int sample_rate;5758 uint64_t channel_layout;5960 AVBufferRef *buf[AV_NUM_DATA_POINTERS];6162 AVBufferRef **extended_buf;6364int nb_extended_buf;6566 AVFrameSideData **side_data;67int nb_side_data;6869#define AV_FRAME_FLAG_CORRUPT (1 << 0)7071#define AV_FRAME_FLAG_DISCARD (1 << 2)7273int flags;7475enum AVColorRange color_range;7677enum AVColorPrimaries color_primaries;7879enum AVColorTransferCharacteristic color_trc;8081enum AVColorSpace colorspace;8283enum AVChromaLocation chroma_location;8485 int64_t best_effort_timestamp;8687 int64_t pkt_pos;8889 int64_t pkt_duration;9091 AVDictionary *metadata;9293int decode_error_flags;94#define FF_DECODE_ERROR_INVALID_BITSTREAM 195#define FF_DECODE_ERROR_MISSING_REFERENCE 29697int channels;9899int pkt_size;100101#if FF_API_FRAME_QP102 attribute_deprecated103 int8_t *qscale_table;104105 attribute_deprecated106int qstride;107108 attribute_deprecated109int qscale_type;110111 AVBufferRef *qp_table_buf;112#endif113114 AVBufferRef *hw_frames_ctx;115116 AVBufferRef *opaque_ref;117118 size_t crop_top;119 size_t crop_bottom;120 size_t crop_left;121 size_t crop_right;122 } AVFrame;带有#if ... #end包含的字段, 都是将要被弃⽤或已经弃⽤的. 不再进⾏解释.必须使⽤av_frame_alloc()分配AVFrame, 这只是分配AVFram本⾝.必须使⽤av_frame_free()释放.uint8_t *data[AV_NUM_DATA_POINTERS];原始数据(对视频来说是YUB, RGB, 对⾳频来说是PCM)data是⼀个指针数组, 数组的每⼀个元素都是⼀个指针. 指向视频中图像的某⼀plane或者⾳频中某⼀声道的plane.对于packed格式, ⼀个YUV图像的Y, U, V交织存储在⼀个plane中, 例如: YUVYUVYUV... ..., data[0]指向这个plane;⼀个双声道的⾳频帧有左声道L和右声道R, 它们交织存储在⼀个plane中, 例如: LRLRLR... ..., data[0]指向这个plane.对于planar格式, ⼀个YUV图像有Y, U, V三个plane, data[0]指向Y plane, data[1]质量U plane, data[2]指向V plane.⼀个双声道的⾳频帧有左声道L和右声道R两个plane, data[0]指向L plane, data[1]指向R planeint linesize[AV_NUM_DATA_POINTERS];对于视频来说, linesize是每⾏图像的⼤⼩(字节数, 有字节对齐).对于⾳频来说, linesize是每个plane的⼤⼩(字节数). ⾳频只是⽤linesize[0]. 对于planar⾳频来说, 每个plane的⼤⼩必须⼀样.linesize可能会因为性能上的考虑⽽填充⼀些额外的数据, 因此linesize可能⽐实际对应的⾳视频数据尺⼨要⼤.uint8_t **extended_data; 指向数据planeint width, height;视频帧像素宽和⾼.int nb_samples;⾳频帧中单个声道包含的采样点数.int format;帧格式. 如果是未知格式或未设置, 值为-1.对于视频帧, 值对应enum AVPixelFormat结构:1enum AVPixelFormat {2 AV_PIX_FMT_NONE = -1,3 AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)4 AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr5 AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB...6 AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR...7 AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples)8 AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples)... ...};对于⾳频帧, 值对应于enum AVSampleFormat结构:1enum AVSampleFormat {2 AV_SAMPLE_FMT_NONE = -1,3 AV_SAMPLE_FMT_U8, ///< unsigned 8 bits4 AV_SAMPLE_FMT_S16, ///< signed 16 bits5 AV_SAMPLE_FMT_S32, ///< signed 32 bits6 AV_SAMPLE_FMT_FLT, ///< float7 AV_SAMPLE_FMT_DBL, ///< double89 AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar10 AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar11 AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar12 AV_SAMPLE_FMT_FLTP, ///< float, planar13 AV_SAMPLE_FMT_DBLP, ///< double, planar14 AV_SAMPLE_FMT_S64, ///< signed 64 bits15 AV_SAMPLE_FMT_S64P, ///< signed 64 bits, planar1617 AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically18};int key_frame;视频帧是否是关键帧的标识, 1: 关键帧; 0: ⾮关键帧.enum AVPictureType pict_type;视频帧类型(I, B, P等)enum AVPictureType结构:1enum AVPictureType {2 AV_PICTURE_TYPE_NONE = 0, ///< Undefined3 AV_PICTURE_TYPE_I, ///< Intra4 AV_PICTURE_TYPE_P, ///< Predicted5 AV_PICTURE_TYPE_B, ///< Bi-dir predicted6 AV_PICTURE_TYPE_S, ///< S(GMC)-VOP MPEG-47 AV_PICTURE_TYPE_SI, ///< Switching Intra8 AV_PICTURE_TYPE_SP, ///< Switching Predicted9 AV_PICTURE_TYPE_BI, ///< BI type10};AVRational sample_aspect_ratio;视频帧的宽⾼⽐.int64_t pts;显⽰时间戳. 单位是time_base.int64_t pkt_dts;对应packet中的解码时间戳. 是从对应pacekt中拷贝得到此值.如果对应的packet中只有dts⽽未设置pts, 则此值也是frame的pts.int coded_picture_number;编码帧序号.int display_picture_number;显⽰帧序号int quality;品质(介于1(最好)和FF_LAMBDA_MAX(坏)之间)void *opaque;⽤户私有信息.int repeat_pict;解码时, 每帧图⽚的延迟时间.extra_delay = repeat_pict / (2*fps)int interlaced_frame;是否是隔⾏扫描.int top_field_first;图像的top field first变量. 如果内容是隔⾏的, 则⾸先显⽰顶部字段.int palette_has_changed;告诉⽤户应⽤程序调⾊板已从上⼀帧更改int sample_rate;⾳频采样率.uint64_t channel_layout;⾳频声道布局. 每bit代表⼀个特定的声道.参考源码channel_layout.h中定义:1#define AV_CH_FRONT_LEFT 0x000000012#define AV_CH_FRONT_RIGHT 0x000000023#define AV_CH_FRONT_CENTER 0x000000044#define AV_CH_LOW_FREQUENCY 0x000000085#define AV_CH_BACK_LEFT 0x000000106 ... ...78#define AV_CH_LAYOUT_MONO (AV_CH_FRONT_CENTER)9#define AV_CH_LAYOUT_STEREO (AV_CH_FRONT_LEFT|AV_CH_FRONT_RIGHT)10#define AV_CH_LAYOUT_2POINT1 (AV_CH_LAYOUT_STEREO|AV_CH_LOW_FREQUENCY)11#define AV_CH_LAYOUT_2_1 (AV_CH_LAYOUT_STEREO|AV_CH_BACK_CENTER)12#define AV_CH_LAYOUT_SURROUND (AV_CH_LAYOUT_STEREO|AV_CH_FRONT_CENTER)13#define AV_CH_LAYOUT_3POINT1 (AV_CH_LAYOUT_SURROUND|AV_CH_LOW_FREQUENCY)14 ... ...AVBufferRef *buf[AV_NUM_DATA_POINTERS];此帧的数据可以由AVBufferRef管理, AVBufferRef提供AVBuffer引⽤机制.如果buf[]的所有元素都为NULL, 则此帧不会被引⽤计数.必须连续填充buf[], 如果buf[i]为⾮NULL, 则对所有的j < i, 也必须有b[j]必须为⾮NULL.对于视频来说, buf[]包含所有的AVBufferRef指针.对于具有多于AV_NUM_DATA_POINTERS个声道的planar⾳频来说, 可能buf[]存不下所有的AVBufferRef指针, 多出的AVBufferRef指针存储在extended_buf数组中.AVBufferRef **extended_buf;对于具有多于AV_NUM_DATA_POINTERS个声道的planar⾳频来说, 可能buf[]存不下所有的AVBufferRef指针, 多出的AVBufferRef指针存储在extended_buf数组中.int nb_extended_buf;extended_buf中元素的数⽬.AVFrameSideData **side_data;边缘数据int nb_side_data;边缘数据的数⽬int64_t best_effort_timestamp;在流时间基中估计帧时间戳.编码时未使⽤解码时由解码器设置. ⽤户读取.int64_t pkt_pos;记录最后⼀个扔进解码器的packet在输⼊⽂件中的位置偏移量.int64_t pkt_duration;对应packet的时长, 单位是AVStream->time_base.int channels;⾳频声道数量.int pkt_size;对应packet的⼤⼩.size_t crop_top;size_t crop_bottom;size_t crop_left;size_t crop_right;⽤于视频帧图像裁切. 四个值分别为从frame的上/下/左/右边界裁切的像素数.这写成员暂时没有找到完美的解释(可能也不是很重要或不太常⽤)int flags;enum AVColorRange color_range;enum AVColorPrimaries color_primaries;enum AVColorTransferCharacteristic color_trc;enum AVColorSpace colorspace;enum AVChromaLocation chroma_location;AVDictionary *metadata;int decode_error_flags;AVBufferRef *hw_frames_ctx;AVBufferRef *opaque_ref;2. 相关函数AVFrame *av_frame_alloc(void);构造⼀个AVFrame, 对象成员被设为默认值.此函数只分配AVFrame对象本⾝, ⽽不分配AVFrame中的数据缓存区.void av_frame_free(AVFrame **frame);释放AVFrame.int av_frame_ref(AVFrame *dst, const AVFrame *src);为src中的数据建⽴⼀个新的引⽤.将src中帧的各属性拷到dst中, 并且为src中每个AVBufferRef创建⼀个新的引⽤.如果src未使⽤引⽤计数, 则dst中会分配新的数据缓存区, 将src中缓存区的数据拷贝到dst中的缓存区.AVFrame *av_frame_clone(const AVFrame *src);创建⼀个新的AVFrame, 新的AVFrame和src使⽤统⼀数据缓存区, 缓存区管理使⽤引⽤计数机制.void av_frame_unref(AVFrame *frame);解除本AVFrame对AVFrame中所有缓存区的引⽤, 并复位AVFrame中的各成员.void av_frame_move_ref(AVFrame *dst, AVFrame *src);将src中所有数据拷贝到dst中, 并复位src.为避免内存泄漏, 在调⽤av_frame_move_ref(dst, src)之前应先调⽤av_frame_unref(dst);int av_frame_get_buffer(AVFrame *frame, int align);为⾳频或视频数据分配新的缓冲区.调⽤本函数前, 帧中的以下成员必须先设置好:formatwidth, heightnb_samples, channel_layout本函数会填充AVFrame.data和AVFrame.buf数组, 如果有需要, 还会分配和填充AVFrame.extended_data和AVFrame.extended_buf.对于planar格式, 回味每个plane分配⼀个缓冲区.int av_frame_copy(AVFrame *dst, const AVFrame *src);将src中的帧数据拷贝到dst中.本函数并不会有任何分配缓冲区的动作, 调⽤此函数前dst必须已经使⽤了和src同样的参数完成了初始化.本函数只拷贝帧中的数据缓冲区的内容, ⽽不涉及帧中的其它属性.参考。

avformat_alloc_context详解

avformat_alloc_context详解

avformat_alloc_context详解1. avformat_alloc_context是FFmpeg中的一个重要函数,用于创建一个AVFormatContext对象。

在使用FFmpeg进行音视瓶处理时,我们经常会涉及到AVFormatContext对象的创建和使用,因此了解avformat_alloc_context函数的细节和用法对于掌握FFmpeg的使用至关重要。

2. AVFormatContext是FFmpeg中非常重要的一个数据结构,它用于存储音视瓶文件的格式相关信息,包括文件的封装格式、音视瓶流的信息、时长、字幕等。

在进行音视瓶的解码、编码、封装、解封装等操作时,我们需要使用AVFormatContext对象来操作音视瓶文件。

3. avformat_alloc_context函数的原型如下所示:```cAVFormatContext *avformat_alloc_context(void);```4. 此函数用于分配并返回一个AVFormatContext对象。

在使用AVFormatContext对象之前,我们需要先调用avformat_alloc_context来创建一个AVFormatContext对象,然后再对其进行初始化和设置。

5. AVFormatContext对象的创建是在进行音视瓶文件的输入输出操作时必不可少的一步。

在进行文件的解码或编码时,我们需要使用AVFormatContext对象来管理和操作音视瓶流,因此avformat_alloc_context函数是一个非常常用的函数。

6. 在使用avformat_alloc_context函数时,需要注意以下几点:- 在调用avformat_alloc_context函数分配AVFormatContext对象后,需要调用avformat_free_context来释放AVFormatContext 对象的内存;- 在调用avformat_alloc_context函数后,需要对返回的AVFormatContext对象进行初始化,一般通过调用avformat_open_input、avformat_new_stream等函数来进行初始化;- avformat_alloc_context函数是在libavformat库中定义的,因此在使用时需要加入相应的头文件,并信息libavformat库。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

FFMpeg 中比较重要的函数以及数据结构如下:1. 数据结构:(1) AVFormatContext(2) AVOutputFormat(3) AVInputFormat(4) AVCodecContext(5) AVCodec(6) AVFrame(7) AVPacket(8) AVPicture(9) AVStream2. 初始化函数:(1) av_register_all()(2) avcodec_open()(3) avcodec_close()(4) av_open_input_file()(5) av_find_input_format()(6) av_find_stream_info()(7) av_close_input_file()3. 音视频编解码函数:(1) avcodec_find_decoder()(2) avcodec_alloc_frame()(3) avpicture_get_size()(4) avpicture_fill()(5) img_convert()(6) avcodec_alloc_context()(7) avcodec_decode_video()(8) av_free_packet()(9) av_free()4. 文件操作:(1) avnew_steam()(2) av_read_frame()(3) av_write_frame()(4) dump_format()5. 其他函数:(1) avpicture_deinterlace()(2) ImgReSampleContext()以下就根据,以上数据结构及函数在ffmpeg测试代码output_example.c中出现的前后顺进行分析。

交待完毕进入正题。

一.FFMpeg 中的数据结构:I. AVFormatContext一般在使用ffmpeg sdk的代码中AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。

FFmpeg代码中对这个数据结构的注释是:format I/O context 此结构包含了一个视频流的格式内容。

其中存有了AVInputFormat(or AVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream、AVPacket这几个重要的数据结构以及一些其他的相关信息,比如title,author,copyright 等。

还有一些可能在编解码中会用到的信息,诸如:duration, file_size, bit_rate等。

参考avformat.h头文件。

Useage:声明:AVFormatContext *oc; (1)初始化:由于AVFormatConext结构包含许多信息因此初始化过程是分步完成,而且有些变量如果没有值可用,也可不初始化。

但是由于一般声明都是用指针因此一个分配内存过程不可少:oc = av_alloc_format_context(); (2)结构中的AVInputFormat*(或AVOutputFormat*)是一定要初始化的,基本上这是编译码要使用什么codec的依据所在:oc->oformat = fmt; or oc->iformat = fmt; (3)其中AVOutputFormat* fmt或AVInputFormat* fmt。

(AVInputFormat and AVOutputForm at的初始化在后面介绍。

随后在参考代码output_example.c中有一行:snprintf(oc-filename, sizeof(oc->filename), “%s”, filename); (4)还不是十分清楚有什么作用,估计是先要在输出文件中写一些头信息。

在完成以上步骤後,(初始化完毕AVInputFormat*(或AVOutputFormat*)以及AVFormatContext)接下来就是要利用oc初始化本节开始讲到的AVFormatContext中的第二个重要结构。

AVStream(假设已经有了声明AVStream *video_st。

参考代码用了一个函数来完成初始化,当然也可以在主函数中做,传递进函数的参数是oc 和fmt->video_codec(这个在下一节介绍(29)):vdeo_st = add_video_stream(oc, fmt->video_codec); (5)此函数会在后面讲到AVStream结构时分析。

AVFormatContext最后的一个设置工作是:if( av_set_paramters(oc,NULL) < 0){ (6)//handle error;}dump_format(oc, 0, filename, 1); (7)作用就是看看先前的初始化过程中设置的参数是否符合规范,否则将报错。

上面讲的都是初始化的过程,包括AVFormatContext本身的和利用AVFormatContext初始化其他数据结构的。

接下来要讲讲整个的编解码过程。

我想先将ouput_example.c中main函数内的编解码函数框架描述一下。

这样比较清晰,而且编码者为了结构清晰,在写ouput_example.c的过程中也基本上在main 函数中只保持AVFormatContext和AVStream两个数据结构(AVOutputFormat其实也在但是包含在AVFormatContext中了)。

// open video codec and allocate the necessary encode buffersif(video_st)open_video(oc, video_st); (8)// write the stream header, if anyav_write_header(oc); (9)// encode and decode processfor(; ;){write_video_frame(oc, video_st); (10)// break condition…here}//close codecif(video_st)close_video(oc, video_st); (11)//write the trailer , if anyav_write_trailer(oc); (12)// free the streamsfor(i=0; i<oc->b_streams; i++){av_freep(&oc->streams[i]->codec); (13)av_freep(&oc->streams[i]); (14)}//close the ouput fileif(!(fmt->flags & AVFMT_NOFILE)){url_fclose(&oc->pb); (15)}av_free(oc); (16)通过以上的一串代码,就可以清晰地看出AVFormatContex* oc和AVStream* video_st是在使用ffmpeg SDK开发时贯穿始终的两个数据结构。

以下,简要介绍一下三个标为红色的函数,他们是参考代码output_example.c开发者自行定义的函数。

这样可以使整个代码结构清晰,当然你在使用ffmpeg SDK时也可以在主函数中完成对应的功能。

在后面我们会专门针对这三个函数做分析。

1. open_video(oc, video_st);此函数主要是对视频编码器(或解码器)的初始化过程。

初始化的数据结构为AVCodec* codec和AVCodecContext* c包括用到了的SDK函数有:c = st->codec;codec = avcodec_find_encoder(c->codec_id); //编码时,找编码器(17)codec = avcodec_find_decoder(c->codec_id); //解码时,找解码器(18)AVCodecContex是结构AVStream中的一个数据结构,因此在AVStream初始化後(5)直接复值给c。

// internal open video codecavcodec_open(c,codec); (19)// allocate video stream buffer// AVFrame *picture// uint8_t *video_outbufvideo_outbuf_size=200000;video_outbuf = av_maloc(video_outbuf_size); (20)// allocate video frame bufferpicture = alloc_picture(c->pix_fmt, c->width, c->height); (21)上述三步比较容易理解,打开视频编解码codec、分配输出流缓存大小、分配每一帧图像缓存大小。

其中AVFrame也是ffmpeg中主要数据结构之一。

这一步(8)是对编解码器的初始化过程。

2. write_video_frame(AVFormatContext *oc, AVStream *st)这个函数中做了真正的编解码工作,其中的函数比较复杂先列出来慢慢分析。

用到的数据结构有AVCodecContext *c, SwsContext *img_convert_ctx。

其中SwsContext是用来变换图像格式的。

比如yuv422变到yuv420等,当然也用到函数,见下面列表。

fill_yuv_image(tmp_picture, frame_count, c->width, c->height); (22)sws_scale(img_convert_ctx, tmp_picture->, tmp_picture->linesize,0, c->height, picture->data, picture->linesize); (23)img_convert_ctx = sws_getContxt(c->width, c->height, PIX_FMT_YUV420P, (24)c->width, c->heigth, c->pix_fmt, sws_flags, NULL, NULL, NULL);由于参考代码中做的是一个编码。

因此,它总是要求编码器输入的是yuv文件,而且是yuv420格式的。

相关文档
最新文档