ffmpeg主要数据结构和函数

上传人:夏** 文档编号:486881665 上传时间:2022-09-11 格式:DOC 页数:18 大小:103.50KB
返回 下载 相关 举报
ffmpeg主要数据结构和函数_第1页
第1页 / 共18页
ffmpeg主要数据结构和函数_第2页
第2页 / 共18页
ffmpeg主要数据结构和函数_第3页
第3页 / 共18页
ffmpeg主要数据结构和函数_第4页
第4页 / 共18页
ffmpeg主要数据结构和函数_第5页
第5页 / 共18页
点击查看更多>>
资源描述

《ffmpeg主要数据结构和函数》由会员分享,可在线阅读,更多相关《ffmpeg主要数据结构和函数(18页珍藏版)》请在金锄头文库上搜索。

1、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(

2、)(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

3、) dump_format()5.其他函数:(1)avpicture_deinterlace()(2)ImgReSampleContext()以下就根据,以上数据结构及函数在ffmpeg测试代码output_example.c中出现的前后顺进行分析。交待完毕进入正题。一.FFMpeg中的数据结构:I. AVFormatContext一般在使用ffmpegsdk的代码中AVFormatContext是一个贯穿始终的数据结构,很多函数都要用到它作为参数。FFmpeg代码中对这个数据结构的注释是:formatI/Ocontext此结构包含了一个视频流的格式内容。其中存有了AVInputFormat(

4、orAVOutputFormat同一时间AVFormatContext内只能存在其中一个),和AVStream、AVPacket这几个重要的数据结构以及一些其他的相关信息,比如title,author,copyright等。还有一些可能在编解码中会用到的信息,诸如:duration,file_size,bit_rate等。参考avformat.h头文件。Useage:声明:AVFormatContext*oc;(1)初始化:由于AVFormatConext结构包含许多信息因此初始化过程是分步完成,而且有些变量如果没有值可用,也可不初始化。但是由于一般声明都是用指针因此一个分配内存过程不可少:o

5、c=av_alloc_format_context();(2)结构中的AVInputFormat*(或AVOutputFormat*)是一定要初始化的,基本上这是编译码要使用什么codec的依据所在:oc-oformat=fmt;oroc-iformat=fmt;(3)其中AVOutputFormat*fmt或AVInputFormat*fmt。(AVInputFormatandAVOutputFormat的初始化在后面介绍。随后在参考代码output_example.c中有一行:snprintf(oc-filename,sizeof(oc-filename),“%s”,filename);(

6、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)此函数会

7、在后面讲到AVStream结构时分析。AVFormatContext最后的一个设置工作是:if(av_set_paramters(oc,NULL)0)(6)/handleerror;dump_format(oc,0,filename,1);(7)作用就是看看先前的初始化过程中设置的参数是否符合规范,否则将报错。上面讲的都是初始化的过程包括AVFormatContext本身的和利用AVFormatContext初始化其他数据结构的。接下来要讲讲整个的编解码过程。我想先将ouput_example.c中main函数内的编解码函数框架描述一下。这样比较清晰,而且编码者为了结构清晰,在写ouput_e

8、xample.c的过程中也基本上在main函数中只保持AVFormatContext和AVStream两个数据结构(AVOutputFormat其实也在但是包含在AVFormatContext中了)。/openvideocodecandallocatethenecessaryencodebuffersif(video_st)open_video(oc,video_st);(8)/writethestreamheader,ifanyav_write_header(oc);(9)/encodeanddecodeprocessfor(;)write_video_frame(oc,video_st);

9、(10)/breakcondition.here/closecodecif(video_st)close_video(oc,video_st);(11)/writethetrailer,ifanyav_write_trailer(oc);(12)/freethestreamsfor(i=0;ib_streams;i+)av_freep(&oc-streamsi-codec);(13)av_freep(&oc-streamsi);(14)/closetheouputfileif(!(fmt-flags&AVFMT_NOFILE)url_fclose(&oc-pb);(15)av_free(oc)

10、;(16)通过以上的一串代码,就可以清晰地看出AVFormatContex*oc和AVStream*video_st是在使用ffmpegSDK开发时贯穿始终的两个数据结构。以下,简要介绍一下三个标为红色的函数,他们是参考代码output_example.c开发者自行定义的函数。这样可以使整个代码结构清晰,当然你在使用ffmpegSDK时也可以在主函数中完成对应的功能。在后面我们会专门针对这三个函数做分析。1.open_video(oc,video_st);此函数主要是对视频编码器(或解码器)的初始化过程。初始化的数据结构为Codec*codec和AVCodecContext*c包括用到了的SD

11、K函数有:c=st-codec;codec=avcodec_find_encoder(c-codec_id);/编码时,找编码器(17)codec=avcodec_find_decoder(c-codec_id);/解码时,找解码器(18)AVCodecContex是结构AVStream中的一个数据结构,因此在AVStream初始化後(5)直接复值给c。/internalopenvideocodecavcodec_open(c,codec);(19)/allocatevideostreambuffer/AVFrame*picture/uint8_t*video_outbufvideo_outb

12、uf_size=200000;video_outbuf=av_maloc(video_outbuf_size);(20)/allocatevideoframebufferpicture=alloc_picture(c-pix_fmt,c-width,c-height);(21)上述三步比较容易理解,打开视频编解码codec、分配输出流缓存大小、分配每一帧图像缓存大小。其中AVFrame也是ffmpeg中主要数据结构之一。这一步(8)是对编解码器的初始化过程。2. write_video_frame(AVFormatContext*oc,AVStream*st)这个函数中做了真正的编解码工作,其

13、中的函数比较复杂先列出来慢慢分析。用到的数据结构有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_conve

14、rt_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格式的。就会有了以上一些处理过程。接下来调用编码器编码,数据规则化(打包)用到AVPacket,这也是ffmpeg中一个比较不好理解的地方。out_size=avcodec_encode_video(c,video_outbuf,video_outbuf_size,picture);(2

15、5)AVPacketpkt;av_init_packet(&pkt);(26)/handlepktprocess,wewillanalyzelaterret=av_write_frame(oc,&pkt);(27)有encode就一定会有decode而且ffmpeg专为解码而生但是为什么在参考代码中只用了encoder呢?个人猜想是因为encode只是用yuv420来编码,这样的yuv420生成比较容易,要是用到解码的化,还要在代码中附带一个其他格式的音视频文件。在源代码libavcodec文件夹中有一个apiexample.c的参考代码,其中就做了编解码。有空的化我会分析一下。3. close_video(AVFormatContext*oc,AVStream*st)avcodec_close(st-codec);av_free(picture-data0);av_free(picture);av_free(video_outbuf);比较容易理解,不多说了。以上一大段虽然名为介绍AVFormatContext。但基本上把ouput

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 解决方案

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号