【问题标题】:Processing jpgs stream from the standard output处理来自标准输出的 jpgs 流
【发布时间】:2012-07-31 23:54:48
【问题描述】:

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

谢谢。

【问题讨论】:

    标签: c# .net ffmpeg stdout


    【解决方案1】:

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

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

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

    【讨论】:

    • 我想(第二个选项)是要走的路,我会看看那些链接。
    • 这当然是可行的,甚至没有那么长,ffmpeg 解码器实际上读取了所有片段,这应该使检测比仅仅通过触发 SOI-EOI 更加强大
    • 我正在使用 SOI/EOI 状态机获得一些结果,但是你的意思是“..ffmpeg 解码器实际上读取了所有应该使检测更加强大的片段......” ?
    • 在上述文件中读取函数find_frame_end,您会看到代码实际上在段之间“跳跃”,使用每个段中包含的长度。因为 SOI/EOI 没有转义,所以这些序列可能出现在数据流中,从而导致错误检测。实际上阅读这些片段并使用它们宣布的长度可以避免这个问题。
    • 感谢您的帮助,非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2013-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多