最近完成了这个小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 }