我们已经使用libavcodec
,libavformat
等通用库,用C代码编写了一个简短的代码来读取视频文件。
代码运行流畅,但仅使用CPU资源。我们需要在GPU(Nvidia GeForce 940MX和1080Ti)上运行代码。有没有办法强制代码在GPU上运行?
虽然使用命令行(例如ffmpeg -hwaccel cuvid -i vid.mp4 out.avi
)是可以的,但我们无法使其从源代码在GPU上运行。
我们正在使用Ubuntu 18.04,并且已使用CUDA 9.2正确编译了ffmpeg
答案 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
在我的测试中,我从第85行得到了错误:因为nvdec(hevc_cuvid)使用p010内部格式进行10bit(输入是yuv420p10)。这意味着解码的帧将是NV12
像素格式还是P010
,具体取决于比特深度。希望您熟悉像素格式。
希望有帮助。