先放一下 ffmpeg
的官方文档以及下载地址:
用 ffmpeg
进行转码很简单,全部都用默认参数的话用下面这句就行:
ffmpeg.exe -i D:\test\1.aac -y D:\test\1.mp3 -- 1.aac是要转码的输入文件,1.mp3是输出文件,-y是覆盖输出文件的意思
当然 ffmpeg
支持很多参数,比如使用什么编码器,指定码率等等……这里就不详细说了(关键是我也不懂hhh)
了解了这个强大的工具怎么用之后,就是在 C#
里怎么用它啦~~
也很简单,用 Process
启动一个进程去调用 ffmpeg
就好了。
直接上代码,我写了一个控制台程序,接收两个参数,分别是输入文件和输出文件(都是绝对路径),然后调用 ffmpeg
进行转码,最终完成转码并输出相应操作信息。
using System;using System.Diagnostics;namespace AudioTranscoding{ class Program { static void Main(string[] args) { Process process = new Process(); try { if (args.Length != 2) { Console.WriteLine("参数不合法"); return; } string inputFile = args[0]; string outputFile = args[1]; process.StartInfo.FileName = "ffmpeg.exe"; // 这里也可以指定ffmpeg的绝对路径 process.StartInfo.Arguments = " -i " + inputFile + " -y " + outputFile; process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true; process.StartInfo.RedirectStandardOutput = true; process.StartInfo.RedirectStandardInput = true; process.StartInfo.RedirectStandardError = true; process.ErrorDataReceived += new DataReceivedEventHandler(Output); // 捕捉ffmpeg.exe的错误信息 DateTime beginTime = DateTime.Now; process.Start(); process.BeginErrorReadLine(); // 开始异步读取 Console.WriteLine("\n开始音频转码...\n"); process.WaitForExit(); // 等待转码完成 if (process.ExitCode == 0) { int exitCode = process.ExitCode; DateTime endTime = DateTime.Now; TimeSpan t = endTime - beginTime; double seconds = t.TotalSeconds; Console.WriteLine("\n转码完成!总共用时:" + seconds + "秒\n"); } // ffmpeg.exe 发生错误 else { Console.WriteLine("\nffmpeg.exe 程序发生错误,转码失败!"); } } catch (Exception ex) { Console.WriteLine("\n错误!!" + ex.ToString()); } finally { process.Close(); } } private static void Output(object sendProcess, DataReceivedEventArgs output) { Process p = sendProcess as Process; if (p.HasExited && p.ExitCode == 1) // 在ffmpeg发生错误的时候才输出信息 { Console.WriteLine(output.Data); } } }}
运行结果:
转码成功:
发生错误:
参考: