public void ConvertVideo()
{
Process p = new Process();//建立外部調(diào)用線程p.StartInfo.FileName = @"c:\ffmpeg.exe";//要調(diào)用外部程序的絕對(duì)路徑p.StartInfo.Arguments = "-i XXXXXXXXXXXXXX";//參數(shù)(這里就是FFMPEG的參數(shù)了)p.StartInfo.UseShellExecute = false;//不使用操作系統(tǒng)外殼程序啟動(dòng)線程(一定為FALSE,詳細(xì)的請(qǐng)看MSDN)p.StartInfo.RedirectStandardError = true;//把外部程序錯(cuò)誤輸出寫(xiě)到StandardError流中(這個(gè)一定要注意,FFMPEG的所有輸出信息,都為錯(cuò)誤輸出流,用StandardOutput是捕獲不到任何消息的...這是我耗費(fèi)了2個(gè)多月得出來(lái)的經(jīng)驗(yàn)...mencoder就是用standardOutput來(lái)捕獲的)p.StartInfo.CreateNoWindow = false;//不創(chuàng)建進(jìn)程窗口p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程序(這里是FFMPEG)輸出流時(shí)候產(chǎn)生的事件,這里是把流的處理過(guò)程轉(zhuǎn)移到下面的方法中,詳細(xì)請(qǐng)查閱MSDNp.Start();//啟動(dòng)線程p.BeginErrorReadLine();//開(kāi)始異步讀取p.WaitForExit();//阻塞等待進(jìn)程結(jié)束p.Close();//關(guān)閉進(jìn)程p.Dispose();//釋放資源
} private void Output(object sendProcess, DataReceivedEventArgs output) {
if (!String.IsNullOrEmpty(output.Data)){//處理方法...}
}
BeginErrorReadLine 可同步或異步讀取 StandardError 流。Read、ReadLine 和 ReadToEnd 等方法對(duì)進(jìn)程的錯(cuò)誤輸出流執(zhí)行同步讀取操作。這些同步讀取操作只有在關(guān)聯(lián)的 Process寫(xiě)入其 StandardError 流或關(guān)閉該流后才能完成。 相反,BeginErrorReadLine 在 StandardError 流上開(kāi)始異步讀取操作。此方法會(huì)為流輸出啟用指定的事件處理程序并立即返回到調(diào)用方,這樣當(dāng)流輸出被定向到該事件處理程序時(shí),調(diào)用方還可以執(zhí)行其他操作。 按照這些步驟對(duì) Process 的 StandardError 執(zhí)行異步讀取操作:
- 將 UseShellExecute 設(shè)置為 false。
- 將 RedirectStandardError 設(shè)置為 true。
- 向 ErrorDataReceived 事件添加事件處理程序。事件處理程序必須與 System.Diagnostics.DataReceivedEventHandler?委托簽名相匹配。
- 啟動(dòng) Process。
- 調(diào)用 Process 的 BeginErrorReadLine。此調(diào)用將啟動(dòng) StandardError 上的異步讀取操作。
- 啟動(dòng)異步讀取操作時(shí),關(guān)聯(lián)的 Process 每向其 StandardError 流寫(xiě)入一行文本時(shí),都將調(diào)用該事件處理程序。
- 可通過(guò)調(diào)用 CancelErrorRead取消異步讀取操作。可通過(guò)調(diào)用方或事件處理程序取消讀取操作。取消之后,可以再次調(diào)用 BeginErrorReadLine 繼續(xù)進(jìn)行異步讀取操作。
ErrorDataReceived 事件指示關(guān)聯(lián)的進(jìn)程已寫(xiě)入其重定向 StandardError 流中。 該事件僅在對(duì) StandardError 進(jìn)行異步讀取操作期間發(fā)生。若要啟動(dòng)異步讀取操作,必須重定向 Process 的 StandardError 流,向 ErrorDataReceived 事件添加事件處理程序,并調(diào)用 BeginErrorReadLine。之后,每當(dāng)該進(jìn)程向重定向 StandardError 流中寫(xiě)入一行時(shí),ErrorDataReceived 事件都會(huì)發(fā)出信號(hào),直到該進(jìn)程退出或調(diào)用 CancelErrorRead為止。
?
NET 2.0 調(diào)用FFMPEG,并同步讀取輸出信息的代碼...
public void ConvertVideo() { Process p = new Process();//建立外部調(diào)用線程 p.StartInfo.FileName = @"c:\ffmpeg.exe";//要調(diào)用外部程序的絕對(duì)路徑 p.StartInfo.Arguments = "-i XXXXXXXXXXXXXX";//參數(shù)(這里就是FFMPEG的參數(shù)了) p.StartInfo.UseShellExecute = false;//不使用操作系統(tǒng)外殼程序啟動(dòng)線程(一定為FALSE,詳細(xì)的請(qǐng)看MSDN) p.StartInfo.RedirectStandardError = true;//把外部程序錯(cuò)誤輸出寫(xiě)到StandardError流中(這個(gè)一定要注意,FFMPEG的所有輸出信息,都為錯(cuò)誤輸出流,用StandardOutput是捕獲不到任何消息的...這是我耗費(fèi)了2個(gè)多月得出來(lái)的經(jīng)驗(yàn)...mencoder就是用standardOutput來(lái)捕獲的) p.StartInfo.CreateNoWindow = false;//不創(chuàng)建進(jìn)程窗口 p.Start();//啟動(dòng)線程 p.WaitForExit();//等待完成 p.StandardError.ReadToEnd();//開(kāi)始同步讀取 p.Close();//關(guān)閉進(jìn)程 p.Dispose();//釋放資源 }
StandardError 可以同步或異步讀取重定向的 StandardError 流。Read、ReadLine 和 ReadToEnd 等方法對(duì)進(jìn)程的錯(cuò)誤輸出流執(zhí)行同步讀取操作。這些同步讀取操作只有在關(guān)聯(lián)的 Process 寫(xiě)入其 StandardError 流或關(guān)閉該流后才能完成。 相反,BeginErrorReadLine 在 StandardError 流上開(kāi)始異步讀取操作。此方法為流輸出啟用一個(gè)指定的事件處理程序并立即返回到調(diào)用方,這樣當(dāng)流輸出被定向到該事件處理程序時(shí),調(diào)用方可以執(zhí)行其他操作。 同步讀取操作在讀取 StandardError 流的調(diào)用方及寫(xiě)入該流中的子進(jìn)程之間引入一個(gè)依賴項(xiàng)。這些依賴項(xiàng)可能導(dǎo)致產(chǎn)生死鎖情況。調(diào)用方讀取子進(jìn)程的重定向流時(shí)依賴于該子進(jìn)程。調(diào)用方將等待讀取操作,直到子進(jìn)程寫(xiě)入流或關(guān)閉流為止。子進(jìn)程寫(xiě)入足夠多的數(shù)據(jù)以填充重定向流的時(shí)間依賴于父進(jìn)程。子進(jìn)程將等待下一次寫(xiě)操作,直到父進(jìn)程讀取了全部流或關(guān)閉該流為止。當(dāng)調(diào)用方和子進(jìn)程相互等待對(duì)方完成操作時(shí),就會(huì)產(chǎn)生死鎖情況,使雙方都無(wú)法繼續(xù)執(zhí)行操作。您可以通過(guò)計(jì)算調(diào)用方和子進(jìn)程之間的依賴項(xiàng)從而避免出現(xiàn)死鎖情況。
PS.以上全部引用來(lái)自MSDN(代碼除外)
我在.NET 2.0中用這些代碼,調(diào)用FFMPEG很方便...
至于同步還是異步...我會(huì)選擇異步的...因?yàn)楫惒胶芊奖?有信息就會(huì)自動(dòng)輸出...輸出的信息還可以經(jīng)過(guò)特定的處理代碼,把進(jìn)度等信息顯示出來(lái)...至于代碼怎么寫(xiě),無(wú)非就是文本處理操作...什么indexof,substring或者正則表達(dá)式之類的...
這只是代碼模型而已,可以引申出更高級(jí)的處理類,例如多線程調(diào)用,多線程并發(fā)處理,批處理(從文件列表或者數(shù)據(jù)庫(kù)數(shù)據(jù))等等...
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
