不同格式之间的转换肯定会涉及解码,编码,ffmpeg对编解码的封装为AVCodec(定义在avcodec.h),以h264的编解码为例:
AVCodecff_libx264_encoder = {
.name ="libx264",
.long_name =NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part10"),
.type =AVMEDIA_TYPE_VIDEO,
.id =AV_CODEC_ID_H264,
.priv_data_size =sizeof(X264Context),
.init = X264_init,
.encode2 = X264_frame,
.close = X264_close,
.capabilities =CODEC_CAP_DELAY | CODEC_CAP_AUTO_THREADS,
.priv_class =&x264_class,
.defaults = x264_defaults,
.init_static_data = X264_init_static,
};
AVCodecff_h264_decoder = {
.name ="h264",
.long_name =NULL_IF_CONFIG_SMALL("H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
.type =AVMEDIA_TYPE_VIDEO,
.id = AV_CODEC_ID_H264,
.priv_data_size =sizeof(H264Context),
.init =ff_h264_decode_init,
.close =h264_decode_end,
.decode =h264_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,
.init_thread_copy =ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
.update_thread_context =ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context),
.profiles =NULL_IF_CONFIG_SMALL(profiles),
.priv_class =&h264_class,
};
像上面的定义还有很多,一般流程是根据源的内容创建解码器,根据目标的后缀名创建编码器。
如果想知道当前编解码库,可以在调用encode,decode的地方打断点,然后调试进入即可,比如ffmpeg -i 1.jpg 2.bmp,不知道jpg的解码库在哪里,可在avcodec_decode_video的avctx->codec->decode设置断点,然后调试进入。