c# - 处理来自标准输出的 jpgs 流

标签 c# .net ffmpeg stdout

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

谢谢。

最佳答案

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

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

  • 将中间文件存储在磁盘上,但我想这正是您想要避免的。
  • 尝试最低限度地解析文件 - JPEG 文件以 SOI 开头标记(十六进制 FF D8)并以 EOI 结尾标记(十六进制 FF D9)。使用相对简单的状态机,您可以尝试以这种方式将 JPG 流拆分为单独的帧。现在,为了稳健起见,最好单独读取这些段(参见 the JPEG file format 了解更多信息)。您也可以学习ffmpeg mjpeg decoder的源代码实现,看起来相当健壮。
  • 关于c# - 处理来自标准输出的 jpgs 流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11742896/

    相关文章:

    c# - Convert.ChangeType 为可为空的 int 引发无效的强制转换异常

    c# - 神圣的倒影

    c# - 向 UI 传达错误消息的建议做法

    c# - 我应该为我的应用程序使用托管 C++ 还是 C#?

    bash - ffmpeg 将音频混合代码组合成复杂的连接脚本

    c++ - 如何更改通过 C++ 上的 FFMPEG 库提取的帧的配色方案?

    c# - ASP.Net 中的 response.redirect 问题

    c# - 数组元数据问题(缓存行)

    c# - 长原语的 GetHashCode()

    python - 是否可以在 aws lambda 函数中安装 s3fs-fuse?