C# - 解析ffmpeg提取图像时的标准输出

6

我正在从我的c#代码中启动一个ffmpeg进程来提取单个视频帧。默认行为是将这些图像写入磁盘。

然而,为了加快处理速度,我希望将ffmpeg标准输出重定向到接收流并在我的程序中进一步处理它。

我使用类似于以下的参数:

-i \"" + Filename + "\" -vf \"scale=640:-1\" -an -vframes 100 -r 1 -f image2 -

这会将字节流重定向到标准输出,我可以使用process.StartInfo.RedirectStandardOutput = true将其重定向到我的程序。

对于电影流来说,这可能很好用,因为我只有一个输出,但是上面的调用将产生10个单独的图像(在写入硬盘时),我该如何解析标准输出中的字节流并将其拆分成单个文件?


如果您知道分辨率,应该通过计算字节来知道它。如果是写入未压缩图像,则这是正确的。如果打印JPG文件,则我不知道。您需要尝试一两个三个图像,以检查FFmpeg是否在帧之间发送分隔符。 - Alois Kraus
2个回答

4

我找到了一个看起来可行的解决方案,但很奇怪,在ffmpeg文档中并没有提到:使用image2pipe作为输出格式。

所以对于上面的例子,应该是:

-i \"" + Filename + "\" -vf \"scale=640:-1\" -an -vframes 100 -r 1 -f image2pipe -

这将字节流重定向到标准输出,并允许捕获和解析图像。

我发布了一个相关问题,你可能能够回答:http://stackoverflow.com/questions/11742896/processing-jpgs-stream-from-the-standard-output - D.Rosado
代码的实现取决于你想要实现什么。对于我的特定问题,我需要将输出作为字节流传递,然后使用我的程序解析它。这里的诀窍是,你会得到一个包含所有图像的单个流。你必须手动确定何时开始新的图像,以知道哪些字节实际上代表单个图像。这可以通过等待所选格式的“魔数”来完成。如果你需要额外的帮助,请发布一个带有更多细节的单独问题。 - leepfrog
@leeprfoog,您能详细说明一下魔数是什么吗?因为链接已经失效了。谢谢。 - IR_IR

0

感谢您的回答@leepfrog 这基本上是一样的:

StringBuilder str = new StringBuilder();

        //Input file path
        str.Append(string.Format(" -i {0}", myinputFile));

        //Set the frame rate
        str.Append(string.Format(" -r {0}", myframeRate);

        //Indicate the output format
        str.Append(" -f image2pipe");

        //Connect the output to the standard output
        str.Append(" pipe:1");



        return str.ToString();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接