ffmpeg 注册编解码器
学习资料
https://blog.csdn.net/u011686167/article/details/121723790
https://blog.csdn.net/ddddfang/article/details/89330895
针对FFMPEG 5.0版本,其它版本的软件命名上会有差异。
注册FFCodec
注册管理
- libavcodec/codec_internal.h
- libavcodec/allcodecs.c
- libavcodec/codec.h 对外使用的头文件,封装了具体是应用接口, 关键数据结构 AVCodec
ffmpeg5.0在编译时自动生成编解码数组。保存在libavcodec\odec_list.c中,该文件在编译之后才会看到。
而且并非所有支持的编解码器都会在该数组中,取决于configure中是否开启了对该编解码的支持。
调用ff_thread_once单例线程进行注册,只执行一次。在调用find_codec()方法时会调用av_codec_interate()完成注册.
ffmpeg支持按照名字或者ID查找支持的编解码器,但最终都会调用av_codec_interate()来查找编解码数组.
支持列表
在libavcodec/allcodecs.c中注册目前支持的所有编解码器。
以HEVC为例FFMPEG提供了包含mediacodec,v4l2,vaapi,videotoolbox在内的多种编解码实现方式。
可以看到x265也是采用类似方式来支持的,目前x265只有编码.
- extern FFCodec ff_libx265_encoder;
- extern const FFCodec ff_hevc_decoder;
- extern const FFCodec ff_hevc_qsv_decoder;
- extern const FFCodec ff_hevc_rkmpp_decoder;
- extern const FFCodec ff_hevc_v4l2m2m_decoder;
- extern const FFCodec ff_hevc_amf_encoder;
- extern const FFCodec ff_hevc_cuvid_decoder;
- extern const FFCodec ff_hevc_mediacodec_decoder;
- extern const FFCodec ff_hevc_mf_encoder;
- extern const FFCodec ff_hevc_nvenc_encoder;
- extern const FFCodec ff_hevc_qsv_encoder;
- extern const FFCodec ff_hevc_v4l2m2m_encoder;
- extern const FFCodec ff_hevc_vaapi_encoder;
- extern const FFCodec ff_hevc_videotoolbox_encoder;
添加编解码器
以vaapi hevc encoder为例,在libavcodec目录下有vaapi_encode_h265.c编码器实现
最终以FFCodec结构体方式封装实现相应的编码功能.
以x265 encoder为例,在libavcodec目录下有libx265.c
最终也是以FFCodec结构方式封装实现相应的编码功能
编译配置
Makefile
libavcodec\Makefile加入对新增加的编解码的编译支持。如VAAPI HEVC和libx265
- OBJS-$(CONFIG_HEVC_VAAPI_ENCODER) += vaapi_encode_h265.o h265_profile_level.o
- OBJS-$(CONFIG_LIBX265_ENCODER) += libx265.o
configure
configure中加入新加编解码的编译选择和编译依赖. 如libx265
- --enable-libx265 enable HEVC encoding via x265 [no]
- libx265_encoder_deps="libx265"
注册AVCodecParser
注册管理:
- libavcodec/parsers.c 用于管理注册AVCodecParser
- libavcodec/avcodec.h 关键数据结构和接口函数,这里不区分内外
- libavcodec/parser.c 数据包解析的关键接口函数实现
- libavcodec/xxxx_parser.c 每一个支持的parser的具体实现
和编解码一样,AVCodecParser用于解析数据包,提供av_parser_iterate()来获取指定的数据包解析,该方法位于libavcodec/parsers.c,
也是使用数组进行存储。这里使用的是parser_list数组,在编译期自动生成保存于libavcodec/parser_list.c文件, 该文件也是在编译之后才会看到。
在AVCodecParserContext *av_parser_init(int codec_id)函数中检查是否支持codec_id, 如果支持再完成AVCodecParserContext分配以及parser初始化。
支持列表:
- extern const AVCodecParser ff_aac_parser;
- extern const AVCodecParser ff_aac_latm_parser;
- extern const AVCodecParser ff_ac3_parser;
- extern const AVCodecParser ff_adx_parser;
- extern const AVCodecParser ff_amr_parser;
- extern const AVCodecParser ff_av1_parser;
- extern const AVCodecParser ff_avs2_parser;
- extern const AVCodecParser ff_avs3_parser;
- extern const AVCodecParser ff_bmp_parser;
- extern const AVCodecParser ff_cavsvideo_parser;
- extern const AVCodecParser ff_cook_parser;
- extern const AVCodecParser ff_cri_parser;
- extern const AVCodecParser ff_dca_parser;
- extern const AVCodecParser ff_dirac_parser;
- extern const AVCodecParser ff_dnxhd_parser;
- extern const AVCodecParser ff_dolby_e_parser;
- extern const AVCodecParser ff_dpx_parser;
- extern const AVCodecParser ff_dvaudio_parser;
- extern const AVCodecParser ff_dvbsub_parser;
- extern const AVCodecParser ff_dvdsub_parser;
- extern const AVCodecParser ff_dvd_nav_parser;
- extern const AVCodecParser ff_flac_parser;
- extern const AVCodecParser ff_g723_1_parser;
- extern const AVCodecParser ff_g729_parser;
- extern const AVCodecParser ff_gif_parser;
- extern const AVCodecParser ff_gsm_parser;
- extern const AVCodecParser ff_h261_parser;
- extern const AVCodecParser ff_h263_parser;
- extern const AVCodecParser ff_h264_parser;
- extern const AVCodecParser ff_hevc_parser;
- extern const AVCodecParser ff_ipu_parser;
- extern const AVCodecParser ff_jpeg2000_parser;
- extern const AVCodecParser ff_mjpeg_parser;
- extern const AVCodecParser ff_mlp_parser;
- extern const AVCodecParser ff_mpeg4video_parser;
- extern const AVCodecParser ff_mpegaudio_parser;
- extern const AVCodecParser ff_mpegvideo_parser;
- extern const AVCodecParser ff_opus_parser;
- extern const AVCodecParser ff_png_parser;
- extern const AVCodecParser ff_pnm_parser;
- extern const AVCodecParser ff_rv30_parser;
- extern const AVCodecParser ff_rv40_parser;
- extern const AVCodecParser ff_sbc_parser;
- extern const AVCodecParser ff_sipr_parser;
- extern const AVCodecParser ff_tak_parser;
- extern const AVCodecParser ff_vc1_parser;
- extern const AVCodecParser ff_vorbis_parser;
- extern const AVCodecParser ff_vp3_parser;
- extern const AVCodecParser ff_vp8_parser;
- extern const AVCodecParser ff_vp9_parser;
- extern const AVCodecParser ff_webp_parser;
- extern const AVCodecParser ff_xbm_parser;
- extern const AVCodecParser ff_xma_parser;
注册FFBitStreamFilter
注册管理:
- libavcodec/bsf_internal.h 内部关键数据结构FFBitStreamFilter
- libavcodec/bitstream_filters.c 用于管理注册FFBitStreamFilter
- libavcodec/bsf.h 对外使用的头文件,封装了具体是应用接口
- libavcodec/bsf.c 比特流滤波接口具体实现
和编解码一样,AVBitStreamFilter用于比特流滤波,提供av_bsf_iterate()来获取指定的滤波器,该方法位于libavcodec/bitstream_filters.c,
也是使用数组进行存储。这里使用的是bitstream_filters数组,在编译期自动生成保存于libavcodec/bsf_list.c文件, 该文件也是在编译之后才会看到。
支持列表:
- extern const FFBitStreamFilter ff_aac_adtstoasc_bsf;
- extern const FFBitStreamFilter ff_av1_frame_merge_bsf;
- extern const FFBitStreamFilter ff_av1_frame_split_bsf;
- extern const FFBitStreamFilter ff_av1_metadata_bsf;
- extern const FFBitStreamFilter ff_chomp_bsf;
- extern const FFBitStreamFilter ff_dump_extradata_bsf;
- extern const FFBitStreamFilter ff_dca_core_bsf;
- extern const FFBitStreamFilter ff_dv_error_marker_bsf;
- extern const FFBitStreamFilter ff_eac3_core_bsf;
- extern const FFBitStreamFilter ff_extract_extradata_bsf;
- extern const FFBitStreamFilter ff_filter_units_bsf;
- extern const FFBitStreamFilter ff_h264_metadata_bsf;
- extern const FFBitStreamFilter ff_h264_mp4toannexb_bsf;
- extern const FFBitStreamFilter ff_h264_redundant_pps_bsf;
- extern const FFBitStreamFilter ff_hapqa_extract_bsf;
- extern const FFBitStreamFilter ff_hevc_metadata_bsf;
- extern const FFBitStreamFilter ff_hevc_mp4toannexb_bsf;
- extern const FFBitStreamFilter ff_imx_dump_header_bsf;
- extern const FFBitStreamFilter ff_mjpeg2jpeg_bsf;
- extern const FFBitStreamFilter ff_mjpega_dump_header_bsf;
- extern const FFBitStreamFilter ff_mp3_header_decompress_bsf;
- extern const FFBitStreamFilter ff_mpeg2_metadata_bsf;
- extern const FFBitStreamFilter ff_mpeg4_unpack_bframes_bsf;
- extern const FFBitStreamFilter ff_mov2textsub_bsf;
- extern const FFBitStreamFilter ff_noise_bsf;
- extern const FFBitStreamFilter ff_null_bsf;
- extern const FFBitStreamFilter ff_opus_metadata_bsf;
- extern const FFBitStreamFilter ff_pcm_rechunk_bsf;
- extern const FFBitStreamFilter ff_pgs_frame_merge_bsf;
- extern const FFBitStreamFilter ff_prores_metadata_bsf;
- extern const FFBitStreamFilter ff_remove_extradata_bsf;
- extern const FFBitStreamFilter ff_setts_bsf;
- extern const FFBitStreamFilter ff_text2movsub_bsf;
- extern const FFBitStreamFilter ff_trace_headers_bsf;
- extern const FFBitStreamFilter ff_truehd_core_bsf;
- extern const FFBitStreamFilter ff_vp9_metadata_bsf;
- extern const FFBitStreamFilter ff_vp9_raw_reorder_bsf;
- extern const FFBitStreamFilter ff_vp9_superframe_bsf;
- extern const FFBitStreamFilter ff_vp9_superframe_split_bsf;
2022-05-18
本文来自博客园,作者:追随技术,转载请注明原文链接:https://www.cnblogs.com/545235abc/p/16282572.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)