如何使用FFMpeg(C#)对数据流进行代码转换



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

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

假设我有一个字节数组。

为了解决这个问题,我生成了一个新的FFMpeg进程。然后我使用pipe命令,通过标准输入发送数据,并使用标准输出获得输出。然后,我将收到的输出转换为字节数组。新的字节数组是经过代码转换的数据。您可以将这个字节缓冲区写入内存流或文件流,您可以随心所欲。

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输入通道,我们可以这样做:

_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
}
}

最新更新