首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用FFMpeg (C#)转码数据流

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

Stack Overflow用户
提问于 2019-11-18 05:17:20
回答 1查看 2K关注 0票数 1

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

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

假设我有一个字节数组。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-18 05:17:20

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

代码语言:javascript
复制
        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输入通道,我们可以这样做:

代码语言:javascript
复制
        _ffMpegProcess.StandardInput.BaseStream.Write(byteBuffer);

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

代码语言:javascript
复制
        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
            }
        }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58905280

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档