我正在使用以下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/

10-13 07:01