1

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

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 的大小,但我不知道如何。

谢谢。

4

1 回答 1

2

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

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

  1. 将中间文件存储在磁盘上,但我想这正是您想要避免的。
  2. 尝试最低限度地解析文件 - JPEG 文件以SOI标记(十六进制 FF D8)开头并以标记(十六EOI进制 FF D9)结尾。使用相对简单的状态机,您可以尝试以这种方式将 JPG 流拆分为单独的帧。现在,为了稳健起见,单独读取段可能更好(有关更多信息,请参阅JPEG 文件格式)。您还可以研究ffmpeg mjpeg 解码器的源代码实现,它看起来相当健壮。
于 2012-07-31T15:54:48.647 回答