因为cv::Mat
你有cv::VideoWriter。如果您希望使用 FFMpeg,假设 Mat 是连续的,可以强制执行:
if (! mat.isContinuous())
{
mat = mat.clone();
}
您可以简单地将 mat.data 输入sws_scale
sws_scale(videoSampler, mat.data, stride, 0, mat.rows, videoFrame->data, videoFrame->linesize);
或直接进入AVFrame
对于cv::cuda::GpuMat
, VideoWriter 实现不可用,但您可以使用 NVIDIA Video Codec SDK 并类似地将 cv::cuda::GpuMat::data 输入NvEncoderCuda,只需确保您的 GpuMat 有 4 个通道 (BGRA):
NV_ENC_BUFFER_FORMAT eFormat = NV_ENC_BUFFER_FORMAT_ABGR;
std::unique_ptr<NvEncoderCuda> pEnc(new NvEncoderCuda(cuContext, nWidth, nHeight, eFormat));
...
cv::cuda::cvtColor(srcIn, srcIn, cv::ColorConversionCodes::COLOR_BG2BGRA);
NvEncoderCuda::CopyToDeviceFrame(cuContext, srcIn.data, 0, (CUdeviceptr)encoderInputFrame->inputPtr,
(int)encoderInputFrame->pitch,
pEnc->GetEncodeWidth(),
pEnc->GetEncodeHeight(),
CU_MEMORYTYPE_HOST,
encoderInputFrame->bufferFormat,
encoderInputFrame->chromaOffsets,
encoderInputFrame->numChromaPlanes);
这是我将 GpuMat 与 NVIDIA Video Codec SDK 一起使用的完整示例