Mencoder簡介:
Mencoder是Mplayer自帶的編碼工具(Mplayer是Linux下的播放器,開源,支持幾乎所有視頻格式的播放,現在有windows和Mac版本)。
Mplayer的獲得與配置:
Mplayer windows版本下載列表:http://www5.mplayerhq.hu/MPlayer/releases/win32/
列表中會有版本發布日期,可以挑選最新的版本,也可以選擇old/去下載老的版本,筆者用的是6月份的版本。下載后解壓到某個文件夾中即可。
Codecs下載列表:http://www5.mplayerhq.hu/MPlayer/releases/codecs/
選擇windows-all-********.zip(*表示年月日)下載,將zip包中的文件夾下所有文件,包括*.dll、*.acm、*.ax等等全部copy到Mplayer根目錄下的codecs文件夾中。
此時最好把Mplayer.exe所在路徑,同時也是Mencoder.exe所在路徑添加到環境變量path中。
現在可以試試用Mplayer播放視頻,比如有個視頻位于D:\music\APerfectMatch.wmv,那么可以打開一個cmd窗口,輸入mplayer “D:\music\APerfectMatch.wmv”,感受一下來自Linux的播放器吧,可以通過鍵盤來操縱。
Mencoder轉換視頻格式:
以將各種格式轉換為flv格式為例(flv格式是flash支持的視頻格式):
mencoder ””E:\test.m2p”” -o ””E:\output.flv”” -of lavf -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=512:-3 -ofps 12 -srate 22050
在命令行中輸入這行代碼(注意:windows的命令行是不支持換行的),按回車運行,一段時間之后就可以得到一個.flv文件,播放一下看看品質如何(可以直接用Mplayer播放)。
下圖是我這邊轉換的效果對比,左邊是原視頻,右邊是轉換后的視頻:
所有人都會覺得,轉換后品質下降了很多,確實是這樣,同時可以發現轉換后的文件由原來的13M變成了1M,如果要提高品質,可以將vbitrate=500改為vbitrate=5000。
轉換后的效果對比,左邊是原視頻,右邊是轉換后的視頻:
品質幾乎一樣了,但同時,轉換文件變成了6M。
關于命令中的一些參數,解釋一下:
-o ””E:\output.flv””:是輸出文件路徑;
-of lavf:是輸出文件格式,這里不是flv而是lavf,是因為flv屬于libavformat;
-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames:-lavfopts表示對lavf進行一些設置,設置的內容就是i_certify_that_my_video_stream_does_not_use_b_frames,翻譯成中文就是:我確定,我的視頻不用B frames,對于轉換flv格式,最好加上這個參數,否則可能會報錯,如圖:
-oac mp3lame:oac=output audio codec,輸出音頻編碼器,這里用的mp3lame;
-lameopts abr:br=56:lame options,是專門針對mp3lame的參數設置,abr:br=56,是設置音頻比特率為56(比特率:每秒鐘輸出的音頻大小,單位kb/s);
-ovc lavc:ovc=output video codec,輸出視頻編碼器,lavc表示one of libavcodec’s video codec,輸出格式為libavformat之一,編碼器當然也是libavcodec之一啦,至于libavodec里都有哪些編碼器,可以查看Mplayer的官方文檔;
-lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:v4mv:trell:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1:對lavc進行一些設置,詳細介紹如下:
vcodec=flv:指定視頻編碼器為flv;
vbitrate=500:指定視頻比特率為500,這個參數很重要,vbitrate大了可以讓視頻品質增加,但會讓文件變的很大(可以參考flash8自帶的轉換工具的參數:低品質為150kb/s,中等品質為400kb/s,高品質為700kb/s)。
mbd:宏模塊選擇算法,值為0~2默認為0,值越大轉換越緩慢,但在品質和文件大小方面有好處;
mv0:編譯每個宏模塊并選擇最好的一個,當mbd=0時無效;
v4mv:會稍微增加品質,mbd>0時效果更明顯;
trell:量子化網格搜索,對每8×8block找到最優化編碼;
cbp:只能和trell一期使用,評估失真的圖像塊編碼;
last_pred=3:與上一幀相比的移動數量預測,值為0~99,1~3比較合適,大于3時對品質的提高已經無關緊要,但卻會降低速度;
dia=4:移動搜索范圍,值為-99~6,對于快速轉換,-1是個不錯的值,如果不是很重視速度,可以考慮2~4;
cmp=6:值為1~2000,默認為0,設置用于全象素移動預算的比較函數
vb_strategy=1:對動作很大的場景會有幫助,對有些視頻,設置vmax_b_frames會有損品質,加上vb_strategy=1會好點。
以上是對-lavcopts的詳細解釋,接下來繼續說明mencoder的參數:
-vf scale=512:-3:-vf表示視頻格式,scale是縮放,512:-3表示強制將寬度設置為512,高度寫為-3表示保持高寬比,也可以設置為-1或-2,具體表示什么,有興趣的可以嘗試一下。如果要強制轉化為統一大小,可以直接寫-vf scale=640:480,但筆者個人建議用-3來保持高寬比。-vf里還有expand和crop參數,例如:-vf scale=512:384,expand=512:384:::1,crop=512:384:0:0,expand表示膨脹,crop表示裁剪;
-ofps 12:輸出視頻的幀頻,一般,用于flash播放的視頻幀頻高了沒有沒有意義,反而會增加視頻文件大小,但如果ofps設置的不合適,比如源視頻幀頻不是ofps的整數倍,可能會導致轉換后的視頻、音頻不同步,似乎可以將這一參數改為-noskip來解決這一問題;
-srate 22050:音頻采樣率一般為22050或44100。
對于轉換flv格式,lavsopts的設置比較重要,還有很多參數本文沒有涉及到,在筆者參考的文獻中會有具體的說明,感興趣的可以去看一下。我對于Mencoder的認識主要也是來源于下面2篇文章,實踐的比較少,如果有理解和翻譯的失誤,再次歡迎與我交流。
參考文獻:
《Mplayer官方文檔,英文版》http://www.mplayerhq.hu/DOCS/HTML-single/en/MPlayer.html
《Linux Reviews》http://linuxreviews.org/man/mencoder/
關于用mencoder將各種格式轉換為flv格式,網絡上應該也有一些文章,我把最近學習的心得和大家分享一下.
如果您正準備開始使用mencoder,似乎也可以當作教程來看,如果您有更好的方法或技術,請不吝賜教!
mencoder,可以從其官方網站上獲得:
http://www.mplayerhq.hu
下載完之后,修改一下環境變量,將mencoder.exe及mplayer.exe文件所在的目錄添加到path變量里。
mencoder是在命令行中執行的(官網上的文檔里的實例似乎都是linux下的)
我是計算機小白,當然只會使用windows……
開始菜單 -> 運行 -> cmd -> 回車,就打開了命令行窗口
這時,我們可以拿一個視頻來試試看,我用的是一個mtv,wmv格式的,文件名:APerfectMatch.wmv。
在命令行中輸入:(注意,不要從網頁上直接copy這段命令到cmd,windows的命令行似乎是不支持換行的......)
mencoder "D:\music\sk8ter_boi_300.wmv" -o "D:\output.flv" -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050
按下回車后,如果你看到顯示:“mencoder 不是內部或外部命令,也不是可運行的程序,或批處理文件”,那么說明環境變量沒有設置好
如果正常,會看到開始轉視頻,會看到一排一排的字往上翻,內容大概是這樣:
Pos: 226.8s 297f (100%) 48fps Trem: 0min 5mb a-v:-0.009 [142:56]
這里邊的內容,我最關注的是2個括號里面的,小括號里應該是轉換的進度,中括號里的內容很重要,142表示視頻比特率,56表示音頻比特率(比特率這個詞不知道用的對不對......)
轉換結束,會顯示2行文字:
Video stream: 142.564 kbit/s (17820 B/s) size: 4046677 bytes 227.080 secs 2700 frames
Audio stream: 56.938 kbit/s (7117 B/s) size: 1616197 bytes 227.082 secs
這2行信息我想大家都能明白,其中我一直關注的是那個142.564kbit/s,用過flash8自帶轉換工具的應該知道高級設置里有個選項是最大數據速率,當選中中等畫質的時候,是400kb/s,而低品質也是150kb/s,也就是說,用那句命令轉換的視頻,其畫質都不如品質的,那么,品質怎么樣呢?看一下,怎么看flv文件?別忘了我們有萬能播放器mplayer,哈哈,直接在命令行里輸入:
mplayer "d:\output.flv",看到咱們剛剛轉好的視頻,我當時一看,畫面上馬賽克倒是沒有,全是瓷磚,我暈倒...
進入正題了,怎么來提高畫面品質?(暈倒,原來前面都不是正題...=_=o)
回頭看一下我們的命令行:
mencoder "D:\music\sk8ter_boi_300.wmv" -o "D:\output.flv" -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050。
下面一個一個分析:
mencoder 說明你用的是mencoder;
"d:\.....wmv" -> 是指你的輸入視頻;
-o -> 后面指定輸出路徑;(前面有“-”的都是option(選項的意思))
-of -> 大概是output format的縮寫,輸出文件格式,咦!為什么不是flv,而是lavf?lavf表示你使用了libavcodec里的格式,flv正好是libavcodec里的,呵呵;
-oac -> 大概是output audio codec的縮寫,指定輸出音頻編碼,這兒選用的是mp3lame;
-lameopts -> 指定lame的options,就是設置音頻輸出的一些參數啦,我只關心視頻,跳過
-ovc -> 大概是output video codec的縮寫,制定輸出視頻編碼(我最關心的好像要上場了),選用的lavc,什么意思?說是用了libavcodec的編碼器;
-lavcopts -> 是lavc的options,要設置視頻編碼的參數了。ㄐ奶铀伲獕荷,口中開始大量分泌唾液),看看它后面都有什么:
codec=flv 說的是用的flv編碼器,這個咱不理;
vbitrate=150 video bit rate!視頻數據速率!就是它了!原來我設的是150!
找到了,下面不看了!改成vbitrate=1000,再試試看!
結果,和前一次一模一樣......(我還改成10000的,真的,還是一樣,我當時以為它的單位是b/s而不是kb/s)
冷靜下來,去往上看了一下官方文檔,這個參數是最大數據速率,最大嘛,你設多大都一樣啊,看來不是靠它來控制品質。
不賣關子了,直接給出我的結論吧,設置品質有2種途徑:
1、設置-lavcopts,看這樣一句命令:
mencoder "D:\music\APerfectMatch.wmv" -o "D:\output.flv" -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3:dia=4:cmp=6:vb_strategy=1 -vf scale=320:240,expand=320:240:::1,crop=320:240:0:0 -ofps 30 -srate 22050
看看多了什么?
在-lavcopts里多了dia=4:cmp=6:vb_strategy=1這3條
他們的含義我只是大概了解一點點,畢竟不是專業搞視頻編碼的
dia越大品質越高,如果需要快速編碼,設置為-1,設為4時已經很有利于品質了;
cmp越大品質越高,默認值0,是最快速的,一般設到3,設為6已經只會細微提高品質了,但速度會慢
vb_strategy,大概是1或者0,默認值可能為0,我這里設為1,會對編碼有幫助,這個參數我自己沒有過多推敲,可能并不影響品質......
2、加-sws選項,看下面的命令:
mencoder "D:\music\APerfectMatch.wmv" -o "D:\output.flv" -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavcopts vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -sws 3 -vf scale=320:240,expand=320:240:::1,crop=320:240:0:0 -ofps 30 -srate 22050
只是加一個 -sws 3進去,轉換后的效果和前面一種方法大致相同,視頻數據速率都是422.5kb/s左右,解釋一下
-sws就是用來設置品質的,默認值為2,那么,為什么不用這種簡單的方式呢?我個人認為,用前面一種方法有利于找到一個速度和品質的平衡點,畢竟變化的范圍比較大。
其他一些選項,我也沒有深入研究。
需要用到的組件
ASPExec
mencoder
ffmpeg.exe
第一步驟: 在線轉換
Set Executor = Server.CreateObject("ASPExec.Execute")
Executor.Application = "cmd /c mencoder E:\qiancheng\upload\"&request.QueryString("keys")&" -o E:\qiancheng\shipin\record\streams\_definst_\record\"&lid&"\"&keys&".flv -of lavf -oac mp3lame -lameopts abr:br=56 -ovc lavc -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -lavcopts vcodec=flv:vbitrate=200:mbd=2:mv0:v4mv:last_pred=3:dia=3:cmp=3:vb_strategy=1 -vf scale=330:-3 -ofps 12 -srate 22050"
Executor.Parameters = ""
strResult = Executor.ExecuteDosApp
asp執行 .bat文件
第二步驟: 通過ffmpeg生成所略圖+fso 刪除源件
Server.ScriptTimeout=0
flvname=keys
streamPath="../shipin/record/streams/_definst_/record/"&lid&"/"&flvname&".flv"
imgW ="120"
imgY = "90"
imgQuality = "100"
ss="3"
newName = "../upload/"&flvname&".jpg"
str="e:\qiancheng\webadmin\ffmpeg.exe"
str=str+" -i "&server.mappath(streamPath)&" -ss 3 -vframes 1 -r 1 -ac 1 -ab 2 -s 120*90 -f image2 "&server.mappath(newName)&""
Set shellffmpeg=server.CreateObject("ffmpeg.shellffmpeg")
aa=shellffmpeg.shellffmpeg1(str)
Set shellffmpeg = Nothing
””刪除上傳的文件
tupianid="../upload/"&request.QueryString("keys")
set fso=server.CreateObject("scripting.filesystemobject")
if fso.FileExists(Server.MapPath(tupianid)) then
fso.deletefile(server.MapPath(tupianid))
end if
set fso=nothing
flash視頻整站程序制作完成, 在線錄制視頻+音頻+ 縮略圖+在線轉flv +asp + sqlserver