从标准输出处理jpgs流

时间:2012-07-31 14:53:04

标签: c# .net ffmpeg stdout

使用FFmpeg我将视频(mpeg2)转换为jpgs,将输出重定向到标准输出。

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();

我能够通过数据接收来自进程的回调:

_ffmpegProc.OutputDataReceived += new DataReceivedEventHandler(_ffmpegProc_OutputDataReceived);

但是如何将其保存回jpg文件?我需要知道每个jpg的大小,但我无法弄清楚如何。

感谢。

1 个答案:

答案 0 :(得分:1)

你不能没有阅读并至少部分理解流结构,因为JPEG文件不包含例如在文件开始的某处显式长度指示。

我看到两种不涉及转码的可能性:

  1. 将中间文件存储在磁盘上,但我想这正是您想要避免的。
  2. 尝试最低限度地解析文件 - JPEG文件以SOI标记(十六进制FF D8)开头,以EOI标记(十六进制FF D9)结束。使用相对简单的状态机,您可以尝试以这种方式将JPG流分割为单独的帧。现在,为了稳健起见,最好单独阅读这些段(有关详细信息,请参阅the JPEG file format)。您还可以研究ffmpeg mjpeg decoder的源代码实现,它看起来非常强大。