最近完成了這個小demo,來分享一下!
上面給了我兩天時間,來完成這個小功能
于時我花了半天時間從網絡上到處鄱資料,又花了半天時間調試代碼,成功之後,終于有了以下一點的經驗之談:
這裡講一下重要的:
1.用到兩個工具,一個是ffmpeg.exe,另一個是mencoder.exe
這裡有一個重點,網上的文章都沒講到,是以造成有些人運作後沒反應,原因是上面路徑的下載下傳,有很多版本,不同的版本可能個别參數不同,而網上的文章所用的參數都是用很早的版本寫的,是以會造成運作後因參數錯誤而沒有效果
簡單處理是:把網上參數在cmd指令行執行一下,這時指令行會報哪個參數錯誤,把它删了即可!
2.判斷處理成功與失敗或是進度是否完成,從異步擷取的輸出資訊判斷[包括擷取原視訊的寬與高]
這裡重點在兩個委托事件中,詳情見以下幾行代碼
1
2 private void startprocess(string tool)
3 {
4 startprocess(tool, false);
5 }
6 private void startprocess(string tool,bool onlycheckinfo)
7 {
8 system.diagnostics.process p = new system.diagnostics.process();
9 p.startinfo.filename = tool;
10 p.startinfo.arguments = commandpara;
11 p.startinfo.useshellexecute = false;
12 p.startinfo.redirectstandardinput = true;
13 p.startinfo.redirectstandardoutput = true;
14 p.startinfo.redirectstandarderror = true;
15 p.startinfo.createnowindow = false;
16 p.outputdatareceived += new system.diagnostics.datareceivedeventhandler(p_outputdatareceived);
17 if (onlycheckinfo)//隻檢測檔案是否可轉換與獲到内部寬與高
18 {
19 p.errordatareceived += new system.diagnostics.datareceivedeventhandler(p_checkinfodatareceived);
20 }
21 else
22 {
23 p.errordatareceived += new system.diagnostics.datareceivedeventhandler(p_errordatareceived);
24 }
25 //開始執行
26 try
27 {
28 p.start();
29 p.beginoutputreadline();
30 p.beginerrorreadline();
31 p.waitforexit();
32 }
33 catch (exception err)
34 {
35 console.writeline(err.message);
36 }
37 finally
38 {
39 p.close();
40 }
41 }
42 void p_checkinfodatareceived(object sender, system.diagnostics.datareceivedeventargs e)
43 {
44 if (!string.isnullorempty(e.data))
45 {
46 if (e.data.contains("stream") && e.data.contains("video:"))//設定原視訊視窗大小作為flv視訊的寬與高
47 {
48 match match = regex.match(e.data, @", (\d+)x(\d+)");
49 if (match != null)
50 {
51 videowidth = match.groups[1].value;
52 videoheight = match.groups[2].value;
53 }
54 }
55 else if (e.data.contains("could not find codec parameters"))//ffmpeg轉換失敗
56 {
57 iscanchangetoflv = false;
58 program.setdatabase(id, 1, count + 1);
59 }
60 }
61
62 }
63
64 void p_errordatareceived(object sender, system.diagnostics.datareceivedeventargs e)
65 {
66 if (!string.isnullorempty(e.data))
67 {
68 if (e.data.contains("video:") && e.data.contains("muxing overhead"))//ffmpeg轉換完成
69 {
70 program.setdatabase(id, 2, count + 1);
71 console.writeline("轉換完成");
72 }
73 console.writeline(e.data);
74 }
75
76 }
77
78 void p_outputdatareceived(object sender, system.diagnostics.datareceivedeventargs e)
79 {
80 if (!string.isnullorempty(e.data))
81 {
82 if (e.data.contains("writing index"))//mencoder轉換完成
83 {
84 program.setdatabase(id, 2, count + 1);
85 console.writeline("轉換完成");
86 }
87 //else if (e.data.contains("exiting"))//mencoder轉換失敗
88 //{
89 // console.writeline("轉換失敗");
90 //}
91 console.writeline(e.data);
92 }
93 }
94
95
本文隻講重點,請結合網絡其它文章與本文即可!
版權聲明:本文原創發表于部落格園,作者為路過秋天,原文連結:http://www.cnblogs.com/cyq1162/archive/2008/10/15/1311410.html