【问题标题】:Hwaccel with AVCodec in FFMPEG?Hwaccel 与 FFMPEG 中的 AVCodec?
【发布时间】:2019-08-31 23:29:00
【问题描述】:

我使用 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) 已经过时了。 提前感谢您的帮助。

【问题讨论】:

    标签: c ffmpeg h.264 avcodec


    【解决方案1】:

    请参阅 libav-user 上的 this 线程。基本上在列出硬件加速编解码器之后,您可以尝试使用avcodec_find_decoder_by_name 查找适当的解码器(因为AVHWAccel 结构具有名称字段),然后将其用于解码。但是,您需要预先了解编解码器。如果您使用avformat_open_input,那么您可以简单地尝试通过流信息中的编解码器 id 找到匹配的硬件加速解码器,然后按名称打开硬件加速编解码器并使用它。

    更新,因为我被否决了

    为了提供一个工作示例,我从 homebrew 安装了一个 ffmpeg,它通过ffmpeg -encoders | grep h264 列出了 videotoolbox(这是一个硬件加速编解码器):

    V..... h264_videotoolbox VideoToolbox H.264 Encoder (codec h264)

    而且下面的sn-p也找到了:

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

    【讨论】:

    • 我用“avcodec_find_encoder”实现了解码器的调用,但我没有看到如何将硬件加速应用于这个解码的帧......我已经看到 pix_fmt 能够分配材料加速,例如if pix_fmt = 这与 h264 中的完全一样。唯一的问题是使用什么函数来应用这个 vdpau 加速......
    • 正如我在回复中所说 - 如果您按名称打开硬件加速编解码器,则您已经拥有启用硬件加速的编解码器实例。硬件加速编解码器的要点是它们将始终使用硬件加速,而标准编解码器不会。因此,您所要做的就是正确打开它并在您的管道中使用它。
    • avcodec_find_decoder_by_name 找不到 AVHWAccel。只能找到寄存器解码器。
    • @tbago 您是否真的验证了这一点,或者只是评论和否决?我可以找到h264_videotoolbox 很好,用一个简单的sn-p 扩展答案。
    • github.com/FFmpeg/FFmpeg/blob/master/doc/examples/… 可以看到这个演示如何使用硬件解码器。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      • 2013-05-22
      • 1970-01-01
      • 2021-06-04
      • 1970-01-01
      • 2018-01-09
      • 2012-03-30
      相关资源
      最近更新 更多