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_find_codec

ffmpeg支持按照名字或者ID查找支持的编解码器,但最终都会调用av_codec_interate()来查找编解码数组.

image

支持列表

           在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结构体方式封装实现相应的编码功能.

image

以x265 encoder为例,在libavcodec目录下有libx265.c

最终也是以FFCodec结构方式封装实现相应的编码功能

image

编译配置

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初始化。

image

支持列表:

  • 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文件, 该文件也是在编译之后才会看到。

image

支持列表:

  • 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

posted @   追随技术  阅读(817)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示