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

标签 c# audio .net-core ffmpeg

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

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

假设我有一个字节数组。

最佳答案

为了解决这个问题,我创建了一个新的 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();

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

        _ffMpegProcess.StandardInput.BaseStream.Write(byteBuffer);

这将使 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
            }
        }

关于c# - 如何使用 FFMpeg 转码数据流 (C#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58905280/

相关文章:

c# - 在 .NET Core 项目中引用外部 DLL

c# - 如何在 XAML 模板中使用 WPF 自定义控件属性?

javascript - ECMAScript-6音频永远重复

javascript - 如何按数组的长度加载多个音频播放器并在每个播放器上播放不同的声音?

audio - 具有极长音频的 FFMPEG 视频

c# - .net core 2.2 windows服务完全启动后,如何配置托管服务启动?

.net-core - 带有 dotnet 核心的 Parceljs

c# - 检查每个页面的权限

c# - Entity Framework Core 5 : configuring many to many relationships, 如何指定外键名称

c# - 套接字监听器同时进行多个 AcceptAsync 调用