通过获取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;
}