【问题标题】:How to execute a ffmpeg code on a GPU without using the command line?如何在不使用命令行的情况下在 GPU 上执行 ffmpeg 代码?
【发布时间】:2019-03-23 08:20:28
【问题描述】:

我们用 C 代码编写了一段短代码来读取视频文件,使用常用库如 libavcodeclibavformat 等。

代码运行平稳,但仅使用 CPU 资源。我们需要在 GPU(Nvidia GeForce 940MX 和 1080Ti)上运行代码。有没有办法强制代码在 GPU 上运行?

虽然使用命令行(例如,ffmpeg -hwaccel cuvid -i vid.mp4 out.avi)一切都很好,但我们无法通过源代码让它在 GPU 上运行。

我们正在使用 Ubuntu 18.04,并且 ffmpeg 使用 CUDA 9.2 正确编译

【问题讨论】:

    标签: c ffmpeg gpu


    【解决方案1】:

    https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples 有使用 libav (ffmpeg) 编码和解码视频的非常好的示例。

    您需要的是demuxing_decoding.c 示例并更改166 行,即:

    /* find decoder for the stream */
    dec = avcodec_find_decoder(st->codecpar->codec_id);
    

    /* find decoder for the stream */
    if (st->codecpar->codec_id == AV_CODEC_ID_H264)
    {
        dec = avcodec_find_decoder_by_name("h264_cuvid");
    }
    else if (st->codecpar->codec_id == AV_CODEC_ID_HEVC)
    {
        dec = avcodec_find_decoder_by_name("hevc_cuvid");
    }
    else
    {
        dec = avcodec_find_decoder(st->codecpar->codec_id);
    }
    

    为其他格式添加/更改行。并确保您的 FFmpeg 使用 --enable-cuda --enable-cuvid

    编译

    在我的测试中,我得到错误来自第 85 行:因为 nvdec (hevc_cuvid) 使用 p010 10 位内部格式(输入为 yuv420p10)。这意味着解码帧将是NV12 像素格式或P010,具体取决于位深度。我希望您熟悉像素格式。

    希望对您有所帮助。

    【讨论】:

    • 谢谢!是的,我们的 ffmpeg 使用 --enable-cuda 和 --enable-cuvid 正确编译。我们查看了您链接的文件,但您确定能够在 GPU 上运行我们的代码就足够了吗?
    • 按照你说的:“在使用命令行时(例如,ffmpeg -hwaccel cuvid -i vid.mp4 out.avi)一切都很好”。是的,经过一些配置,它应该类似于命令行版本。我看到您实际上输出了 avi,因此您也可以考虑在同一网页上转码示例,这将向您展示如何重新编码为所需的格式。
    • Ok.. 我们尝试在代码中添加函数 avcodec_find_decoder_by_name() 但它仍然无法在 GPU 上运行......我们认为我们需要在代码中添加其他东西来明确强制由 GPU 运行的代码
    • 我刚刚用hevc_cuvid 和一个mp4 hevc 视频文件测试了代码。它肯定适用于 GPU,因为我收到类似“[hevc_cuvid @ 0x232bf00] Invalid NAL unit 62, skipping. [hevc_cuvid @ 0x232bf00] 找不到起始代码”之类的错误。我意识到这也意味着这个例子寻找未混合的视频流。这就是为什么它使用fread 并且实际上没用。 demuxing_decoding.c 示例使用 av_read_frame 将按照其名称(解复用)的建议完成工作。我会尽快更新答案。
    • 是的,它有效!太感谢了!!我们在支持 h264_cuvid 和 hevc_cuvid 的 GPU (GeForce 1080Ti) 上运行代码。我们遇到了一些问题,因为安装在我们 PC (GeForce 940MX) 上的 GPU 不支持 h264_cuvid。您使用哪个 GPU 来执行代码?
    猜你喜欢
    • 2016-07-10
    • 2011-03-21
    • 1970-01-01
    • 1970-01-01
    • 2015-04-06
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多