编解码流程

上传人:好** 文档编号:99557664 上传时间:2019-09-19 格式:DOCX 页数:9 大小:39.16KB
返回 下载 相关 举报
编解码流程_第1页
第1页 / 共9页
编解码流程_第2页
第2页 / 共9页
编解码流程_第3页
第3页 / 共9页
编解码流程_第4页
第4页 / 共9页
编解码流程_第5页
第5页 / 共9页
点击查看更多>>
资源描述

《编解码流程》由会员分享,可在线阅读,更多相关《编解码流程(9页珍藏版)》请在金锄头文库上搜索。

1、 FFMPEG编解码流程一基础知识介绍在介绍FFMpeg编解码流程之前,先了解一下FFMpeg用到的头文件和库,还有一些主要的数据结构。1.头文件头文件的引入extern C#include libavcodec/avcodec.h#include libavformat/avformat.h#include libavutil/avutil.h#include libavutil/mem.h#include libavutil/fifo.h#include libswscale/swscale.h;libavcodec用于存放各个encode/decode模块,CODEC其实是Coder和D

2、ecoder的缩写,也就是编码解码器,用于各种类型声音和图像的编解码。libavformat用于存放muxer/demuxer模块,对音频视频格式的解析;用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能。libswscale:用于视频场景比例缩放、色彩映射转换;2.数据结构以下介绍的数据结构定义在libavcodec/avcodec.h中。AVFormatContextTypedef struct AVFormatContext AVOutputFormat *oformat; AVInputFormat *iformat; Unsigned i

3、nt nb_streams; AVStream *streams; AVFormatContext是FFMpeg格式转换过程中实现输入和输出功能,保存相关数据的主要结构,其作用贯穿整个编解码过程。对于输入 输出需要分别对iformat和oformat赋值,在一个AVFormatContext结构变量中,oformat和iformat不能同时有值。streams中保存了媒体文件的流信息,在解码时由av_find_stream_info()函数初始化,编码时需要使用者建立流并手动初始化,nb_streams是流的数量。AVStreamTypedef struct AVStream int inde

4、x; AVCodecContext *codec; AVRational time_base; int64 duration; int64 nb_frames; AVStream保存与数据流相关的编解码器,数据段等信息。codec保存的是encoder或者decoder的上下文信息。time_base在解码时由解码器设置,编码时在av_write_header()函数中设置,在计算pts时会用到。Duration是流的总时间长度,nb_frames记录流的总帧数。 AVCodecContext Typedef struct AVCodecContext Struct AVCodec *code

5、c; enum AVMediaType codec_type; enum CodecID codec_id; 编解码器共用AVCodecContext和AVCodec结构,codec中保存编解码器参数,codec_type保存的AVMEDIA_TYPE_VIDEO,AVMEDIA_TYPE_AUDIO等媒体流的类型,codec_id保存编解码方式。AVCodecContext中还包含其他一些重要的数据,如video的width,height,pix_fmt,audio的sample_rate等参数。这些参数在解码时由decoder设置,而编码是要有用户手动设置,如果参数设置错误或者没有设置,会

6、导致avcodec_open()调用失败。AVCodec Typedef struct AVCodec.Enum AVMediaType type;Enum CodecID id; int (*init)(AVCodecContext *); int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data);int (*close)(AVCodecContext *); int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket

7、 *avpkt); AVPacket Typedef struct AVPacket Int64 pts; Int64 dts; Uint8_t *data; Int size; Int stream_index; Int flags; . AVPacket在读媒体文件和输出媒体文件时都会用到。在读媒体文件时av_read_frame(&Packet)会初始化AVPacket数据结构,而用于写媒体文件时,用户需要自己设置参数,以上列出的变量是需要用户自己设置的。pts是显示时间戳,在编码是需要结合流的time_base和编码器的time_base计算,以保持音视频同步播放。dts是解码时间戳。

