FLV視頻轉換的利器 - ffmpeg.exe和mencoder(轉)

>>>  技術話題—商業文明的嶄新時代  >>> 簡體     傳統

文章1:
大家應該都知道Youtobe、Google Video之類視頻分享網站。他們的視頻全部是使用Flash播放,而通過探索實際地址,會發現下載回來的東西都是Flash支持的FLV格式。這種格式的視頻,播放和轉換是非常麻煩的。但是,有一個源于Linux的工具軟件ffmpeg可以輕易地實現FLV向其它格式(avi(mpeg4)、asf、mpeg)的轉換或者將其它格式轉換為flv。   =OD'GuQ   
ffmpeg作為Linux下的LGPL開源程序,在Windows下編譯需要特殊的工具。我這里提供的ffmpeg.exe是2004年的舊版本,使用MinGW編譯,只有一個可執行文件,可直接運行(命令行程序)。
  b 
 
FLV向其它格式(avi(mpeg4)、asf、mpeg)轉換的簡易方法:(圓括號內必填,方括號內可選)
  khOG Kh* 
 
轉換成wmv/asf
  JZvQCf;$ 
 
ffmpeg -i (要轉換的flv文件完整路徑) -f asf -vcodec (wmv1或wmv2) [-b 視頻碼率] -acodec mp3 [-ab 音頻碼率] (輸出的asf/wmv文件完整路徑)
  !.C1}Wf 
 
轉換成mpeg1
  n Xa Os& 
 
ffmpeg -i (要轉換的flv文件完整路徑) -f mpeg -vcodec mpeg1video [-b 視頻碼率] -acodec mp2 [-ab 音頻碼率] (輸出的mpg文件完整路徑)
  =mmBjG}0{ 
 
轉換成avi(msmpeg4)
  z4%EYCZ' 
 
ffmpeg -i (要轉換的flv文件完整路徑) -f avi -vcodec (msmpeg4或msmpeg4v1或msmpeg4v2) [-b 視頻碼率] -acodec mp3 [-ab 音頻碼率] (輸出的avi文件完整路徑)
  AImbKhOK' 
 

 
 

 

 

文章2:

最近完成了這個小Demo,來分享一下!
上面給了我兩天時間,來完成這個小功能
于時我花了半天時間從網絡上到處鄱資料,又花了半天時間調試代碼,成功之后,終于有了以下一點的經驗之談:

這里講一下重要的:
1.用到兩個工具,一個是ffmpeg.exe,另一個是mencoder.exe
ffmpeg最新版本的下載地址:http://ffdshow.faireal.net/mirror/ffmpeg/
Mencoder新版本的下載地址:http://www5.mplayerhq.hu/MPlayer/releases/win32/

這里有一個重點,網上的文章都沒講到,所以造成有些人運行后沒反應,原因是上面路徑的下載,有很多版本,不同的版本可能個別參數不同,而網上的文章所用的參數都是用很早的版本寫的,所以會造成運行后因參數錯誤而沒有效果
簡單處理是:把網上參數在cmd命令行執行一下,這時命令行會報哪個參數錯誤,把它刪了即可!

2.判斷處理成功與失敗或是進度是否完成,從異步獲取的輸出信息判斷[包括獲取原視頻的寬與高]
這里重點在兩個委托事件中,詳情見以下幾行代碼

C#代碼 復制代碼 收藏代碼
  1. private  void StartProcess(string tool)   
  2. {   
  3.     StartProcess(tool, false);   
  4. }   
  5.        private  void StartProcess(string tool,bool onlyCheckInfo)   
  6.        {   
  7.            System.Diagnostics.Process p = new System.Diagnostics.Process();   
  8.            p.StartInfo.FileName = tool;   
  9.            p.StartInfo.Arguments = commandPara;   
  10.            p.StartInfo.UseShellExecute = false;   
  11.            p.StartInfo.RedirectStandardInput = true;   
  12.            p.StartInfo.RedirectStandardOutput = true;   
  13.            p.StartInfo.RedirectStandardError = true;   
  14.            p.StartInfo.CreateNoWindow = false;   
  15.            p.OutputDataReceived += new System.Diagnostics.DataReceivedEventHandler(p_OutputDataReceived);   
  16.            if (onlyCheckInfo)//只檢測文件是否可轉換與獲到內部寬與高   
  17.            {   
  18.                p.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(p_CheckInfoDataReceived);   
  19.            }   
  20.            else  
  21.            {   
  22.                p.ErrorDataReceived += new System.Diagnostics.DataReceivedEventHandler(p_ErrorDataReceived);   
  23.            }   
  24.            //開始執行    
  25.            try  
  26.            {   
  27.                p.Start();   
  28.                p.BeginOutputReadLine();   
  29.                p.BeginErrorReadLine();   
  30.                p.WaitForExit();   
  31.            }   
  32.            catch (Exception err)   
  33.            {   
  34.                Console.WriteLine(err.Message);   
  35.            }   
  36.            finally  
  37.            {   
  38.                p.Close();   
  39.            }   
  40.        }   
  41.        void p_CheckInfoDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)   
  42.        {   
  43.            if (!string.IsNullOrEmpty(e.Data))   
  44.            {   
  45.                if (e.Data.Contains("Stream") && e.Data.Contains("Video:"))//設置原視頻窗口大小作為flv視頻的寬與高   
  46.                {   
  47.                    Match match = Regex.Match(e.Data, @", (\d+)x(\d+)");   
  48.                    if (match != null)   
  49.                    {   
  50.                        videoWidth = match.Groups[1].Value;   
  51.                        videoHeight = match.Groups[2].Value;   
  52.                    }   
  53.                }   
  54.                else if (e.Data.Contains("could not find codec parameters"))//ffmpeg轉換失敗   
  55.                {   
  56.                    isCanChangeToFlv = false;   
  57.                    Program.SetDataBase(id, 1, count + 1);   
  58.                }   
  59.            }   
  60.   
  61.        }   
  62.   
  63.         void p_ErrorDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)   
  64.        {   
  65.            if (!string.IsNullOrEmpty(e.Data))   
  66.            {   
  67.                if (e.Data.Contains("video:") && e.Data.Contains("muxing overhead"))//ffmpeg轉換完成   
  68.                {   
  69.                    Program.SetDataBase(id, 2, count + 1);   
  70.                    Console.WriteLine("轉換完成");   
  71.                }   
  72.                Console.WriteLine(e.Data);   
  73.            }   
  74.               
  75.        }   
  76.   
  77.         void p_OutputDataReceived(object sender, System.Diagnostics.DataReceivedEventArgs e)   
  78.        {   
  79.            if (!string.IsNullOrEmpty(e.Data))   
  80.            {   
  81.                if (e.Data.Contains("Writing index"))//mencoder轉換完成   
  82.                {   
  83.                    Program.SetDataBase(id, 2, count + 1);   
  84.                    Console.WriteLine("轉換完成");   
  85.                }   
  86.                //else if (e.Data.Contains("Exiting"))//mencoder轉換失敗   
  87.                //{   
  88.                //    Console.WriteLine("轉換失敗");   
  89.                //}   
  90.                Console.WriteLine(e.Data);   
  91.            }   
  92.        }  
 本文只講重點,請結合網絡其它文章與本文即可!

 

