GpuMat转FFMPEG编码器

时间:2019-08-28 15:04:39

标签: opencv ffmpeg

我正在用opencv :: cuda做一些图像处理,所以最终得到的是cv :: cuda :: GpuMat。现在,我想使用ffmpeg对其进行编码(因此,我可以选择编码器是否为硬件加速)。现在,我想知道是否可以以某种方式将数据保存在编码器的GPU中而不下载它,因为这似乎是我的应用程序运行多个线程的瓶颈。

我正在使用Opencv CUDA调整图像的大小,因此下载量较少。 (使用sws_scale调整大小没有区别)

cv::cuda::GpuMat currentFrame;
...
cv::cuda::GpuMat resized;
cv::cuda::resize(currentFrame,resized,cv::Size(width*0.75,height*0.75),0,0,cv::INTER_NEAREST);
cv::Mat frameEnc = cv::Mat(resized);
const int stride[] = { static_cast<int>(frameEnc.step[0]) };
sws_scale(swsctx, &frameEnc.data, stride, 0, frameEnc.rows, avframe->data, avframe->linesize);
ret = avcodec_send_frame(codec, avframe);
if(!ret) {
    /* rescale packet timestamp */
    pkt->duration = 1;
    av_packet_rescale_ts(pkt, codec->time_base, vstrm->time_base);
    /* write packet */
    av_write_frame(outctx, pkt);
}

现在,它确实可以正常运行,但是我真的希望我可以做类似的事情:

cv::cuda::GpuMat currentFrame;
...
GpuMatToAvFrame(currentFrame,avframe);
ret = avcodec_send_frame(codec, avframe);
if(!ret) {
    /* rescale packet timestamp */
    pkt->duration = 1;
    av_packet_rescale_ts(pkt, codec->time_base, vstrm->time_base);
    /* write packet */
    av_write_frame(outctx, pkt);
}

avframe数据也在gpu上,因此我不需要下载就可以在GPU-CPU / CPU-GPU之间进行任何传输

1 个答案:

答案 0 :(得分:1)

我认为一旦解决OpenCV问题,类cv::cudacodec::VideoWriter可能会有所帮助。该类允许您直接编写GpuMat。但是我相信由于OpenCV中的a bug,您不能在支持此类的情况下构建OpenCV。这意味着现在这不是一个很好的解决方案,但可能在将来。