天天看點

FFmpeg枚舉編解碼器

通過擷取FFmpeg中的編碼器名字,codec->name),然後可以直接通過avcodec_find_encoder_by_name擷取編碼器;

codec = avcodec_find_encoder_by_name("h264_nvenc");

當然,也可通過擷取codec->id (AVCodecID),通過avcodec_find_encoder擷取編解碼器;

codec =  avcodec_find_encoder( AV_CODEC_ID_H264 );

但是有差別,H264,如果通過AV_CODEC_ID_H264擷取,預設擷取的是軟編碼,通常就是x264;

但是通過name,h264_nvenc,可以擷取硬體編碼器,來指定編碼H264;

因為,nvenc 和libx264或者libopenh264的encoder AVcodecID 都是AV_CODEC_ID_H264,但是name不同;

一:擷取視訊編碼器  

這個方法是示例,源碼示例還有,在FFmpeg 4.1版本中av_codec_next函數已經不用了;用後面的方法;

#include "libavcodec/avcodec.h"

int enum_codec() 

{

AVCodec *codec = NULL;

int ret = 0;

char chget[10];

avcodec_register_all();

while (codec = av_codec_next(codec))

{

if (av_codec_is_encoder(codec)) 

{

if (codec->type == AVMEDIA_TYPE_VIDEO) 

{

if (1) 

{

av_log(NULL, AV_LOG_FATAL, "Encoder %s is missing the sample_fmts field\n", codec->name);

printf(codec->name); printf("\n");

ret = 1;

}

}

}

}

gets(chget);

return ret;

}

二:擷取視訊解碼:

三:擷取音頻編解碼器;

 現在用新的方法擷取機器相關的編解碼器資訊系;

int enum_codec() 

{

    FILE * f = fopen("C:/ffmpeg_codec.txt", "w+b");;

    AVCodec *prev = NULL, *p;

    void *i = 0;

    while ((p = (AVCodec*)av_codec_iterate(&i))) 

    {

        if (prev)

            prev->next = p;

        prev = p;

        p->name;

        p->long_name;

        p->type;

        if(p->long_name && strlen(p->long_name))

        {

            fwrite(p->name, 1, strlen(p->name), f);        

            fwrite("\n", 1, 1, f);

            fwrite(p->long_name, 1, strlen(p->long_name), f);

            fwrite("\n", 1, 1, f);

            fwrite("\n", 1, 1, f);

        }

    }

    fclose(f);

return 1;

}

當然也可以通過 ffmpeg -encoders 指令檢視;更多指令可以通過 FFmpeg -h 檢視;