2

我正在使用 AVCodec 作为视频流解码器,想知道是否可以通过 FFMPEG 将硬件加速与 hwaccel 一起使用?还是默认情况下已经使用了?我已经列出了可用的编解码器,但我不明白如何在我的代码中实现它们。

    AVHWAccel* pHwaccel = NULL;
    pHwaccel = av_hwaccel_next(NULL);

    while(pHwaccel!=NULL)
    {
        TkCore::Logger::info("%s", pHwaccel->name);
        pHwaccel = av_hwaccel_next(pHwaccel);
    }

我获得:h264_qsv、h264_vaapi、h264_vdpaufor h264。我看到命令 : AVHWAccel * ff_find_hwaccel (codecID enum codec_id, enum PixelFormat pix_fmt) 已过时。预先感谢您的帮助。

4

2 回答 2

0

我用“avcodec_find_encoder”实现了解码器的调用,但我没有看到如何将硬件加速应用于这个解码的帧......我已经看到 pix_fmt 能够分配材料加速,例如如果 pix_fmt = 这正是它在h264中。唯一的问题是使用什么函数来应用这个 vdpau 加速......

于 2019-04-15T07:53:06.503 回答
0

请参阅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变量,这是一个预生成的受支持编解码器列表(由配置构建时启用的功能填充)。因此,如果在配置期间启用了任何硬件加速编解码器,它们就会在那里。

于 2019-04-11T11:07:59.743 回答