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)?