如何设置ffmpeg管道输出?

时间:2018-09-12 21:40:44

标签: c# audio ffmpeg .net-core pipe

我需要将ffmpeg输出读取为管道。 有一个代码示例:

    public static void PipeTest()
    {
        Process proc = new Process();
        proc.StartInfo.FileName = Path.Combine(WorkingFolder, "ffmpeg");
        proc.StartInfo.Arguments = String.Format("$ ffmpeg -i input.mp3 pipe:1");
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.RedirectStandardInput = true;
        proc.StartInfo.RedirectStandardOutput = true;
        proc.Start();

        FileStream baseStream = proc.StandardOutput.BaseStream as FileStream;
        byte[] audioData;
        int lastRead = 0;

        using (MemoryStream ms = new MemoryStream())
        {
            byte[] buffer = new byte[5000];
            do
            {
                lastRead = baseStream.Read(buffer, 0, buffer.Length);
                ms.Write(buffer, 0, lastRead);
            } while (lastRead > 0);

            audioData = ms.ToArray();
        }

        using(FileStream s = new FileStream(Path.Combine(WorkingFolder, "pipe_output_01.mp3"), FileMode.Create))
        {
            s.Write(audioData, 0, audioData.Length);
        }
    }

这是ffmpeg的日志,将读取第一个文件:

  

从“ norm.mp3”输入#0,mp3:     元数据:       编码器:Lavf58.17.103     持续时间:00:01:36.22,开始:0.023021,比特率:128 kb / s       流#0:0:音频:mp3、48000 Hz,立体声,fltp,128 kb / s       元数据:         编码器:Lavc58.27

然后管道:

  

[NULL @ 0x7fd58a001e00]无法为'$'找到合适的输出格式   $:参数无效

如果我运行“ -i input.mp3管道:1”,则日志为:

  

无法为'pipe:1'管道找到合适的输出格式:1:无效   论点

如何设置正确的输出? ffmpeg应该怎么知道输出格式是什么?

2 个答案:

答案 0 :(得分:1)

在我看来,"$ ffmpeg -i input.mp3 pipe:1"中有一个错字。如果您只想使用ffmpeg之类的选项来调用-i,请忽略$字符。 "ffmpeg -i input.mp3 pipe:1"。您已经在StartInfo.FileName中传递了主程序名称。因此,您可能也应该将其排除在外。只需将"-i input.mp3 pipe:1"用作您的Arguments

答案 1 :(得分:0)

每当在ffmpeg中使用管道输出时,都需要使用-f fmt参数来避免看到的错误。

您可以通过键入ffmpeg -formats获得可能的格式列表。

例如,如果要使用wav文件,请添加-f wav

在您的示例中,参数应为:

-i input.mp3 -f wav pipe:1

您可以用flac或您喜欢的任何其他音频格式替换wav。