C# 使用 ffmpeg 進行音訊轉碼
阿新 • • 發佈:2018-11-05
先放一下 ffmpeg
的官方文件以及下載地址:
官方文件:http://ffmpeg.org/ffmpeg.html
下載地址:http://ffmpeg.org/download.html
用 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);
}
}
}
}
執行結果:
轉碼成功:
發生錯誤: