Run exe in background on .NET platform
前两天写了个Bash脚本,用来将Flv格式转换为Avi格式。可是,并不是每个人的电脑上都有Linux/Unix环境,在将这些小工具拿给别的使用的时候,我还要提供一个Windows可以执行的工具。本来我是想将Bash转换为Windows批处理的,弄了一会也没有搞好,后来想了一下,干脆写个Console Application去后台调用ffmpeg工具来执行转换工作。
工具写好了,当我调用ffmpeg.exe这个小工具的时候,老是出现一个cmd窗口,非常不美观。后来网上找了一下,将执行ffmpeg的窗口隐藏起来,这个效果好多了。最近狂迷Command-Line和一些开源简洁的小工具,用这个方法,我就可以在我的应用程序中利用一些简洁实用的小工具了 :)
using System; using System.Diagnostics; using System.IO; using System.Threading; namespace convert_flv_2_avi { class Program { static void Main(string[] args) { CheckFfmpegToolExist(Ffmpeg); MakeDestinationFolderExist(AviFolder); Console.WriteLine("Starting convert, please ensure flv files placed in folder of flv-folder\n"); ConvertFlv2Avi(FlvFolder); Console.WriteLine("\nCompleted,Press any key to exit."); Console.ReadKey(); } private static void ConvertFlv2Avi(string flvFolder) { string[] flvFiles = Directory.GetFiles(flvFolder); foreach (string flv in flvFiles) { Console.WriteLine("Converting file of {0}", flv); RunFfmpeg(flv, string.Format("{0}.avi", flv.Substring(0, flv.Length - 4))); } } private static void MakeDestinationFolderExist(string aviFolder) { if (!Directory.Exists(aviFolder)) { Directory.CreateDirectory(aviFolder); } } private static void CheckFfmpegToolExist(string Ffmpeg) { if (!File.Exists(Ffmpeg)) { Console.WriteLine("Can not find {0}", Ffmpeg); Console.ReadKey(); Environment.Exit(1); } } static void RunFfmpeg(string flvFile, string aviFile) { Process ffmpeg = new Process(); ffmpeg.StartInfo.FileName = Ffmpeg; ffmpeg.StartInfo.Arguments = string.Format(@"-i {0} -r 25 -b 750k -y {1}", flvFile, aviFile.Replace(FlvFolder, AviFolder)); ffmpeg.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; //Run ffmpeg.exe in background try { ffmpeg.Start(); } catch (Exception ex) { Console.WriteLine(ex.Message); } } private const string Ffmpeg = @"ffmpeg\ffmpeg.exe"; private const string FlvFolder = @"flv-folder"; private const string AviFolder = @"out-avi-folder"; } }