请参阅libav-user 上的此线程。基本上在列出硬件加速编解码器之后,您可以尝试使用 avcodec_find_decoder_by_name 查找适当的解码器(因为AVHWAccel结构具有 name 字段),然后将其用于解码。但是,您需要预先了解编解码器。如果您使用avformat_open_input
,那么您可以简单地尝试通过流信息中的编解码器 id 找到匹配的硬件加速解码器,然后按名称打开硬件加速编解码器并使用它。
更新,因为我被否决了
为了提供一个工作示例,我从 homebrew 安装了一个 ffmpeg,它通过以下方式列出了 videotoolbox(这是一个硬件加速编解码器)ffmpeg -encoders | grep h264
:
V..... h264_videotoolbox VideoToolbox H.264 Encoder (codec h264)
以下代码段也找到了它:
extern "C"
{
#include <libavcodec/avcodec.h>
}
int main(int argc, char** argv)
{
auto *codec = avcodec_find_encoder_by_name("h264_videotoolbox");
if (codec)
{
return 0;
}
return 1;
}
此外,如果您检查avcodec_find_encoder_by_name
/做了什么avcodec_find_encoder_by_name
,可以看出它基本上只是通过应用过滤器来区分编码器/解码器来迭代整个编解码器列表:
static AVCodec *find_codec_by_name(const char *name, int (*x)(const AVCodec *))
{
void *i = 0;
const AVCodec *p;
if (!name)
return NULL;
while ((p = av_codec_iterate(&i))) {
if (!x(p))
continue;
if (strcmp(name, p->name) == 0)
return (AVCodec*)p;
}
return NULL;
}
AVCodec *avcodec_find_encoder_by_name(const char *name)
{
return find_codec_by_name(name, av_codec_is_encoder);
}
AVCodec *avcodec_find_decoder_by_name(const char *name)
{
return find_codec_by_name(name, av_codec_is_decoder);
}
将av_codec_iterate
迭代codec_list
变量,这是一个预生成的受支持编解码器列表(由配置构建时启用的功能填充)。因此,如果在配置期间启用了任何硬件加速编解码器,它们就会在那里。