8、data中保存了读媒体文件或者需要输出的数据。stream_index在流的序号。AVPacket结构变量在使用前要调用av_init_packet(AVPacket *pkt)初始化,使用完要调用av_free_packet(AVPacket *pkt)释放资源。二FFMPEG编解码流程1初始化系统环境avcodec_init();/初始化libavcodecav_register_all(); /初始化 libavformat和注册所有的muxers、/demuxers和protocolsav_log_set_callback(stateFunc);/注册回调函数 av_register_

9、all()主要包括avcodec_register_all()函数和一大堆注册demuxer、muxers、protocols的宏。avcodec_register_all()包括一大堆注册encodec、decoder、parser、bitstream filter的宏。av_register_all()函数只需要调用一次,它注册了所有支持的媒体文件格式和编解码器的库,当媒体文件打开时会自动匹配合适的编解码器。注册回调函数的原型为 void av_log_set_callback(void(*callback)(void*,intconstchar*,va_list),FFMpeg 目录下l

10、ibavutil/log.c中有一个默认的回调函数,av_log_default_callback(void *ptr,int level,const char *fmt,va_list),可以模仿这个函数写自己的回调函数。注册回调函数之后,我们就可以获得FFMpeg底层运行时错误信息。/查看设置的信息void av_dump_format(AVFormatContext *ic,int index,const char *url,int is_output);该函数将相应流及编解码器的信息显示到标准错误输出中,ic是对应输入 输出文件的上下文信息结构变量,url为对应输入或输出文件名,is_

11、output 输入文件时取值0,输出文件时取值1,index可以取值0。2读取输入文件头信息 AVFormatcontext *pIC;av_open_input_file(&pIC, filename,NULL,0,NULL); /打开视频文件,并将文件头信息保存在AVFormatContext *pIC数据结构/中返回,filename为输入文件名。av_find_stream_info(pIC);/初始化文件音视频流的信息pIC-streamsav_open_input_file()函数打开一个媒体文件,如果媒体文件存在头信息,就读取文件头信息来初始化pIC,主要初始化pIC-iform

12、at结构,函数的最后三个参数用来指定特殊的文件格式,缓冲大小和格式参数,但如果把它们设置为空NULL或者0,libavformat将自动检测这些参数。这个函数只是检测了文件头信息,所以我们需要检测文件中流的信息。av_find_stream_info()函数,从文件中提取流的信息,然后填充在AVFormatContext结构的streams区域,最主要的初始化了流对应的解码器上下文信息和流所属的类型。3初始化音视频解码器/穷举所有的流,查找音视频流,视频流举例int videostream = -1;for(int i = 0; i nb_stream; +i) if(pIC-streamsi

13、ndex-codec-codec_type = AVMEDIA_TYPE_VIDEO) videostream = i; break; AVCodecContext *pICCtx = pIC-streamsvideostream-codec; AVCodec *pIC =avcodec_find_decoder(pICCtx-codec_id);/查找相应的解码器 avcodec_open(pICCtx,pIC);/ 打开对应的解码器/应记录输入文件的流信息,以便建立输出文件流时使用。FFMpeg中定义媒体文件中流的类型包括AVMEDIA_TYPE_VIDEO,AVMEDIA_TYPE_AU

14、DIO等,这儿我们只关心video和audio类型的流,找到音视频流并打开相应的解码器。4初始化音视频编码器 .根据输出文件猜测音视频编码器类型 AVOutputFormat * pO = av_guess_format(NULL,filename,NULL); /根据输出文件名 或者后缀猜测音视频编码器格式 AVFormatContext *pOut = avformat_alloc_context(); /最后使用avformat_free_context()释放 pOut-oformat = pO;av_guess_format()主要根据输出文件格式猜测支持的音视频编码器,初始化pO-audio_codec和pO-video_codec,后面用户可以根据猜测出的音视频编码器类型创建编码器。.为输出文件添加音视频流AVStream *pS = av_new_stream(pOut,NULL);输出文件中流的建立需要对应输入文件中存在的流,

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

当前位置:首页 > 办公文档 > 事务文书

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