【发布时间】:2021-04-09 02:27:38
【问题描述】:
我正在使用我的 C# 应用程序中的 FFMPEG 从原始未编码帧构建视频流。对于一个输入流,这相当简单:
var argumentBuilder = new List<string>();
argumentBuilder.Add("-loglevel panic");
argumentBuilder.Add("-f h264");
argumentBuilder.Add("-i pipe:");
argumentBuilder.Add("-c:v libx264");
argumentBuilder.Add("-bf 0");
argumentBuilder.Add("-pix_fmt yuv420p");
argumentBuilder.Add("-an");
argumentBuilder.Add(filename);
startInfo.Arguments = string.Join(" ", argumentBuilder.ToArray());
var _ffMpegProcess = new Process();
_ffMpegProcess.EnableRaisingEvents = true;
_ffMpegProcess.OutputDataReceived += (s, e) => { Debug.WriteLine(e.Data); };
_ffMpegProcess.ErrorDataReceived += (s, e) => { Debug.WriteLine(e.Data); };
_ffMpegProcess.StartInfo = startInfo;
Console.WriteLine($"[log] Starting write to {filename}...");
_ffMpegProcess.Start();
_ffMpegProcess.BeginOutputReadLine();
_ffMpegProcess.BeginErrorReadLine();
for (int i = 0; i < videoBuffer.Count; i++)
{
_ffMpegProcess.StandardInput.BaseStream.Write(videoBuffer[i], 0, videoBuffer[i].Length);
}
_ffMpegProcess.StandardInput.BaseStream.Close();
我试图解决的挑战之一是写入两个输入管道,类似于我可以通过引用 pipe:4 或 pipe:5 从 Node.js 做到这一点。 似乎我只能直接写入标准输入,但不能将其拆分为“通道”。
在 C# 中执行此操作的方法是什么?
【问题讨论】:
-
目的是什么?你想让 ffmpeg 在输出文件中创建两个视频流吗?
-
你必须使用
NamedPipeServerStream...没有写多个NamedPipeServerStream的例子...Here建议异步写... -
@CaiusJard 不,我想合并视频和音频流,
ffmpeg通过分离管道来支持。但是,似乎没有像在其他平台上那样简单的方法。 -
谢谢@xanatos - 这似乎是正确的方法。我将探索该选项并报告结果。随意张贴这个问题的答案,这样我就可以在我完成实验后将其标记出来(你得到分数)。
标签: c# ffmpeg process console-application stdin