NET 2.0(C#)調用ffmpeg處理視頻的方法

來源:互聯網
上載者:User
.NET 2.0 調用 FFMPEG,並非同步讀取輸出資訊的代碼...
public void ConvertVideo()
{
            Process p = new Process();//建立外部 調用線程
            p.StartInfo.FileName = @"c:\ffmpeg.exe";//要調用外部程式的絕對路徑
            p.StartInfo.Arguments = "-i XXXXXXXXXXXXXX";//參數(這裡就是FFMPEG的參數了)
            p.StartInfo.UseShellExecute = false;//不使用作業系統外殼程式 啟動線程(一定為FALSE,詳細的請看MSDN)
            p.StartInfo.RedirectStandardError = true;//把外部程式錯誤輸出寫到StandardError流中(這個一定要注意,FFMPEG的所有輸出資訊,都為錯誤輸出資料流,用 StandardOutput是捕獲不到任何訊息的...這是我耗費了2個多月得出來的經驗...mencoder就是用standardOutput來 捕獲的)
            p.StartInfo.CreateNoWindow = false;//不建立 進程視窗
            p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程式(這裡是FFMPEG)輸出資料流時候產生的事件,這裡是把流的處理過程轉 移到下面的方法中,詳細請查閱MSDN
            p.Start();//啟動線程
            p.BeginErrorReadLine();//開始非同步讀取
            p.WaitForExit();//阻塞等待進程結束
            p.Close();//關閉進程
            p.Dispose();//釋放資源
}
private void Output(object sendProcess, DataReceivedEventArgs output)
{
       if (!String.IsNullOrEmpty(output.Data))
       {
                //處理方法...
        }
}

BeginErrorReadLine 可同步或非同步讀取 StandardError 流。Read、ReadLine 和 ReadToEnd 等方法對進程的錯誤輸出資料流執行同步讀取操作。這些同步讀取操作只有在關聯的 Process寫入其 StandardError 流或關閉該流後才能完成。相反,BeginErrorReadLine 在 StandardError 流上開始非同步讀取操作。此方法會為流輸出啟用指定的事件處理常式並立即返回到調用方,這樣當流輸出被定向到該事件處理常式時,調用方還可以執行其他動作。 按照這些步驟對 Process 的 StandardError 執行非同步讀取操作: 將 UseShellExecute 設定為 false。 將 RedirectStandardError 設定為 true。 向 ErrorDataReceived 事件添加事件處理常式。事件處理常式必須與 System.Diagnostics.DataReceivedEventHandler 委託簽名相匹配。 啟動 Process。 調用 Process 的 BeginErrorReadLine。此調用將啟動 StandardError 上的非同步讀取操作。 啟動非同步讀取操作時,關聯的 Process 每向其 StandardError 流寫入一行文本時,都將調用該事件處理常式。可通過調用 CancelErrorRead取消非同步讀取操作。可通過調用方或事件處理常式取消讀取操作。取消之後,可以再次調用 BeginErrorReadLine 繼續進行非同步讀取操作。 ErrorDataReceived 事件指示關聯的進程已寫入其重新導向 StandardError 流中。該事件僅在對 StandardError 進行非同步讀取操作期間發生。若要啟動非同步讀取操作,必須重新導向 Process 的 StandardError 流,向 ErrorDataReceived 事件添加事件處理常式,並調用 BeginErrorReadLine。之後,每當該進程向重新導向 StandardError 流中寫入一行時,ErrorDataReceived 事件都會發出訊號,直到該進程退出或調用 CancelErrorRead為止。
 .NET 2.0 調用FFMPEG,並同步讀取輸出資訊的代碼...
public void ConvertVideo()
{
            Process p = new Process();//建立外部調用線程
            p.StartInfo.FileName = @"c:\ffmpeg.exe";//要調用外部程式的絕對路徑
            p.StartInfo.Arguments = "-i XXXXXXXXXXXXXX";//參數(這裡就是FFMPEG的參數了)
            p.StartInfo.UseShellExecute = false;//不使用作業系統外殼程式啟動線程(一定為FALSE,詳細的請看MSDN)
            p.StartInfo.RedirectStandardError = true;//把外部程式錯誤輸出寫到StandardError流中(這個一定要注意,FFMPEG的所有輸出資訊,都為錯誤輸出資料流,用 StandardOutput是捕獲不到任何訊息的...這是我耗費了2個多月得出來的經驗...mencoder就是用standardOutput來 捕獲的)
            p.StartInfo.CreateNoWindow = false;//不建立進程視窗
            p.Start();//啟動線程
            p.WaitForExit();//等待完成
            p.StandardError.ReadToEnd();//開始同步讀取
            p.Close();//關閉進程
            p.Dispose();//釋放資源
}

 
StandardError 可以同步或非同步讀取重新導向的 StandardError 流。Read、ReadLine 和 ReadToEnd 等方法對進程的錯誤輸出資料流執行同步讀取操作。這些同步讀取操作只有在關聯的 Process 寫入其 StandardError 流或關閉該流後才能完成。相反,BeginErrorReadLine 在 StandardError 流上開始非同步讀取操作。此方法為流輸出啟用一個指定的事件處理常式並立即返回到調用方,這樣當流輸出被定向到該事件處理常式時,調用方可以執行其他動作。 同步讀取操作在讀取 StandardError 流的調用方及寫入該流中的子進程之間引入一個依賴項。這些依賴項可能導致產生死結情況。調用方讀取子進程的重新導向流時依賴於該子進程。調用方將等待讀取操 作,直到子進程寫入流或關閉流為止。子進程寫入足夠多的資料以填充重新導向流的時間依賴於父進程。子進程將等待下一次寫操作,直到父進程讀取了全部流或關閉 該流為止。當調用方和子進程相互等待對方完成操作時,就會產生死結情況,使雙方都無法繼續執行操作。您可以通過計算調用方和子進程之間的依賴項從而避免出 現死結情況。

PS.以上全部引用來自MSDN(代碼除外)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.