文章3:

Youtube的成功,使得國內的視頻網站如雨后春筍般的冒出來,前不久朋友叫我幫他寫一個將各種視頻格式轉換成flv的程序,這里就將編寫程序遇到困難和獲得的經驗拿出來和大家分享一下。 1、使用引擎:ffmpeg + Mencoder 2、ffmpeg最新版本的下載地址:http://ffdshow.faireal.net/mirror/ffmpeg/ Mencoder新版本的下載地址:http://www5.mplayerhq.hu/MPlayer/releases/win32/ 3、轉換速度比較:總體上ffmpeg轉換的速度快于Mencoder 4、轉換格式要求:rm、rmvb、r

Youtube的成功,使得國內的視頻網站如雨后春筍般的冒出來,前不久朋友叫我幫他寫一個將各種視頻格式轉換成flv的程序,這里就將編寫程序遇到困難和獲得的經驗拿出來和大家分享一下。

1、使用引擎:ffmpeg + Mencoder
2、ffmpeg最新版本的下載地址:http://ffdshow.faireal.net/mirror/ffmpeg/
Mencoder新版本的下載地址:http://www5.mplayerhq.hu/MPlayer/releases/win32/
3、轉換速度比較:總體上ffmpeg轉換的速度快于Mencoder
4、轉換格式要求:rm、rmvb、rt格式的文件只能用Mencoder轉換,出于速度考慮我基本上都用ffmpeg轉換,所以Mencoder能轉換的格式我沒有詳細測試(哪個朋友知道,麻煩你告訴我下,我補充上去)。
5、純音頻格式只能用Mencoder進行轉換。如何判斷是否是純音頻格式可以通過使用命令 FFmpeg -i "文件的完整路徑" 獲得輸出后就可以分析出來。
6、.mov格式的用ffmpeg轉換出來的效果比較差,建議用Mencoder進行轉換,wmv8用ffmpeg經常會有花屏產生建議用Mencoder。
7、視頻按比率輸出的問題:必須先獲取源視頻文件的寬度和高度(也是通過 FFmpeg -i "文件的完整路徑" 獲得輸出后就可以分析出來)根據這個高度和寬度的比率來設定輸出文件的尺寸。
8、可能的難點:因為這ffmpeg 和 Mencoder都是命令行工具(當然你也可以下載源代碼自己修改成com之類的),在C#只能用Process調用,前面我提過要獲得輸出信息(獲取視頻相關信息、獲取當前的轉換進度、獲取什么時候完成轉換),必須設置process.StartInfo.UseShellExecute = false; process.StartInfo.CreateNoWindow = true;然后必須通過異步編程的方式獲取Process.StandardOutput和Process.StandardError的值,相關說明可以見(ms-help://MS.MSDNQTR.2003FEB.2052/cpref/html /frlrfSystemDiagnosticsProcessClassStandardOutputTopic.htm)(必須安裝了msdn的才能看)。

本文旨在幫助大家少走一些彎路,并不提供實際的解決方案及相關的源碼下載。
 

 

 


網載 2012-06-18 22:02:02

[新一篇] 手機游戲,微軟的終極街亭?

[舊一篇] C# flash想到調用函數解決辦法
回頂部
寫評論


評論集


暫無評論。

稱謂:

内容:

驗證:


返回列表