如何在不使用命令行的情况下在GPU上执行ffmpeg代码?

时间:2018-10-18 13:43:24

标签: c ffmpeg gpu

我们已经使用libavcodeclibavformat等通用库,用C代码编写了一个简短的代码来读取视频文件。

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

虽然使用命令行(例如ffmpeg -hwaccel cuvid -i vid.mp4 out.avi)是可以的,但我们无法使其从源代码在GPU上运行。

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

1 个答案:

答案 0 :(得分:1)

使用libav(ffmpeg)在https://github.com/FFmpeg/FFmpeg/tree/master/doc/examples上对视频进行编码和解码是很好的例子。

对于您需要的是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);
}

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

编译FFmpeg

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

希望有帮助。