2010-06-04 57 views
3

对于C#项目,我正在试验ffmpeg以从视频文件(在Windows中)中提取.wav文件。 您可以通过在命令行上运行它来执行此操作:“ffmpeg -i inputvid.avi +'extra parameters'+ extracted.wav”。 这显然会将输入.avi文件中的音频提取到指定的.wav文件。将数据写入cmd到内存而不是文件,用C#抓住它#

现在,我可以轻松地在C#中运行此命令,以便创建所需的.wav文件。但是,我不需要这个wav文件留在硬盘上。出于性能方面的原因,如果ffmpeg可以将该文件暂时保存到内存中,那么该内存就可以在我的C#程序中使用。执行完程序后,不再需要.wav文件。

所以实际的问题是:我可以将输出文件从程序重定向到内存吗? 如果这是可能的,我该如何在C#中读取?

我知道这是一个长镜头,我是很怀疑的,如果它是可能的,但我总能问...

在此先感谢。

回答

6

不是在ffmpeg命令行上指定输出文件名,而是使用' - '。 ' - '告诉ffmpeg发送输出到stdout。请注意,您可能必须在命令行中手动指定输出格式,因为ffmpeg无法再从文件名中派生出来('-f'开关可能是您需要的)。

一旦有了该命令行,请参阅reading stdout into your C# program中任意数量的帮助位置。

0

太棒了,听起来很简单!

我还有一个问题,但我现在用下面的代码:

System.Diagnostics.ProcessStartInfo psi = 
    new System.Diagnostics.ProcessStartInfo(@"ffmpeg.exe"); 
    psi.Arguments = @"-i movie.avi -vn -acodec pcm_s16le -ar 44100 -ac 1 -f wav -"; 
    psi.RedirectStandardOutput = true; 
    psi.UseShellExecute = false; 
    Process proc = Process.Start(psi); 
    System.IO.StreamReader myOutput = proc.StandardOutput; 
    proc.WaitForExit(); 
    string output; 
    if (proc.HasExited) 
    { 
     output = myOutput.ReadToEnd(); 
    } 
    MessageBox.Show("Done!"); 

当我现在执行这个,黑色的CMD框只是弹出,并在我不断闪烁。当我打开任务管理器时,它显示它没有做任何事情。

但是,如果我将RedirectStandardOutput属性设置为false,它将在cmd屏幕中显示正确的输出。

为了简化它:ffmpeg现在重定向了它的输出,但是我无法用我的C#代码读取它。

+1

你有一个僵局。 [RedirectStandardOutput上的MSDN文档](http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx)详细解释了相互依赖关系,但结果是您需要清除在等待进程完成之前(使用WaitForExit)流(使用ReadToEnd)*。 – ladenedge 2010-06-07 16:06:20

+0

谢谢,它现在可行! – Mee 2010-06-07 21:47:59