【问题标题】:How to ensure that ffmpeg libraries uses/ not uses GPU如何确保 ffmpeg 库使用/不使用 GPU
【发布时间】:2021-08-18 00:43:25
【问题描述】:

我的库(Linux、Debian)使用 FFMpeg 库(avformat、avcodec、swscale 等)从网络摄像机读取视频流。实际上,我需要从网络摄像机捕获每个视频帧,对其进行解码,缩放并存储在内存中 - 其他线程将这些数据传递给调用程序进行显示。

问题是,这一切都在 CPU 中工作并占用大量 CPU 资源。如何强制使用 GPU 加速器进行处理?

我有显卡:VGA 兼容控制器:Intel Corporation HD Graphics 620 (rev 02)

我的解码线程看起来像这样(我省略了声明、错误处理等,所以请不要寻找语法错误:)))

fmt = avformat_alloc_context(); 
//initialising, setting option by av_dict_set
// finding video stream index
***
 // finding decoder and allocate its contexts

    frame = av_frame_alloc();

    while ( av_read_frame(ctx->fmt, &pkt) >= 0) 
    {
        AVPacket orig_pkt = pkt;

         avcodec_send_packet(ctx->dec_ctx, pkt);
         avcodec_receive_frame(ctx->dec_ctx, frame);
            *** 
// get buffer allocated for store of frame data
             buff = get_free_buffer(ctx);
        sws_scale(ctx->sws, (const uint8_t * const*)frame->data, 
        frame->linesize, 0, ctx->dec_ctx->height, buff->data,
        buff->linesize);
            ret = decode_packet(ctx, frame, &pkt, &got_frame);
            if (ret < 0)
                break;
            pkt.data += ret;
            pkt.size -= ret;
        }
        while (pkt.size > 0);

        av_packet_unref(&orig_pkt);
    }
*****  

【问题讨论】:

  • 这个问题不适合超级用户。它将很快迁移。为确保它不会被拒绝,您需要对其进行改进:提供可编译的代码,提供尽可能多的代码。
  • 如果您有可用的硬件解码器,则需要分配它。英特尔 CPU 将提供 QSV 或 VAAPI 加速。如果您想通过 GPU 进行扩展,您将需要使用 libavfilter 和相应的 GPU 过滤器,例如scale_vaapi 或 scale_qsv
  • 吉安谢谢。可能这就是解决方案。你能给我合适例子的链接吗?

标签: linux ffmpeg video gpu


【解决方案1】:

你可以在网上找到硬件加速的ffmpeg重新编码命令,我正在使用

ffmpeg -vaapi_device /dev/dri/renderD128 -i "inputfile" -vf format=nv12,hwupload -c:v h264_vaapi -f mp4 -qp 18 -map 0 "outputfile.mp4"

您可以通过命令ffmpeg -hwaccelsDRI framework 路径使用命令ls /dev/dri/ 列出硬件加速器,然后使用命令ffmpeg -encoders 可以找到视频编解码器/编码器(上例中的h264_vaapi)。 -f mp4 可能不需要参数来定义文件格式,-qp 设置质量(在这种情况下类似于原始),-map 0 将尝试使用输入文件的所有流,而不仅仅是质量最高的流,首先/默认字幕...

另一方面,当我没有定义硬件加速器设备并使用默认编码器 libx264 时,我可以看到 CPU 已被最大化,因此可能没有使用硬件加速。

【讨论】:

  • 谢谢,但我不使用 ffmpeg 命令,我使用 C 程序(.so 库)获取每一帧并为回调显示过程创建图像。 (我的系统是我在 linux 中通过 Mono 运行的 C# 代码,我需要显示(和记录)来自网络摄像机的流。我希望 Gyan 的评论会很有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-12-09
  • 2021-10-12
  • 2021-05-05
  • 2018-10-02
  • 2020-03-13
  • 2013-08-19
  • 2021-02-04
  • 2020-11-26
相关资源
最近更新 更多