FFmpeg常用结构体、方法简介

今天先来了解下FFmpeg中我们常用的结构体和方法,防止我们在后面看代码、写代码的时候一脸懵逼。

常用结构体

AVFormatContext

AVFormatContext是音视频数据,也就是音视频文件的一种抽象和封装,该结构体中包含了多路流,包括音频流、视频流、字幕流等,是FFmpeg中一个贯穿全局的数据结构,很多函数都要以它为参数。

结构体定义如下(主要参数):

typedef struct AVFormatContext {
    struct AVInputFormat *iformat; //输入容器格式,用于分流,通过avformat_open_input()设置
    struct AVOutputFormat *oformat; //输出容器格式,用于混流,必须在avformat_write_header()调用前设置
    AVIOContext *pb;  // I/O 上下文
    unsigned int nb_streams; // 流的总数
    AVStream **streams; //所有流的列表,由avformat_new_stream()创建新的流
    int64_t duration; //流的时长
    int64_t bit_rate; //流的比特率
    int64_t probesize; //从指定容器格式的输入中读取最大数据的大小,要足够起播首帧画面
    int64_t max_analyze_duration; //从指定容器格式的输入中读取的最大数据时长
    enum AVCodecID video_codec_id; // 视频的codec_id
    enum AVCodecID audio_codec_id; // 音频的codec_id
    enum AVCodecID subtitle_codec_id; // 字幕的codec_id
    unsigned int max_index_size; // 每条流的最大内存字节数
    unsigned int max_picture_buffer; //从设备获取的实时帧缓冲的最大内存大小
    AVDictionary *metadata; // 整个文件的元数据
    。。。 实在太多了,以后再慢慢了解吧
}AVFormatContext;

AVInputFormat

FFmpeg的解复用器对象,是类似COM接口的数据结构,表示输入文件容器格式,一个文件容器格式对应一个AVInputFormat结构,在程序运行时有多个实例。

AVStream

是存储每一个视频/音频流信息的结构体,位于avoformat.h文件中。使用解复用器从容器中解析出不同的流,在FFmpeg中流的对象就是AVStream,保存在AVFormatContext的streams数组中。

AVCodecContext

描述编解码器上下文的数据结构,包含众多编解码器需要的参数信息。

AVPacket

FFmpeg使用AVPacket来存放编码后的视频帧数据,AVPacket保存了解复用之后、解码之前的数据(仍然是压缩后的数据)和关于这些数据的一些附加信息。AVPacket实际上可用做一个容器,它本身不包含压缩的媒体数据,而是通过data指针引用数据的缓存空间。

AVCodec

存储编解码器信息的结构体。

AVFrame

用来描述解码出的音视频数据,必须使用av_frame_alloc分配,av_frame_free释放。

AVIOContext

文件操作的顶层结构,实现了带缓冲的读写操作。

URLProtocol

是FFmpeg操作文件的结构,包括open、close、read、write、seek等操作。

常用方法

av_register_all

初始化所有组件,只有调用了该函数,才能使用复用器和编解码器(FFmpeg4.0以上被废弃,不推荐使用,可以不调用)。

avformat_alloc_context

AVFormatContext要用avformat_alloc_context()进行初始化,分配内存空间。

avformat_open_input

int avformat_open_input(AVFormatContext **ps, const char *url, AVInputFormat *fmt, AVDictionary **options);

主要功能是打开一个文件,读取header,不会涉及打开解码器,与之对应的是avformat_close_input函数关闭文件。如果打开文件成功,AVFormatContext ps就会在函数中初始化完成。

av_guess_format

AVOutputFormat *av_guess_format(const char *short_name,
                                const char *filename,
                                const char *mime_type);

从所编译的ffmpeg库支持的muxer中查找与文件名有关联的容器类型。

avformat_new_stream

AVStream *avformat_new_stream(AVFormatContext *s, const AVCodec *c);

在 AVFormatContext 中创建新的 Stream 流通道。

avio_open

int avio_open(AVIOContext **s, const char *url, int flags);

用于打开FFmpeg的输入/输出文件。

av_find_best_stream

int av_find_best_stream(AVFormatContext *ic,
                        enum AVMediaType type,
                        int wanted_stream_nb,
                        int related_stream,
                        AVCodec **decoder_ret,
                        int flags);

在文件中找到“最好”的用户所期望的流

av_read_frame

int av_read_frame(AVFormatContext *s, AVPacket *pkt);

读取码流中的若干音频帧或者1帧视频。

av_write_frame

FFmpeg调用avformat_write_header函数写头部信息,av_write_frame函数写1帧数据,调用av_write_trailer写尾部信息。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容