我正在使用以下bash脚本来传递OpenCV的输出,这是一个out.avi文件,使用tail命令将该文件转换为stdout并将输出传递给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,这是其中的一些代码。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();
关于c++ - OpenCV(用C++编程)stdout管道到ffmpeg(在bash脚本中)?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35480961/