【问题标题】:How to use pipe in ffmpeg within c#如何在 c# 中的 ffmpeg 中使用管道
【发布时间】:2013-11-08 14:52:04
【问题描述】:

我有 100 张 jpeg。

我使用 ffmpeg 编码为写入硬盘的视频文件。

有没有办法将它直接通过管道传输到字节/流?

我正在使用 C#,我正在使用进程类来启动 ffmpeg。

谢谢

【问题讨论】:

    标签: c# ffmpeg


    【解决方案1】:

    您应该直接从您的代码中访问 ffmpeg 库,而不是运行 ffmpeg 进程。例如,查看AForge.Net。除其他外,它还有一个 ffmpeg 托管包装器。您对AForge.Video.FFMPEG.VideoFileWriter 类很感兴趣,它正是这样做的——使用指定的编码器将图像写入视频文件流。有关详细信息,请参阅在线文档。

    【讨论】:

    • 嗨,我以为它只生成一个 avi 文件?我非常了解 Aforge,但我看不到像传递给 ffmpeg 那样的参数的方法?
    • @AndrewSimpson,你可能是对的。如果文件格式对您来说是一个限制因素,您可以在网上查找其他包装器(我不能给您推荐)。或创建自己的。我认为使用命令行对于此类任务将是一个更好的解决方案。但是,这取决于你,ofc。
    【解决方案2】:

    以防万一有人想知道。在参数末尾添加“-”会将流重定向到标准输出,如果您订阅流程类的 OutputDataReceived 事件,则可以捕获该输出。

    【讨论】:

    • 它是重定向ffmpeg的输出还是它的日志?
    【解决方案3】:
    using System;
    using System.Diagnostics;
    using System.Drawing;
    using System.IO;
    
    namespace PipeFfmpeg
    {
        class Program
        {
            public static void Video(int bitrate, int fps, string outputfilename)
            {
                Process proc = new Process();
    
                proc.StartInfo.FileName = @"ffmpeg.exe";
                proc.StartInfo.Arguments = String.Format("-f image2pipe -i pipe:.bmp -maxrate {0}k -r {1} -an -y {2}",
                    bitrate, fps, outputfilename);
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.RedirectStandardInput = true;
                proc.StartInfo.RedirectStandardOutput = true;
    
                proc.Start();
    
                for (int i = 0; i < 500; i++)
                {
                    using (var ms = new MemoryStream())
                    {
                        using (var img = Image.FromFile(@"lena.png"))
                        {
                            img.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
                            ms.WriteTo(proc.StandardInput.BaseStream);
                        }
                    }
                }            
            }
    
            static void Main(string[] args)
            {
                Video(5000, 10, "lena.mp4");
            }
        }
    }
    

    【讨论】:

    • 尊敬的先生,我已经尝试过您的解决方案,但这会引发错误“管道已结束”,请帮忙?
    • 快速提问,如果我们希望进程继续工作并逐帧为我们提供图像字节,比如 5 个文件就足够了
    【解决方案4】:

    几周前我在寻找问题的答案时发现了这篇文章。 我试图启动 ffmpeg 进程并将参数传递给它,但是做所有事情都需要很长时间。此时我使用Xabe.FFmpeg,因为它开箱即用,不必担心 ffmpeg 可执行文件,因为它具有下载最新版本的功能。

    bool conversionResult = await new Conversion().SetInput(Resources.MkvWithAudio)
      .AddParameter(String.Format("-f image2pipe -i pipe:.bmp -maxrate {0}k -r {1} -an -y {2}",bitrate, fps, outputfilename))
      .Start();
    

    【讨论】:

    • 这是一个商业广告(必须为产品付费)。所以对我没有好处。不过谢谢
    • 非商业用途免费:)
    猜你喜欢
    • 2011-06-01
    • 2013-11-05
    • 2019-07-26
    • 2015-04-12
    • 1970-01-01
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多