注:写了一系列的结构体的分析的文章,在这里列一个列表:
FFMPEG结构体分析:AVFrame
FFMPEG结构体分析:AVFormatContext
FFMPEG结构体分析:AVCodecContext
FFMPEG结构体分析:AVIOContext
FFMPEG结构体分析:AVCodec
FFMPEG结构体分析:AVStream
FFMPEG结构体分析:AVPacket
FFMPEG有几个最重要的结构体,包含了解协议,解封装,解码操作,此前已经进行过分析:
在此不再详述,其中AVCodec是存储编解码器信息的结构体。本文将会详细分析一下该结构体里每个变量的含义和作用。
首先看一下结构体的定义(位于avcodec.h文件中):
/* 雷霄骅 * 中国传媒大学/数字电视技术 * leixiaohua1020@126.com * */ /** * AVCodec. */ typedef struct AVCodec { /** * Name of the codec implementation. * The name is globally unique among encoders and among decoders (but an * encoder and a decoder can share the same name). * This is the primary way to find a codec from the user perspective. */ const char *name; /** * Descriptive name for the codec, meant to be more human readable than name. * You should use the NULL_IF_CONFIG_SMALL() macro to define it. */ const char *long_name; enum AVMediaType type; enum CodecID id; /** * Codec capabilities. * see CODEC_CAP_* */ int capabilities; const AVRational *supported_framerates; ///< array of supported framerates, or NULL if any, array is terminated by {0,0} const enum PixelFormat *pix_fmts; ///< array of supported pixel formats, or NULL if unknown, array is terminated by -1 const int *supported_samplerates; ///< array of supported audio samplerates, or NULL if unknown, array is terminated by 0 const enum AVSampleFormat *sample_fmts; ///< array of supported sample formats, or NULL if unknown, array is terminated by -1 const uint64_t *channel_layouts; ///< array of support channel layouts, or NULL if unknown. array is terminated by 0 uint8_t max_lowres; ///< maximum value for lowres supported by the decoder const AVClass *priv_class; ///< AVClass for the private context const AVProfile *profiles; ///< array of recognized profiles, or NULL if unknown, array is terminated by {FF_PROFILE_UNKNOWN} /***************************************************************** * No fields below this line are part of the public API. They * may not be used outside of libavcodec and can be changed and * removed at will. * New public fields should be added right above. ***************************************************************** */ int priv_data_size; struct AVCodec *next; /** * @name Frame-level threading support functions * @{ */ /** * If defined, called on thread contexts when they are created. * If the codec allocates writable tables in init(), re-allocate them here. * priv_data will be set to a copy of the original. */ int (*init_thread_copy)(AVCodecContext *); /** * Copy necessary context variables from a previous thread context to the current one. * If not defined, the next thread will start automatically; otherwise, the codec * must call ff_thread_finish_setup(). * * dst and src will (rarely) point to the same context, in which case memcpy should be skipped. */ int (*update_thread_context)(AVCodecContext *dst, const AVCodecContext *src); /** @} */ /** * Private codec-specific defaults. */ const AVCodecDefault *defaults; /** * Initialize codec static data, called from avcodec_register(). */ void (*init_static_data)(struct AVCodec *codec); int (*init)(AVCodecContext *); int (*encode)(AVCodecContext *, uint8_t *buf, int buf_size, void *data); /** * Encode data to an AVPacket. * * @param avctx codec context * @param avpkt output AVPacket (may contain a user-provided buffer) * @param[in] frame AVFrame containing the raw data to be encoded * @param[out] got_packet_ptr encoder sets to 0 or 1 to indicate that a * non-empty packet was returned in avpkt. * @return 0 on success, negative error code on failure */ int (*encode2)(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr); int (*decode)(AVCodecContext *, void *outdata, int *outdata_size, AVPacket *avpkt); int (*close)(AVCodecContext *); /** * Flush buffers. * Will be called when seeking */ void (*flush)(AVCodecContext *); } AVCodec;
下面说一下最主要的几个变量:
const char *name:编解码器的名字,比较短
const char *long_name:编解码器的名字,全称,比较长
enum AVMediaType type:指明了类型,是视频,音频,还是字幕
enum AVCodecID id:ID,不重复
const AVRational *supported_framerates:支持的帧率(仅视频)
const enum AVPixelFormat *pix_fmts:支持的像素格式(仅视频)
const int *supported_samplerates:支持的采样率(仅音频)
const enum AVSampleFormat *sample_fmts:支持的采样格式(仅音频)
const uint64_t *channel_layouts:支持的声道数(仅音频)
int priv_data_size:私有数据的大小
详细介绍几个变量:
1.enum AVMediaType type
AVMediaType定义如下:
enum AVMediaType { AVMEDIA_TYPE_UNKNOWN = -1, ///< Usually treated as AVMEDIA_TYPE_DATA AVMEDIA_TYPE_VIDEO, AVMEDIA_TYPE_AUDIO, AVMEDIA_TYPE_DATA, ///< Opaque data information usually continuous AVMEDIA_TYPE_SUBTITLE, AVMEDIA_TYPE_ATTACHMENT, ///< Opaque data information usually sparse AVMEDIA_TYPE_NB };
2.enum AVCodecID id
AVCodecID定义如下:
enum AVCodecID { AV_CODEC_ID_NONE, /* video codecs */ AV_CODEC_ID_MPEG1VIDEO, AV_CODEC_ID_MPEG2VIDEO, ///< preferred ID for MPEG-1/2 video decoding AV_CODEC_ID_MPEG2VIDEO_XVMC, AV_CODEC_ID_H261, AV_CODEC_ID_H263, AV_CODEC_ID_RV10, AV_CODEC_ID_RV20, AV_CODEC_ID_MJPEG, AV_CODEC_ID_MJPEGB, AV_CODEC_ID_LJPEG, AV_CODEC_ID_SP5X, AV_CODEC_ID_JPEGLS, AV_CODEC_ID_MPEG4, AV_CODEC_ID_RAWVIDEO, AV_CODEC_ID_MSMPEG4V1, AV_CODEC_ID_MSMPEG4V2, AV_CODEC_ID_MSMPEG4V3, AV_CODEC_ID_WMV1, AV_CODEC_ID_WMV2, AV_CODEC_ID_H263P, AV_CODEC_ID_H263I, AV_CODEC_ID_FLV1, AV_CODEC_ID_SVQ1, AV_CODEC_ID_SVQ3, AV_CODEC_ID_DVVIDEO, AV_CODEC_ID_HUFFYUV, AV_CODEC_ID_CYUV, AV_CODEC_ID_H264, ...(代码太长,略) }
3.const enum AVPixelFormat *pix_fmts
AVPixelFormat定义如下:
enum AVPixelFormat { AV_PIX_FMT_NONE = -1, AV_PIX_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples) AV_PIX_FMT_YUYV422, ///< packed YUV 4:2:2, 16bpp, Y0 Cb Y1 Cr AV_PIX_FMT_RGB24, ///< packed RGB 8:8:8, 24bpp, RGBRGB... AV_PIX_FMT_BGR24, ///< packed RGB 8:8:8, 24bpp, BGRBGR... AV_PIX_FMT_YUV422P, ///< planar YUV 4:2:2, 16bpp, (1 Cr & Cb sample per 2x1 Y samples) AV_PIX_FMT_YUV444P, ///< planar YUV 4:4:4, 24bpp, (1 Cr & Cb sample per 1x1 Y samples) AV_PIX_FMT_YUV410P, ///< planar YUV 4:1:0, 9bpp, (1 Cr & Cb sample per 4x4 Y samples) AV_PIX_FMT_YUV411P, ///< planar YUV 4:1:1, 12bpp, (1 Cr & Cb sample per 4x1 Y samples) AV_PIX_FMT_GRAY8, ///< Y , 8bpp AV_PIX_FMT_MONOWHITE, ///< Y , 1bpp, 0 is white, 1 is black, in each byte pixels are ordered from the msb to the lsb AV_PIX_FMT_MONOBLACK, ///< Y , 1bpp, 0 is black, 1 is white, in each byte pixels are ordered from the msb to the lsb AV_PIX_FMT_PAL8, ///< 8 bit with PIX_FMT_RGB32 palette AV_PIX_FMT_YUVJ420P, ///< planar YUV 4:2:0, 12bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV420P and setting color_range AV_PIX_FMT_YUVJ422P, ///< planar YUV 4:2:2, 16bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV422P and setting color_range AV_PIX_FMT_YUVJ444P, ///< planar YUV 4:4:4, 24bpp, full scale (JPEG), deprecated in favor of PIX_FMT_YUV444P and setting color_range AV_PIX_FMT_XVMC_MPEG2_MC,///< XVideo Motion Acceleration via common packet passing AV_PIX_FMT_XVMC_MPEG2_IDCT, ...(代码太长,略) }
4.const enum AVSampleFormat *sample_fmts
enum AVSampleFormat { AV_SAMPLE_FMT_NONE = -1, AV_SAMPLE_FMT_U8, ///< unsigned 8 bits AV_SAMPLE_FMT_S16, ///< signed 16 bits AV_SAMPLE_FMT_S32, ///< signed 32 bits AV_SAMPLE_FMT_FLT, ///< float AV_SAMPLE_FMT_DBL, ///< double AV_SAMPLE_FMT_U8P, ///< unsigned 8 bits, planar AV_SAMPLE_FMT_S16P, ///< signed 16 bits, planar AV_SAMPLE_FMT_S32P, ///< signed 32 bits, planar AV_SAMPLE_FMT_FLTP, ///< float, planar AV_SAMPLE_FMT_DBLP, ///< double, planar AV_SAMPLE_FMT_NB ///< Number of sample formats. DO NOT USE if linking dynamically };
每一个编解码器对应一个该结构体,查看一下ffmpeg的源代码,我们可以看一下H.264解码器的结构体如下所示(h264.c):
AVCodec ff_h264_decoder = { .name = "h264", .type = AVMEDIA_TYPE_VIDEO, .id = CODEC_ID_H264, .priv_data_size = sizeof(H264Context), .init = ff_h264_decode_init, .close = ff_h264_decode_end, .decode = decode_frame, .capabilities = /*CODEC_CAP_DRAW_HORIZ_BAND |*/ CODEC_CAP_DR1 | CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS | CODEC_CAP_FRAME_THREADS, .flush= flush_dpb, .long_name = NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"), .init_thread_copy = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy), .update_thread_context = ONLY_IF_THREADS_ENABLED(decode_update_thread_context), .profiles = NULL_IF_CONFIG_SMALL(profiles), .priv_class = &h264_class, };
JPEG2000解码器结构体(j2kdec.c)
AVCodec ff_jpeg2000_decoder = { .name = "j2k", .type = AVMEDIA_TYPE_VIDEO, .id = CODEC_ID_JPEG2000, .priv_data_size = sizeof(J2kDecoderContext), .init = j2kdec_init, .close = decode_end, .decode = decode_frame, .capabilities = CODEC_CAP_EXPERIMENTAL, .long_name = NULL_IF_CONFIG_SMALL("JPEG 2000"), .pix_fmts = (const enum PixelFormat[]) {PIX_FMT_GRAY8, PIX_FMT_RGB24, PIX_FMT_NONE} };
下面简单介绍一下遍历ffmpeg中的解码器信息的方法(这些解码器以一个链表的形式存储):
1.注册所有编解码器:av_register_all();
2.声明一个AVCodec类型的指针,比如说AVCodec*first_c;
3.调用av_codec_next()函数,即可获得指向链表下一个解码器的指针,循环往复可以获得所有解码器的信息。注意,如果想要获得指向第一个解码器的指针,则需要将该函数的参数设置为NULL。
相关推荐
### FFMPEG结构体及函数介绍 #### 一、引言 FFmpeg是音视频处理领域最著名的开源项目之一,提供了强大的音视频处理能力。它包含了一系列库与工具,能够帮助开发者实现音视频的编解码、转码、流媒体传输等功能。本文...
1. 分析FFmpeg结构体初始化代码,识别C99特性并替换为VS2008兼容的语法。 2. 检查并处理C++11以上的新特性,如类型推断、右值引用等。 3. 配置VS2008项目,添加必要的库链接和预处理器定义。 4. 处理内存管理和线程...
- **注意事项**:在最新版本的FFMPEG中,此函数已被弃用,建议通过其他方式来实现编解码器的初始化,例如使用`avcodec_register_all()`或者依赖于自动注册机制。 2. **打开输入文件:av_open_input_file()** - **...
FFmpeg库提供了丰富的函数和结构体,例如`avformat_open_input`打开输入源,`avformat_write_header`写入容器头部信息,`avcodec_encode_video2`编码视频帧,以及`avio_send_packet`发送编码后的数据包。 在"ffmpeg...
FFmpeg是一个开源项目,它包含了各种音视频处理工具,如编码、解码、转换、流媒体等。在本文中,我们将深入探讨...通过阅读和分析"FFmpegTest"项目,可以加深对FFmpeg使用方法的理解,从而在实际开发中更加得心应手。
在FFmpeg中,每个编码器和解码器都是通过一个结构体AVCodec来表示的,包含了其名称、ID、选项以及相关的编码/解码函数指针。当用户需要编码或解码某个特定格式时,会通过查找AVCodec结构体来确定使用哪个编码器或...
包含的文件夹"include"包含了FFmpeg的头文件,这些头文件定义了库中的各种函数、结构体和常量,供开发者在编写应用程序时调用FFmpeg的功能。例如,`libavcodec/avcodec.h`包含了所有编码器和解码器的相关接口,`...
2. 设置FFmpeg编码器:FFmpeg提供了`avcodec_find_encoder()`函数来查找H264编码器,然后创建`avcodec_context`结构体实例,配置编码参数,如分辨率、比特率、帧率等。 3. 创建OpenGL纹理:为每一帧视频创建一个...
### FFMpeg解码端代码分析—宏块层面解析 #### 概述 本文将针对FFMpeg解码端的代码进行深入分析,重点聚焦于解码框架、关键流程及重要函数等方面,直至宏块层级的理解。对于视频解码领域的初学者而言,这将是一篇...
FFmpeg 是一个强大的开源多媒体处理框架,用于处理音频、视频以及图像数据。它包含了各种工具,如 ffmpeg 命令行工具,以及一系列库,如 libavcodec(编码库)、libavformat(容器格式库)和 libavfilter(滤镜库)...
4.1 AVCodec结构体 59 4.2 AVCodecContext结构体 59 4.3 AVInputFormat结构体 60 4.4 AVFormatContext结构体 61 4.5 MovContext结构体 62 4.6 URLProtocol结构体 62 4.7 URLContext结构体 63 4.8 AVIOContext结构体...
1. 初始化FFmpeg上下文:首先,我们需要创建一个`AVFormatContext`结构体实例,它是FFmpeg中的核心上下文,用于存储与输入或输出文件相关的信息。通过调用`avformat_open_input()`函数打开RTSP流,并使用`avformat_...
1. FFmpeg API的使用:FFmpeg提供了丰富的API供开发者调用,如avformat_open_input()用于打开输入文件,avformat_find_stream_info()获取流信息,avcodec_find_decoder()查找解码器,avcodec_decode_video2()进行...
FFmpeg 是一个强大的开源多媒体处理框架,包含了编解码、音视频封装、转换等功能。针对H.264编码的视频,FFmpeg 提供了解码器来将...理解这个过程对于进行自定义的多媒体处理或者分析FFmpeg的内部工作原理非常关键。
FFmpeg.AutoGen提供了大量的结构体、枚举和函数,以C#的形式封装了FFmpeg的API。例如,`AVFormatContext`代表媒体容器,`AVCodecContext`代表编码或解码上下文,`AVPacket`用于传输音视频数据。 3. **初始化FFmpeg...
"FFmpeg-master.zip" 是 FFmpeg 源代码的压缩包,"FFmpeg-master" 是源代码仓库的主目录,而 "ffmpeg_ffmpeg 播放" 指的是使用 FFmpeg 进行视频播放的相关示例。 在 FFmpeg 中,播放视频主要涉及到以下几个关键步骤...
5. **分配解码器上下文和帧**:使用`avcodec_alloc_context3()`为解码器分配上下文结构体,然后用`avcodec_open2()`打开解码器,将解码器上下文与解码器关联起来。同时,我们还需要分配`AVFrame`对象来接收解码后的...
头文件(.h文件)包含了FFmpeg库的函数声明、结构体定义和常量,是编写与FFmpeg交互的源代码时必不可少的。它们定义了API接口,开发者需要包含这些头文件来调用FFmpeg提供的功能。例如,“avcodec.h”包含了所有...
可以使用 `av_read_frame` 读取一帧,然后 `avcodec_decode_video2` 进行解码,得到 `AVFrame` 结构体,其中包含图像数据。 - 图像数据可以使用 `sws_scale` 转换为 RGB 格式,便于保存为图片文件,如 JPEG 或 PNG...
- 解码:FFmpeg中的`avcodec`模块提供了多种视频和音频编解码器,用于将原始的二进制数据解码成可处理的帧。在这个项目中,首先需要找到合适的解码器,然后通过`avcodec_decode_video2()`或`avcodec_decode_audio4...