OpenCV(用C ++编程)stdout传递给ffmpeg(在bashscript中)?

我使用下面的bash脚本来管理OpenCV的输出,它是一个out.avi文件,使用tail命令将该文件转换为标准输出,并将输出管道输送到ffmpeg

./OpenCV & 
tail -n +0 -f out.avi  | ffmpeg -i pipe:0  -hls_time 1 -hls_list_size 0 -hls_wrap 10 -hls_segment_filename '%03d.ts' stream.m3u8 

这可行,但会导致延迟问题。

我曾尝试更改C ++代码,以便使用cout << frame;将帧写入stdout cout << frame; 这里是一些代码。

imshow( window_name, frame );//show frame
video.write(frame);//rec to avi
cout << frame;

从上面的代码中,我得到窗口来显示处理后的图像,框架以avi格式保存,并从最后一行我打印到命令行帧的像素值。

现在我已经尝试了下面的Bash脚本来将这个stdout传递给ffmpeg,但没有成功。

./OpenCV | ffmpeg -i pipe:0  -hls_time 1 -hls_list_size 0 -hls_wrap 10 -hls_segment_filename '%03d.ts' stream.m3u8 

我也试过了

./OpenCV | ffmpeg -i pipe:0 -f rawvideo -pix_fmt bgr24 -s 480x320 -hls_time 1 -hls_list_size 0 -hls_wrap 10 -hls_segment_filename '%03d.ts' stream.m3u8

任何人有任何想法?


问题在于cout<< frame; 打印由openCV定义的Mat结构的像素值。 您需要的是您可以使用imencode检索的帧的实际二进制数据

std::vector<uchar> buff;    
cv::imencode(".jpg", frame, buff);
for (auto i = buff.begin(); i != buff.end(); ++i)
    std::cout << *i ;

如果你想测试它,你可以将缓冲区写入一个文件,并看到这样的输出

std::vector<uchar> buff;
cv::imencode(".jpg", frame, buff);
std::ofstream myfile;
myfile.open("example.jpg", std::ios::binary);
for (auto i = buff.begin(); i != buff.end(); ++i)
{
    //std::cout << *i;
    myfile << *i;
}
myfile.close();
链接地址: http://www.djcxy.com/p/81085.html

上一篇: OpenCV(programmed in C++) stdout piped to ffmpeg(in bashscript)?

下一篇: Virtual Webcam Driver