如何将opencv视频发送到ffmpeg

How to send opencv video's to ffmpeg

本文关键字:ffmpeg 视频 opencv      更新时间:2023-10-16

我正在尝试将处理后的opencv Mat作为视频发送到ffmpeg。我正在对帧进行编码并将其写入 std 输出,然后将其管道传输到 ffmpeg。这是我的代码。

C++:

if(!cap.isOpened()) {
    cout << "Video not accessible" << endl;
    return -1;
} else {
    cout << "Video is accessible" << endl;
}
while (true) {
    cap >> frame;
    //some processing
    cv::imencode(".jpg", frame, buff);
    for (i = buff.begin(); i != buff.end(); ++i)
        std::cout << *i ;
}

我的输入视频分辨率是 640x418。我不改变视频大小

构建后,我使用以下命令执行。

./a.out | ffmpeg -f rawvideo -pix_fmt bgr24 -s 640x418 -r 30 -i - -an -f mpegts udp://0.0.0.0:8182

还有这个

./a.out | ffmpeg -i pipe:0 -f rawvideo -pix_fmt bgr24 -s 640x418 -r 30 -i - -an -f mpegts udp://0.0.0.0:8182

然而,这些似乎都不起作用。

请帮忙。

不确定 Jahan 是否仍然对使用管道感兴趣,但这里有一个迟来的答案:

  1. 您写入 stdout 的是图像,而不是视频,因此输入格式应该是 -f jpeg_pipe 而不是 rawvideo .
  2. 输入源应-i pipe:(包括冒号)
  3. 管道中不需要编码;而是在ffserver配置中指定编码。对于图像帧,我发现使用流类型 mjpg 很简单。
  4. 在opencv中更简单的写入可以是: fwrite (buff.data(), buff.size(), 1, stdout)

同样的问题...同样的答案...我希望这个答案能帮助你。

在这个程序中,我以 20 fps 的速度制作屏幕副本(RGB 数据)并将图像发送到 ffmpeg。 我不使用管道,而是使用插座。我使用这个命令行:

ffmpeg -f rawvideo -pixel_format rgb24  -video_size 640x480 -i  "tcp://127.0.0.1:2345" -codec:v libx264 -pix_fmt yuv420p Video.mp4

运行 FFMPEG,然后使用套接字将数据发送到端口 2345

sock->Write(b.GetData(), nb);

我不编码帧它是原始数据