2010-06-04 20 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

相關問題