1. 程式人生 > 其它 >ffmpeg 註冊編解碼器

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只有編碼.

    1. extern FFCodec ff_libx265_encoder;
    2. extern const FFCodec ff_hevc_decoder;
    3. extern const FFCodec ff_hevc_qsv_decoder;
    4. extern const FFCodec ff_hevc_rkmpp_decoder;
    5. extern const FFCodec ff_hevc_v4l2m2m_decoder;
    6. extern const FFCodec ff_hevc_amf_encoder;
    7. extern const FFCodec ff_hevc_cuvid_decoder;
    8. extern const FFCodec ff_hevc_mediacodec_decoder;
    9. extern const FFCodec ff_hevc_mf_encoder;
    10. extern const FFCodec ff_hevc_nvenc_encoder;
    11. extern const FFCodec ff_hevc_qsv_encoder;
    12. extern const FFCodec ff_hevc_v4l2m2m_encoder;
    13. extern const FFCodec ff_hevc_vaapi_encoder;
    14. 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初始化。

      支援列表:

        1. extern const AVCodecParser ff_aac_parser;
        2. extern const AVCodecParser ff_aac_latm_parser;
        3. extern const AVCodecParser ff_ac3_parser;
        4. extern const AVCodecParser ff_adx_parser;
        5. extern const AVCodecParser ff_amr_parser;
        6. extern const AVCodecParser ff_av1_parser;
        7. extern const AVCodecParser ff_avs2_parser;
        8. extern const AVCodecParser ff_avs3_parser;
        9. extern const AVCodecParser ff_bmp_parser;
        10. extern const AVCodecParser ff_cavsvideo_parser;
        11. extern const AVCodecParser ff_cook_parser;
        12. extern const AVCodecParser ff_cri_parser;
        13. extern const AVCodecParser ff_dca_parser;
        14. extern const AVCodecParser ff_dirac_parser;
        15. extern const AVCodecParser ff_dnxhd_parser;
        16. extern const AVCodecParser ff_dolby_e_parser;
        17. extern const AVCodecParser ff_dpx_parser;
        18. extern const AVCodecParser ff_dvaudio_parser;
        19. extern const AVCodecParser ff_dvbsub_parser;
        20. extern const AVCodecParser ff_dvdsub_parser;
        21. extern const AVCodecParser ff_dvd_nav_parser;
        22. extern const AVCodecParser ff_flac_parser;
        23. extern const AVCodecParser ff_g723_1_parser;
        24. extern const AVCodecParser ff_g729_parser;
        25. extern const AVCodecParser ff_gif_parser;
        26. extern const AVCodecParser ff_gsm_parser;
        27. extern const AVCodecParser ff_h261_parser;
        28. extern const AVCodecParser ff_h263_parser;
        29. extern const AVCodecParser ff_h264_parser;
        30. extern const AVCodecParser ff_hevc_parser;
        31. extern const AVCodecParser ff_ipu_parser;
        32. extern const AVCodecParser ff_jpeg2000_parser;
        33. extern const AVCodecParser ff_mjpeg_parser;
        34. extern const AVCodecParser ff_mlp_parser;
        35. extern const AVCodecParser ff_mpeg4video_parser;
        36. extern const AVCodecParser ff_mpegaudio_parser;
        37. extern const AVCodecParser ff_mpegvideo_parser;
        38. extern const AVCodecParser ff_opus_parser;
        39. extern const AVCodecParser ff_png_parser;
        40. extern const AVCodecParser ff_pnm_parser;
        41. extern const AVCodecParser ff_rv30_parser;
        42. extern const AVCodecParser ff_rv40_parser;
        43. extern const AVCodecParser ff_sbc_parser;
        44. extern const AVCodecParser ff_sipr_parser;
        45. extern const AVCodecParser ff_tak_parser;
        46. extern const AVCodecParser ff_vc1_parser;
        47. extern const AVCodecParser ff_vorbis_parser;
        48. extern const AVCodecParser ff_vp3_parser;
        49. extern const AVCodecParser ff_vp8_parser;
        50. extern const AVCodecParser ff_vp9_parser;
        51. extern const AVCodecParser ff_webp_parser;
        52. extern const AVCodecParser ff_xbm_parser;
        53. 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檔案, 該檔案也是在編譯之後才會看到。

          支援列表:

            1. extern const FFBitStreamFilter ff_aac_adtstoasc_bsf;
            2. extern const FFBitStreamFilter ff_av1_frame_merge_bsf;
            3. extern const FFBitStreamFilter ff_av1_frame_split_bsf;
            4. extern const FFBitStreamFilter ff_av1_metadata_bsf;
            5. extern const FFBitStreamFilter ff_chomp_bsf;
            6. extern const FFBitStreamFilter ff_dump_extradata_bsf;
            7. extern const FFBitStreamFilter ff_dca_core_bsf;
            8. extern const FFBitStreamFilter ff_dv_error_marker_bsf;
            9. extern const FFBitStreamFilter ff_eac3_core_bsf;
            10. extern const FFBitStreamFilter ff_extract_extradata_bsf;
            11. extern const FFBitStreamFilter ff_filter_units_bsf;
            12. extern const FFBitStreamFilter ff_h264_metadata_bsf;
            13. extern const FFBitStreamFilter ff_h264_mp4toannexb_bsf;
            14. extern const FFBitStreamFilter ff_h264_redundant_pps_bsf;
            15. extern const FFBitStreamFilter ff_hapqa_extract_bsf;
            16. extern const FFBitStreamFilter ff_hevc_metadata_bsf;
            17. extern const FFBitStreamFilter ff_hevc_mp4toannexb_bsf;
            18. extern const FFBitStreamFilter ff_imx_dump_header_bsf;
            19. extern const FFBitStreamFilter ff_mjpeg2jpeg_bsf;
            20. extern const FFBitStreamFilter ff_mjpega_dump_header_bsf;
            21. extern const FFBitStreamFilter ff_mp3_header_decompress_bsf;
            22. extern const FFBitStreamFilter ff_mpeg2_metadata_bsf;
            23. extern const FFBitStreamFilter ff_mpeg4_unpack_bframes_bsf;
            24. extern const FFBitStreamFilter ff_mov2textsub_bsf;
            25. extern const FFBitStreamFilter ff_noise_bsf;
            26. extern const FFBitStreamFilter ff_null_bsf;
            27. extern const FFBitStreamFilter ff_opus_metadata_bsf;
            28. extern const FFBitStreamFilter ff_pcm_rechunk_bsf;
            29. extern const FFBitStreamFilter ff_pgs_frame_merge_bsf;
            30. extern const FFBitStreamFilter ff_prores_metadata_bsf;
            31. extern const FFBitStreamFilter ff_remove_extradata_bsf;
            32. extern const FFBitStreamFilter ff_setts_bsf;
            33. extern const FFBitStreamFilter ff_text2movsub_bsf;
            34. extern const FFBitStreamFilter ff_trace_headers_bsf;
            35. extern const FFBitStreamFilter ff_truehd_core_bsf;
            36. extern const FFBitStreamFilter ff_vp9_metadata_bsf;
            37. extern const FFBitStreamFilter ff_vp9_raw_reorder_bsf;
            38. extern const FFBitStreamFilter ff_vp9_superframe_bsf;
            39. extern const FFBitStreamFilter ff_vp9_superframe_split_bsf;

            2022-05-18