c#使用管道获取输出流

c# using pipes to get output stream

我正在尝试将 youtube-dl 输出通过管道传输到 ffmpeg 作为输入,但似乎无法使管道部分正常工作。在正常的 cmd 中,我可以做类似

 C:\YT\youtube-dl.exe -o - https://www.youtube.com/watch?v=L4aLQ0ki9Tk | ffmpeg -i pipe:0 -f asf pipe:1 

但在 C# 中这不起作用。目前,我有 c# 创建 2 个进程:

一个用于 youtube-dl

C:\YT\youtube-dl.exe -o - https://www.youtube.com/watch?v=L4aLQ0ki9Tk

另一个用于 ffmpeg

ffmpeg  -i {yt.StandardOutput} -f s16le -ar 48000 -ac 2 pipe:1

问题出在 {yt.StandardOutput}(其中 yt 是 youtube-dl 进程的进程名称,-i 指定输入 file/stream)。使用 pipe:0 也不起作用,我不确定如何 link 第一个的管道输出到第二个的输入。

在进行处理而不是将 youtube-dl.exeffmpeg 作为单独的进程启动时,使用 cmd.exe /C 从您的代码中启动命令 shell 本身,这将允许您使用将上下文从一个程序流向另一个程序的管道。

var proc = Process.Start("cmd.exe", 
                         "/C C:\YT\youtube-dl.exe -o - https://www.youtube.com/watch?v=L4aLQ0ki9Tk | ffmpeg -i pipe:0 -f asf pipe:1");

pipe:0 是标准输入,所以当你开始 ffmpeg.exe 时你可以设置 RedirectStandardInput = true,然后使用 Process StandardInput 属性 获取要写入的流,然后你可以挂钩这个使用 StreamReader + StreamWriter + 字节数组缓冲区的另一个进程的 StandardOutput 属性。

事实上,刚刚在Github上找到了一个例子:https://github.com/theogeer/aaxtomp3/blob/b05514036dff85d9c395bfa5d9bf272f6361e729/AaxToMp3GUI/AaxToMp3GUI/Converter.cs