
FFmpeg源代码分析
文章平均质量分 73
FFmpeg基础入门及进阶
Hardy20200507
树立终生学习理念,付诸行动。
展开
-
FFmpeg源代码简单分析:日志输出系统(av_log()等)
本文分析一下FFmpeg的日志(Log)输出系统的源代码。日志输出部分的核心函数只有一个:av_log()。使用av_log()在控制台输出日志的效果如下图所示。函数调用结构图FFmpeg日志输出系统的函数调用结构图如图所示。av_log()av_log()是FFmpeg中输出日志的函数。随便打开一个FFmpeg的源代码文件,就会发现其中遍布着av_log()函数。一般情况下FFmpeg类库的源代码中是不允许使用printf()这种的函数的,所有的输出一律使用av_log()。av_log()原创 2021-05-29 13:46:59 · 442 阅读 · 0 评论 -
FFmpeg源代码简单分析av_write_trailer
av_write_trailer()用于输出文件尾,它的声明位于libavformat\avformat.h,如下所示。/** * Write the stream trailer to an output media file and free the * file private data. * * May only be called after a successful call to avformat_write_header. * * @param s media file han转载 2021-05-26 22:48:35 · 606 阅读 · 0 评论 -
FFmpeg源代码简单分析:av_write_frame()
av_write_frame()用于输出一帧视音频数据,它的声明位于libavformat\avformat.h,如下所示。原创 2021-05-26 22:42:21 · 906 阅读 · 1 评论 -
FFmpeg源代码简单分析:avcodec_encode_video()
本文简单分析FFmpeg的avcodec_encode_video2()函数。该函数用于编码一帧视频数据。avcodec_encode_video2()函数的声明位于libavcodec\avcodec.h,如下所示。/** * Encode a frame of video. * * Takes input raw video data from frame and writes the next output packet, if * available, to avpkt. The outp原创 2021-05-26 21:42:56 · 852 阅读 · 0 评论 -
FFmpeg源代码简单分析:avformat_write_header()
avformat_write_header()用于写视频文件头。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_allo原创 2021-05-26 09:51:49 · 1023 阅读 · 0 评论 -
FFmpeg源代码简单分析:avformat_alloc_output_context2()
本文简单分析FFmpeg中常用的一个函数:avformat_alloc_output_context2()。在基于FFmpeg的视音频编码器程序中,该函数通常是第一个调用的函数(除了组件注册函数av_register_all())。avformat_alloc_output_context2()函数可以初始化一个用于输出的AVFormatContext结构体。它的声明位于libavformat\avformat.h,如下所示。/** * Allocate an AVFormatContext for a原创 2021-05-26 09:11:28 · 539 阅读 · 0 评论 -
FFmpeg源代码简单分析:avformat_close_input()
本文简单分析FFmpeg的avformat_close_input()函数。该函数用于关闭一个AVFormatContext,一般情况下是和avformat_open_input()成对使用的。/** * Close an opened input AVFormatContext. Free it and all its contents * and set *s to NULL. */void avformat_close_input(AVFormatContext **s);函数调用关系图原创 2021-05-25 20:22:36 · 488 阅读 · 0 评论 -
ffmpeg 源代码简单分析 : avcodec_decode_video2()/avcodec_send_packet()/avcodec_receive_frame()
ffmpeg中的avcodec_decode_video2()的作用是解码一帧视频数据。输入一个压缩编码的结构体AVPacket,输出一个解码后的结构体AVFrame。该函数的声明位于libavcodec\avcodec.h,如下所示。avcodec_decode_video2()/** * Decode the video frame of size avpkt->size from avpkt->data into picture. * Some decoders may suppo原创 2021-05-23 16:49:53 · 813 阅读 · 0 评论 -
ffmpeg 源代码分析 : av_read_frame()
ffmpeg中的av_read_frame()的作用是读取码流中的音频若干帧或者视频一帧。例如,解码视频的时候,每解码一个视频帧,需要先调用 av_read_frame()获得一帧视频的压缩数据,然后才能对该数据进行解码(例如H.264中一帧压缩数据通常对应一个NAL)。av_read_frame()的声明位于libavformat\avformat.h,如下所示。/** * Return the next frame of a stream. * This function returns wha转载 2021-05-23 16:21:37 · 539 阅读 · 0 评论 -
FFmpeg源代码简单分析:avformat_find_stream_info()
本文简单分析FFmpeg中一个常用的函数:avformat_find_stream_info()。该函数可以读取一部分视音频数据并且获得一些相关的信息。avformat_find_stream_info()的声明位于libavformat\avformat.h,如下所示。/** * Read packets of a media file to get stream information. This * is useful for file formats with no headers such原创 2021-05-23 15:42:26 · 277 阅读 · 0 评论 -
FFmpeg源代码简单分析:avformat_open_input
FFMPEG打开媒体的的过程开始于avformat_open_input,因此该函数的重要性不可忽视。在该函数中,FFMPEG完成了:输入输出结构体AVIOContext的初始化;输入数据的协议(例如RTMP,或者file)的识别:1判断文件名的后缀 2读取文件头的数据进行比对;使用获得最高分的文件协议对应的URLProtocol,通过函数指针的方式,与FFMPEG连接;剩下的就是调用该URLProtocol的函数进行open,read等操作了可见最终都调用了URLProtocol结构原创 2021-05-23 13:44:00 · 698 阅读 · 0 评论 -
FFmpeg源代码简单分析:avcodec_close()
本文简单分析FFmpeg的avcodec_close()函数。该函数用于关闭编码器。avcodec_close()函数的声明位于libavcodec\avcodec.h,如下所示/** * Close a given AVCodecContext and free all the data associated with it * (but not the AVCodecContext itself). * * Calling this function on an AVCodecContext原创 2021-05-22 14:35:38 · 415 阅读 · 1 评论 -
FFmpeg源代码简单分析:avcodec_open2()
本文简单分析FFmpeg的avcodec_open2()函数。该函数用于初始化一个视音频编解码器的AVCodecContext。avcodec_open2()的声明位于libavcodec\avcodec.h,如下所示。/** * Initialize the AVCodecContext to use the given AVCodec. Prior to using this * function the context has to be allocated with avcodec_allo转载 2021-05-22 14:22:11 · 742 阅读 · 0 评论 -
FFmpeg源代码简单分析:av_find_decoder()和av_find_encoder()
本文记录FFmpeg的两个API函数:avcodec_find_encoder()和avcodec_find_decoder()。avcodec_find_encoder()用于查找FFmpeg的编码器,avcodec_find_decoder()用于查找FFmpeg的解码器。avcodec_find_encoder()的声明位于libavcodec\codec.h,如下所示。/** * Find a registered encoder with a matching codec ID. * *转载 2021-05-17 09:32:00 · 551 阅读 · 0 评论 -
FFmpeg源代码简单分析:avio_open2()
本文简单分析FFmpeg中一个常用的函数avio_open2()。该函数用于打开FFmpeg的输入输出文件。avio_open2()的声明位于libavformat\avio.h文件中,如下所示。/** * Create and initialize a AVIOContext for accessing the * resource indicated by url. * @note When the resource indicated by url has been opened in *转载 2021-05-16 17:04:07 · 846 阅读 · 0 评论 -
FFmpeg源代码简单分析:常见结构体的初始化和销毁(AVFormatContext,AVFrame等)
本文简单分析FFmpeg常见结构体的初始化和销毁函数的源代码。常见的结构体在文章:《FFMPEG中最关键的结构体之间的关系》中已经有过叙述,包括:AVFormatContext:统领全局的基本结构体。主要用于处理封装格式(FLV/MKV/RMVB等)。AVIOContext:输入输出对应的结构体,用于输入输出(读写文件,RTMP协议等)。AVStream,AVCodecContext,AVCodec:视音频流对应的结构体,用于视音频编解码。AVFrame:存储非压缩的数据(视频对应RGB/Y转载 2021-05-14 09:12:16 · 485 阅读 · 0 评论 -
FFmpeg源代码简单分析:内存的分配和释放(av_malloc()、av_free()等)
本文简单记录一下FFmpeg中内存操作的函数。内存操作的常见函数位于libavutil\mem.c中。本文记录FFmpeg开发中最常使用的几个函数:av_malloc(),av_realloc(),av_mallocz(),av_calloc(),av_free(),av_freep()。av_malloc()av_malloc()是FFmpeg中最常见的内存分配函数。它的定义如下。void *av_malloc(size_t size){ void *ptr = NULL;原创 2021-05-13 19:52:21 · 1347 阅读 · 0 评论 -
ffmpeg 源代码简单分析 : avcodec_register_all()
本文分析一下ffmpeg注册编解码器等的函数avcodec_register_all()(注意不是av_register_all(),那是注册所有东西的)。该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才能使用编解码器等。整个代码的过程就是首先确定是不是已经初始化过了(initialized),如果没有,就注册,注册,注册…直到完成所有注册。函数的调用关系图如下图所示。av_register_all()调用了avcodec_register_all()。因此如果调用过原创 2021-05-13 19:27:51 · 351 阅读 · 0 评论 -
FFmpeg 源代码简单分析:av_register_all()
本文分析一下ffmpeg注册复用器,编码器等的函数av_register_all()。该函数在所有基于ffmpeg的应用程序中几乎都是第一个被调用的。只有调用了该函数,才能使用复用器,编码器等。函数调用关系图如下图所示。av_register_all()调用了avcodec_register_all()。avcodec_register_all()注册了和编解码器有关的组件:硬件加速器,解码器,编码器,Parser,Bitstream Filter。av_register_all()除了调用avcode原创 2021-05-13 19:21:55 · 390 阅读 · 0 评论 -
FFmpeg源代码结构图 - 编码
FFmpeg源代码结构图 - 编码函数背景色区域箭头线函数所在的文件函数功能简述参考文献函数背景色函数在图中以方框的形式表现出来。不同的背景色标志了该函数不同的作用:粉红色背景函数:FFmpeg的API函数。白色背景的函数:FFmpeg的内部函数。黄色背景的函数:URLProtocol结构体中的函数,包含了读写各种协议的功能。绿色背景的函数:AVOutputFormat结构体中的函数,包含了读写各种封装格式的功能。蓝色背景的函数:AVCodec结构体中的函数,包含了编解码的功能。区域整个原创 2021-04-27 09:11:09 · 160 阅读 · 0 评论 -
FFmpeg源代码结构图 - 解码
FFmpeg源代码结构图 - 解码函数背景色区域箭头线函数所在的文件函数调用关系参考文献函数背景色函数在图中以方框的形式表现出来。不同的背景色标志了该函数不同的作用:粉红色背景函数:FFmpeg的API函数。白色背景的函数:FFmpeg的内部函数。黄色背景的函数:URLProtocol结构体中的函数,包含处理协议(Protocol)的功能。绿色背景的函数:AVInputFormat结构体中的函数,包含处理封装格式(Format)的功能。蓝色背景的函数:AVCodec结构体中的函数,包含了编解原创 2021-04-27 09:07:52 · 157 阅读 · 0 评论 -
ffmpeg结构体(14)-之AVOption与AVClass
AVOption与AVClass1、AVOption的数据结构与定义2、AVClass数据结构及其定义2.1 AVFormatContext 中的AVClass2.2AVFormatContext 中的AVClass2.3AVFrame中的AVClass3、AVClass有关的APIAVOption用于在FFmpeg中描述结构体中的成员变量。它最主要的作用可以概括为两个字:“赋值”。一个AVOption结构体包含了变量名称,简短的帮助,取值等等信息。所有和AVOption有关的数据都存储在AVClass原创 2021-04-24 17:52:20 · 4221 阅读 · 0 评论 -
ffmpeg结构体(13)-之URLProtocol及其相关函数
URLProtocol及其相关函数原创 2021-04-24 15:27:06 · 275 阅读 · 0 评论 -
ffmpeg结构体(12)-之URLContextl及其相关函数
URLContextl及其相关函数1、URLContextl数据结构及其定义URLContext对象值是在运行过程中根据输入的I/O类型动态确定的。1、URLContextl数据结构及其定义typedef struct URLContext { const AVClass *av_class; /**< information for av_log(). Set by url_open(). */ const struct URLProtocol *prot; vo原创 2021-04-24 15:26:50 · 183 阅读 · 0 评论 -
ffmpeg结构体(11)-之AVOutputFormat及其相关函数
AVOutputFormat及其相关函数1、AVOutputFormat数据结构及定义2、常见变量及其重要函数3、参考文献AVOutpufFormat与AVInputFormat类似,是类似COM 接口的数据结构,表示输出文件容器格式,着重于功能函数,位于Avoformat.h文件中。1、AVOutputFormat数据结构及定义/** * @addtogroup lavf_encoding * @{ */typedef struct AVOutputFormat { const c原创 2021-04-24 15:14:07 · 524 阅读 · 0 评论 -
ffmpeg结构体(10)-之AVInputFormat及其相关函数
AVInputFormat及其相关函数1、AVInputFormat数据结构及其定义2、常用参数及重要函数3、参考文献AVInputFormat 是类似COM 接口的数据结构,表示输入文件容器格式,着重于功能函数,一种文件容器格式对应一个AVInputFormat 结构,在程序运行时有多个实例,位于avoformat.h文件中。1、AVInputFormat数据结构及其定义/** * @} *//** * @addtogroup lavf_decoding * @{ */typedef原创 2021-04-24 15:08:59 · 624 阅读 · 0 评论 -
ffmpeg结构体(9)-之AVIOContext及其相关函数
AVIOContext及其相关函数1、AVIOContext数据结构及其定义2、常见变量及函数2.2avio_alloc_context()函数2.3avio_context_free函数AVIOContext是FFmpeg管理输入输出数据的结构体,位于avio.h文件中。1、AVIOContext数据结构及其定义/** * Bytestream IO Context. * New fields can be added to the end with minor version bumps.原创 2021-04-24 14:48:00 · 510 阅读 · 0 评论 -
ffmpeg结构体(8)-之AVCodecContext及其相关函数
ffmpeg结构体(8)-之AVCodecContext及其相关函数1.AVCodecContext数据结构及定义2、常见变量3、参考文献AVCodecContext是一个描述编解码器上下文的数据结构,包含了众多编解码器需要的参数信息,位于avcodec.h文件中。1.AVCodecContext数据结构及定义/** * main external API structure. * New fields can be added to the end with minor version bump原创 2021-04-24 14:12:52 · 593 阅读 · 0 评论 -
ffmpeg结构体(7)-之AVFormatContext及其相关函数
这里写目录标题1、AVFormatContext定义2、AVFormatContext相关函数2.1、avformat_alloc_context()函数2.2、avformat_free_context()函数3、参考文献AVFormatContext是包含码流参数较多的结构体。1、AVFormatContext定义AVFormatContext定义在文件libavformat\avformat.h中。/** * Format I/O context. * New fields can be原创 2021-04-23 09:13:55 · 527 阅读 · 0 评论 -
ffmpeg结构体(6)-之AVStream及其相关函数
ffmpeg结构体(6)-之AVStream及其相关函数1、结构体定义2、常见变量及其作用AVStream是存储每一个视频/音频流信息的结构体。1、结构体定义/** * Stream structure. * New fields can be added to the end with minor version bumps. * Removal, reordering and changes to existing fields require a major * version bum原创 2021-04-23 08:40:17 · 496 阅读 · 0 评论 -
ffmpeg结构体(5)-之AVCodec及其相关函数
这里写目录标题一级目录二级目录三级目录一级目录二级目录三级目录AVCodec是存储编解码器信息的结构体。本文将会详细分析一下该结构体里每个变量的含义和作用。原创 2021-04-22 20:21:08 · 764 阅读 · 0 评论 -
ffmpeg结构体(4)-之AVBuffer及其相关函数
ffmpeg结构体(4)-之AVBuffer及其相关函数1、数据结构定义1.1 Struct AVBuffer1.2Struct AVBufferRef2. 关键函数实现2.1 av_buffer_alloc()2.2 av_buffer_create()2.3 av_buffer_ref()2.4 av_buffer_unref()3、参考文献AVBuffer是FFmpeg中很常用的一种缓冲区,缓冲区使用引用计数(reference-counted)机制。AVBufferRef则对AVBuffer缓冲原创 2021-04-21 09:33:01 · 805 阅读 · 0 评论 -
ffmpeg结构体(3)-之AVPacket及其相关函数
ffmpeg结构体(3)-之AVPacket及其相关函数1、AVPacket结构体的定义2、AVPacket相关函数2.1av_init_packet()2.2av_new_packet()2.3av_packet_free()3、参考文献struct AVPacket定义于<libavcodec/packet.h>struct AVPacket packet;AVPacket中存储的是经过编码的压缩数据。在解码中,AVPacket由解复用器(demuxer)输出到解码器,保存的是解复原创 2021-04-20 20:02:41 · 600 阅读 · 0 评论 -
ffmpeg结构体(2)-AVFrame及其相关函数
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言提示:这里可以添加本文要记录的大概内容:例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。提示:以下是本篇文章正文内容,下面案例可供参考一、pandas是什么?示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。二、使用步骤1.引入库代码原创 2021-04-20 18:50:08 · 1009 阅读 · 0 评论 -
FFMPEG结构体(1)最关键的结构体之间的关系
FFMPEG中结构体有很多,最关键的结构体可以分为以下几类:1、解协议(http,rtsp,rtmp,mms)AVIOContext,URLProtocol,URLContext主要存储音视频使用的协议的类型及状态。URLProtocol储存输入音视频使用的封装格式;每种协议都对应一个URLProtocol结构。2、解封装(flv,avi,rmvb,mp4)AVFormatContext主要存储音视频封装格式中包含的信息;AVInoutFormat存储输入音视频使用的封装格式;每种音视频封装原创 2021-03-15 10:37:39 · 224 阅读 · 0 评论 -
FFmpeg的主要组成部分
FFmpeg的主要组成部分1、libavformat:用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能,包含demuxers和muxer库;2、libavcodec:用于各种类型声音/图像编解码;3、libavutil:包含一些公共的工具函数;4、libswscale:用于视频场景比例缩放、色彩映射转换;5、libpostproc:用于后期效果处理;6、ffmpeg:是一个命令行工具,用来对视频文件转换格式,也支持对电视卡实时编码;7、ffsev原创 2021-03-15 10:10:20 · 155 阅读 · 1 评论