如何使用 FFMpeg 转码数据流 (C#)

Syl*_*ens 2 c# audio ffmpeg .net-core

如何将 MP3 音频字节流发送到 FFMpeg 并获取输出到 PCM 字节流?我不想将传入流写入文件并让 FFMpeg 处理该文件。我希望转码实时发生。

我知道我们可以使用管道命令将数据流传输到 FFMpeg,如何从我的 C# 程序流式传输数据。

假设我有一个字节数组。

Syl*_*ens 6

为了解决这个问题,我创建了一个新的 FFMpeg 进程。然后我使用管道命令并通过标准输入发送数据,并使用标准输出获取输出。然后我将收到的输出转换为字节数组。新的字节数组是转码后的数据。您可以将此字节缓冲区写入内存流或文件流,您可以做您喜欢的事情。

        var startInfo = new ProcessStartInfo('path/to/ffmpeg');
        startInfo.RedirectStandardInput = true;
        startInfo.RedirectStandardOutput = true;
        startInfo.UseShellExecute = false;

        var argumentBuilder = new List<string>();
        argumentBuilder.Add("-loglevel panic"); // this makes sure only data is sent to stdout
        argumentBuilder.Add("-i pipe:.mp3"); //this sets the input to stdin

        // the target audio specs are as follows
        argumentBuilder.Add($"-f wav");
        argumentBuilder.Add("-ac 1");
        argumentBuilder.Add($"-ar 44100");
        argumentBuilder.Add("pipe:1"); // this sets the output to stdout

        startInfo.Arguments = String.Join(" ", argumentBuilder.ToArray());

        _ffMpegProcess = new Process();
        _ffMpegProcess.StartInfo = startInfo;

        _ffMpegProcess.Start();
Run Code Online (Sandbox Code Playgroud)

我们必须使用标准输入将数据写入 FFMpeg 输入通道,我们可以这样做:

        _ffMpegProcess.StandardInput.BaseStream.Write(byteBuffer);
Run Code Online (Sandbox Code Playgroud)

这将使 FFMpeg 将结果返回到标准输出,我们现在需要听它,如下所示:

        while (true)
        {
            var bytes = new byte[1024]
            var result = await _ffMpegProcess.StandardOutput.BaseStream.ReadAsync(bytes);

            if (result == 0)
            {
               // no data retrieved
            }
            else
            {
               // do something with the data
            }
        }
Run Code Online (Sandbox Code Playgroud)