我试图将已处理的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
然而,这似乎都不起作用。
请帮助。
答案 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是否仍然对使用烟斗感兴趣,但这是一个迟来的答案:
-f jpeg_pipe
而不是rawvideo
。-i pipe:
(包括冒号)fwrite (buff.data(), buff.size(), 1, stdout)