天天看點

ffmpeg自定義編解碼器

    • 小結
    • avdeviceffmpeg自定義輸出裝置OPENGL
    • avcodecffmpeg自定義位元組流轉換器MJPEG2JPEG
    • avcodecffmpeg自定義硬體加速解碼器videotoolbox
    • avcodecffmpeg自定義解析器h264
    • avcodecffmpeg自定義解碼器fdkaac
    • avcodecffmpeg自定義編碼器fdkaac

小結

之前研究了下ffmpeg自定義編解碼器的編寫,為了避免忘記,現在小結一下。如果我們想添加自己的庫到ffmpeg中,比如添加私有的協定,自定義編解碼器等,都可以按照本文描述去添加。
           

(avdevice)ffmpeg自定義輸出裝置(OPENGL)

研究opengl自定義輸出裝置是怎麼在ffmpeg中接入的.
接入包含檔案如下:opengl-enc.c:
).定義上下文結構體OpenGLContext
).定義函數opengl_write_header
          opengl_write_packet
          opengl_write_frame
          opengl_write_trailer
          opengl_control_message
).定義AVOutputFormat的結構體ff_opengl_muxer
AVOutputFormat ff_opengl_muxer={.name="opengl",
.long_name=NULL_IF_CONFIG_SMALL("OpenGLoutput"),
.priv_data_size=sizeof(OpenGLContext),
.audio_codec=AV_CODEC_ID_NONE,
.video_codec=AV_CODEC_ID_RAWVIDEO,
.write_header=opengl_write_header,
.write_packet=opengl_write_packet,
.write_uncoded_frame=opengl_write_frame,
.write_trailer=opengl_write_trailer,
.control_message=opengl_control_message,
.flags=AVFMT_NOFILE|AVFMT_VARIABLE_FPS|AVFMT_NOTIMESTAMPS,
.priv_class=&opengl_class,};
).修改alldevices.c檔案: REGISTER_OUTDEV(OPENGL,opengl);
           

(avcodec)ffmpeg自定義位元組流轉換器(MJPEG2JPEG)

研究mjpeg2jpeg自定義轉換器是怎麼接入的.
接入包含檔案如下:
mjpeg2jpeg_bsf.c:
).定義函數mjpeg2jpeg_filter
).定義mjpeg2jpeg自定義轉換器結構體ff_mjpeg2jpeg_bsf
AVBitStreamFilter ff_mjpeg2jpeg_bsf={
.name="mjpeg2jpeg",
.filter=mjpeg2jpeg_filter,
};
).修改allcodec.c:REGISTER_BSF(MJPEG2JPEG,mjpeg2jpeg);
           

(avcodec)ffmpeg自定義硬體加速解碼器(videotoolbox)

研究videotoolbox自定義硬體加速解碼器是怎麼在ffmpeg中接入的.
接入包含檔案如下:videotoolbox.c:
).定義函數ff_videotoolbox_alloc_frame
          ff_videotoolbox_h264_start_frame
          ff_videotoolbox_h264_decode_slice
          videotoolbox_h264_end_frame
          ff_videotoolbox_uninit
).定義硬體加速解碼器ff_h264_videotoolbox_hwaccel
AVHWAccel ff_h264_videotoolbox_hwaccel={
.name="h264_videotoolbox",
.type=AVMEDIA_TYPE_VIDEO,
.id=AV_CODEC_ID_H264,
.pix_fmt=AV_PIX_FMT_VIDEOTOOLBOX,
.alloc_frame=ff_videotoolbox_alloc_frame,
.start_frame=ff_videotoolbox_h264_start_frame,
.decode_slice=ff_videotoolbox_h264_decode_slice,
.end_frame=videotoolbox_h264_end_frame,
.uninit=ff_videotoolbox_uninit,
.priv_data_size=sizeof(VTContext),};
修改allcodecs.c:REGISTER_HWACCEL(H264_VIDEOTOOLBOX,h264_videotoolbox);
總結:自定義解碼器就是AVCodec增加新的支援,并在最開始的時候,注冊到清單中
           

(avcodec)ffmpeg自定義解析器(h264)

研究h264自定義解析器是怎麼接入的.
接入包含檔案如下:
h264_praser.c:
).定義h264解析上下文H264ParseContext
).定義函數init/h264_parse/h264_close/h264_split
).定義解析器結構體ff_h264_parser
AVCodecParser ff_h264_parser={
.codec_ids={AV_CODEC_ID_H264},
.priv_data_size=sizeof(H264ParseContext),
.parser_init=init,
.parser_parse=h264_parse,
.parser_close=h264_close,
.split=h264_split,};
).修改allcodec.c:REGISTER_PARSER(H264,h264);
           

(avcodec)ffmpeg自定義解碼器(fdkaac)

研究fdkaac自定義解碼器是怎麼在ffmpeg中接入的.
接入包含檔案如下:
libfdk-aacdec.c:
).定義解碼器上下文FDKAACDecContext
).定義fdk_aac_dec_options預設解碼選項
).定義解碼類fdk_aac_dec_class
).定義get_stream_info函數
).定義fdk_aac_decode_close
fdk_aac_decode_init
fdk_aac_decode_frame
fdk_aac_decode_flush
).定義解碼器ff_libfdk_aac_decoder
).修改allcodecs.c:REGISTER_ENCODER(LIBFAAC,libfaac);
包含fdkaac編解碼器注冊這樣就導出了解碼器
#defineREGISTER_DECODER(X,x)\{\externAVCodecff_##x##_decoder;\if(CONFIG_##X##_DECODER)\avcodec_register(&ff_##x##_decoder);\}
總結:自定義解碼器就是AVCodec增加新的支援,并在最開始的時候,注冊到清單中
           

(avcodec)ffmpeg自定義編碼器(fdkaac)

研究fdkaac自定義編碼器是怎麼在ffmpeg中接入的.
接入包含檔案如下:libfdk-aacenc.c:
).定義編碼器上下文AACContext
).定義編碼器配置選項aac_enc_options
).定義aac_get_error
aac_encode_close
aac_encode_init
aac_encode_frame
).定義ff_libfdk_aac_encoder
).修改allcodecs.c:REGISTER_ENCODER(LIBFAAC,libfaac);
包含fdkaac編解碼器注冊這樣就導出了編碼器#defineREGISTER_ENCODER(X,x)\{\externAVCodecff_##x##_encoder;\if(CONFIG_##X##_ENCODER)\avcodec_register(&ff_##x##_encoder);\}