【问题标题】:OpenCV(programmed in C++) stdout piped to ffmpeg(in bashscript)?OpenCV(用 C++ 编程)到 ffmpeg(在 bash 脚本中)的标准输出管道?
【发布时间】:2016-05-30 14:08:29
【问题描述】:

我正在使用以下 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; 将帧写入标准输出,这是其中的一些代码。

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

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

现在我尝试使用以下 Bash 脚本将此标准输出通过管道传输到 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

有人有什么想法吗?

【问题讨论】:

    标签: c++ bash opencv ffmpeg pipe


    【解决方案1】:

    问题在于cout&lt;&lt; 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();
    

    【讨论】:

    • 谢谢 Thesane。得到代码工作唯一的改变是删除自动并将其声明为vector&lt;uchar&gt; :: iterator i;所以for循环是for ( i = buff.begin(); i != buff.end(); ++i) std::cout &lt;&lt; *i ;auto对我不起作用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-05
    • 2014-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多