如何确定FFmpeg库中使用的特定H264编码器?

时间:2017-05-10 16:28:13

标签: ffmpeg

看看FFmpeg库支持的h264编码器,我看到了不少编码器​​:

libx264
nvenc_h264
h264_nvenc
h264_vaapi
h264_cuvid
h264_vdpau

要获得H264编码器,我们进行通用调用:

encoder = avcodec_find_encoder(AV_CODEC_ID_H264);

我们如何知道实际拾取的编码器?问候。

1 个答案:

答案 0 :(得分:2)

检查avcodec_find_encoder() here的签名:

AVCodec* avcodec_find_encoder(enum AVCodecID id)

它返回一个AVCodec结构指针。那么让我们看看AVCodec结构可以告诉我们here

const char * name
const char * long_name

// Log or print either of them will show you the encoder name.
printf("%s\n", encoder->name);
printf("%s\n", encoder->long_name);

默认情况下,AV_CODEC_ID_H264会选择libx264

另一种方法是检查ffmpeg源,尝试在libavcodec/目录中搜索编码器ID。通常,编码器AVCodec结构将位于c源文件的末尾,包括名称,长名称和ID。例如,以下结构位于libavcodec/libx264.c

 AVCodec ff_libx264_encoder = {
    .name             = "libx264",
    .long_name        = NULL_IF_CONFIG_SMALL("libx264 H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10"),
    .type             = AVMEDIA_TYPE_VIDEO,
    .id               = AV_CODEC_ID_H264,
    .priv_data_size   = sizeof(X264Context),
    .init             = X264_init,
    .encode2          = X264_frame,
    .close            = X264_close,
    .capabilities     = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_AUTO_THREADS,
    .priv_class       = &x264_class,
    .defaults         = x264_defaults,
    .init_static_data = X264_init_static,
    .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE |
                        FF_CODEC_CAP_INIT_CLEANUP,
};

关于其他编解码器,h264_nvencnvenc_h264与NVIDIA GPU编码器相同;各种硬件支持vaapivdpau; h264_cuvid是cuda解码支持,也是由NVIDIA GPU提供的。如果您需要任何这些编解码器,请通过avcodec_find_encoder_by_name()获取。