c#使用管道获取输出流

时间:2017-01-01 17:43:53

标签: c# asynchronous ffmpeg pipe youtube-dl

我正在尝试将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指定输入文件/流)。使用管道:0也不起作用,我不知道如何将第一个管道输出链接到第二个输入。

2 个答案:

答案 0 :(得分:0)

在进行处理而不是启动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");

答案 1 :(得分:0)

pipe:0是stdin,所以当你启动ffmpeg.exe你可以设置RedirectStandardInput = true,然后使用Process StandardInput属性来获取要写入的流,然后你可以将它连接到另一个的StandardOutput属性使用StreamReader + StreamWriter +字节数组缓冲区进行处理。

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