1. 程式人生 > 其它 >ffmpeg視訊格式轉換h264 C#呼叫exe

ffmpeg視訊格式轉換h264 C#呼叫exe

FFmpeg是一套可以用來記錄、轉換數字音訊、視訊,並能將其轉化為流的開源計算機程式。

官網:http://ffmpeg.org/

本文介紹Windows環境C# 呼叫ffmpeg.exe 來轉換視訊

public class ProcessUtil
    {
        private bool outPut;

        public string ProcessOutPut = "";

        public ProcessUtil(bool outPut = false)
        {
            this.outPut = outPut;
        }
        
private void Output(object sendProcess, DataReceivedEventArgs output) { ProcessOutPut += output.Data; Process p = sendProcess as Process; if (p.HasExited && p.ExitCode == 1) { // throw new Exception("視訊處理失敗"); } }
public bool RunExe(string exePath, string argStr) #region { //ProcessOutPut = ""; bool isok = false; Process p = new Process();//建立外部呼叫執行緒 p.StartInfo.FileName = exePath; p.StartInfo.Arguments = argStr; //引數(這裡就是FFMPEG的引數了) p.StartInfo.UseShellExecute = false
;//不使用作業系統外殼程式啟動執行緒(一定為FALSE,詳細的請看MSDN) p.StartInfo.RedirectStandardError = true;//把外部程式錯誤輸出寫到StandardError流中(這個一定要注意,FFMPEG的所有輸出資訊,都為錯誤輸出流,用StandardOutput是捕獲不到任何訊息的 p.StartInfo.CreateNoWindow = false;//不建立程序視窗 try { if (this.outPut) { p.StartInfo.StandardErrorEncoding = Encoding.UTF8; p.ErrorDataReceived += new DataReceivedEventHandler(Output);//外部程式(這裡是FFMPEG)輸出流時候產生的事件,這裡是把流的處理過程轉移到下面的方法中,詳細請查閱MSDN } p.Start();//啟動執行緒 p.BeginErrorReadLine();//開始非同步讀取 p.WaitForExit();//阻塞等待程序結束 //ProcessOutPut = this.ProcessOutPut; } catch (Exception exp) { //Console.WriteLine(exp.Message); return isok; } finally { if (p.HasExited && p.ExitCode == 1) // 發生錯誤 isok = false; else isok = true; p.Close(); p.Dispose(); } return isok; } #endregion }

呼叫程式碼:

string processPath = @"E:\ffmpeg\bin\ffmpeg.exe";
string originalVideoFile = @"E:\local\video.mp4";
string targetFile = $@"E:\local\名稱{Guid.NewGuid().ToString("N")}.mp4";

//ffmpeg -i input_file -vcodec h264 output_file  //直接轉換為h264格式

string argStr = $"-y -i {originalVideoFile} -s 720X480 -b:v 1800k -r 30 -f mp4 " + targetFile; //引數(這裡就是FFMPEG的引數了) ";

string output = "";
var p = new FFexe.ProcessUtil(true);
bool re = p.RunExe(processPath, argStr);
output = p.ProcessOutPut;