如何将opencv视频发送到ffmpeg

时间:2016-05-20 03:53:00

标签: c++ opencv ffmpeg

我试图将已处理的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

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

请帮助。

2 个答案:

答案 0 :(得分:1)

Same question ... same answer... 我希望这个答案会对你有帮助。

在此program中,我以20 fps制作屏幕副本(RGB数据)并将图像发送到ffmpeg。我不使用管道但插座。我用这个command line

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然后将数据发送到port 2345 using socket

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

我不编码帧,它是原始数据

答案 1 :(得分:1)

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

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