ASP在線轉(zhuǎn)flv+所略圖+flash在線錄制視頻

2010-08-28 10:52:45來源:西部e網(wǎng)作者:

Mencoder簡介:

     Mencoder是Mplayer自帶的編碼工具(Mplayer是Linux下的播放器,開源,支持幾乎所有視頻格式的播放,現(xiàn)在有windows和Mac版本)。

Mplayer的獲得與配置:

     Mplayer windows版本下載列表:http://www5.mplayerhq.hu/MPlayer/releases/win32/
列表中會(huì)有版本發(fā)布日期,可以挑選最新的版本,也可以選擇old/去下載老的版本,筆者用的是6月份的版本。下載后解壓到某個(gè)文件夾中即可。

     Codecs下載列表:http://www5.mplayerhq.hu/MPlayer/releases/codecs/
選擇windows-all-********.zip(*表示年月日)下載,將zip包中的文件夾下所有文件,包括*.dll、*.acm、*.ax等等全部copy到Mplayer根目錄下的codecs文件夾中。

     此時(shí)最好把Mplayer.exe所在路徑,同時(shí)也是Mencoder.exe所在路徑添加到環(huán)境變量path中。

    現(xiàn)在可以試試用Mplayer播放視頻,比如有個(gè)視頻位于D:\music\APerfectMatch.wmv,那么可以打開一個(gè)cmd窗口,輸入mplayer “D:\music\APerfectMatch.wmv”,感受一下來自Linux的播放器吧,可以通過鍵盤來操縱。

Mencoder轉(zhuǎn)換視頻格式:

     以將各種格式轉(zhuǎn)換為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的命令行是不支持換行的),按回車運(yùn)行,一段時(shí)間之后就可以得到一個(gè).flv文件,播放一下看看品質(zhì)如何(可以直接用Mplayer播放)。

     下圖是我這邊轉(zhuǎn)換的效果對比,左邊是原視頻,右邊是轉(zhuǎn)換后的視頻:


     所有人都會(huì)覺得,轉(zhuǎn)換后品質(zhì)下降了很多,確實(shí)是這樣,同時(shí)可以發(fā)現(xiàn)轉(zhuǎn)換后的文件由原來的13M變成了1M,如果要提高品質(zhì),可以將vbitrate=500改為vbitrate=5000。

     轉(zhuǎn)換后的效果對比,左邊是原視頻,右邊是轉(zhuǎn)換后的視頻:

     品質(zhì)幾乎一樣了,但同時(shí),轉(zhuǎn)換文件變成了6M。

     關(guān)于命令中的一些參數(shù),解釋一下:

-o ””E:\output.flv””:是輸出文件路徑;

-of lavf:是輸出文件格式,這里不是flv而是lavf,是因?yàn)閒lv屬于libavformat;

-lavfopts i_certify_that_my_video_stream_does_not_use_b_frames:-lavfopts表示對lavf進(jìn)行一些設(shè)置,設(shè)置的內(nèi)容就是i_certify_that_my_video_stream_does_not_use_b_frames,翻譯成中文就是:我確定,我的視頻不用B frames,對于轉(zhuǎn)換flv格式,最好加上這個(gè)參數(shù),否則可能會(huì)報(bào)錯(cuò),如圖:

-oac mp3lame:oac=output audio codec,輸出音頻編碼器,這里用的mp3lame;

-lameopts abr:br=56:lame options,是專門針對mp3lame的參數(shù)設(shè)置,abr:br=56,是設(shè)置音頻比特率為56(比特率:每秒鐘輸出的音頻大小,單位kb/s);

-ovc lavc:ovc=output video codec,輸出視頻編碼器,lavc表示one of libavcodec’s video codec,輸出格式為libavformat之一,編碼器當(dāng)然也是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進(jìn)行一些設(shè)置,詳細(xì)介紹如下:
vcodec=flv:指定視頻編碼器為flv;
vbitrate=500:指定視頻比特率為500,這個(gè)參數(shù)很重要,vbitrate大了可以讓視頻品質(zhì)增加,但會(huì)讓文件變的很大(可以參考flash8自帶的轉(zhuǎn)換工具的參數(shù):低品質(zhì)為150kb/s,中等品質(zhì)為400kb/s,高品質(zhì)為700kb/s)。
mbd:宏模塊選擇算法,值為0~2默認(rèn)為0,值越大轉(zhuǎn)換越緩慢,但在品質(zhì)和文件大小方面有好處;
mv0:編譯每個(gè)宏模塊并選擇最好的一個(gè),當(dāng)mbd=0時(shí)無效;
v4mv:會(huì)稍微增加品質(zhì),mbd>0時(shí)效果更明顯;
trell:量子化網(wǎng)格搜索,對每8×8block找到最優(yōu)化編碼;
cbp:只能和trell一期使用,評估失真的圖像塊編碼;
last_pred=3:與上一幀相比的移動(dòng)數(shù)量預(yù)測,值為0~99,1~3比較合適,大于3時(shí)對品質(zhì)的提高已經(jīng)無關(guān)緊要,但卻會(huì)降低速度;
dia=4:移動(dòng)搜索范圍,值為-99~6,對于快速轉(zhuǎn)換,-1是個(gè)不錯(cuò)的值,如果不是很重視速度,可以考慮2~4;
cmp=6:值為1~2000,默認(rèn)為0,設(shè)置用于全象素移動(dòng)預(yù)算的比較函數(shù)
vb_strategy=1:對動(dòng)作很大的場景會(huì)有幫助,對有些視頻,設(shè)置vmax_b_frames會(huì)有損品質(zhì),加上vb_strategy=1會(huì)好點(diǎn)。

     以上是對-lavcopts的詳細(xì)解釋,接下來繼續(xù)說明mencoder的參數(shù):

-vf scale=512:-3:-vf表示視頻格式,scale是縮放,512:-3表示強(qiáng)制將寬度設(shè)置為512,高度寫為-3表示保持高寬比,也可以設(shè)置為-1或-2,具體表示什么,有興趣的可以嘗試一下。如果要強(qiáng)制轉(zhuǎn)化為統(tǒng)一大小,可以直接寫-vf scale=640:480,但筆者個(gè)人建議用-3來保持高寬比。-vf里還有expand和crop參數(shù),例如:-vf scale=512:384,expand=512:384:::1,crop=512:384:0:0,expand表示膨脹,crop表示裁剪;

-ofps 12:輸出視頻的幀頻,一般,用于flash播放的視頻幀頻高了沒有沒有意義,反而會(huì)增加視頻文件大小,但如果ofps設(shè)置的不合適,比如源視頻幀頻不是ofps的整數(shù)倍,可能會(huì)導(dǎo)致轉(zhuǎn)換后的視頻、音頻不同步,似乎可以將這一參數(shù)改為-noskip來解決這一問題;

-srate 22050:音頻采樣率一般為22050或44100。

     對于轉(zhuǎn)換flv格式,lavsopts的設(shè)置比較重要,還有很多參數(shù)本文沒有涉及到,在筆者參考的文獻(xiàn)中會(huì)有具體的說明,感興趣的可以去看一下。我對于Mencoder的認(rèn)識主要也是來源于下面2篇文章,實(shí)踐的比較少,如果有理解和翻譯的失誤,再次歡迎與我交流。


參考文獻(xiàn):

《Mplayer官方文檔,英文版》http://www.mplayerhq.hu/DOCS/HTML-single/en/MPlayer.html
《Linux Reviews》http://linuxreviews.org/man/mencoder/

關(guān)于用mencoder將各種格式轉(zhuǎn)換為flv格式,網(wǎng)絡(luò)上應(yīng)該也有一些文章,我把最近學(xué)習(xí)的心得和大家分享一下.
如果您正準(zhǔn)備開始使用mencoder,似乎也可以當(dāng)作教程來看,如果您有更好的方法或技術(shù),請不吝賜教!
mencoder,可以從其官方網(wǎng)站上獲得:
http://www.mplayerhq.hu
下載完之后,修改一下環(huán)境變量,將mencoder.exe及mplayer.exe文件所在的目錄添加到path變量里。
mencoder是在命令行中執(zhí)行的(官網(wǎng)上的文檔里的實(shí)例似乎都是linux下的)
我是計(jì)算機(jī)小白,當(dāng)然只會(huì)使用windows……
開始菜單 -> 運(yùn)行 -> cmd -> 回車,就打開了命令行窗口
這時(shí),我們可以拿一個(gè)視頻來試試看,我用的是一個(gè)mtv,wmv格式的,文件名:APerfectMatch.wmv。
在命令行中輸入:(注意,不要從網(wǎng)頁上直接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 不是內(nèi)部或外部命令,也不是可運(yùn)行的程序,或批處理文件”,那么說明環(huán)境變量沒有設(shè)置好
如果正常,會(huì)看到開始轉(zhuǎn)視頻,會(huì)看到一排一排的字往上翻,內(nèi)容大概是這樣:
Pos: 226.8s 297f (100%) 48fps Trem: 0min 5mb a-v:-0.009 [142:56]
這里邊的內(nèi)容,我最關(guān)注的是2個(gè)括號里面的,小括號里應(yīng)該是轉(zhuǎn)換的進(jìn)度,中括號里的內(nèi)容很重要,142表示視頻比特率,56表示音頻比特率(比特率這個(gè)詞不知道用的對不對......)
轉(zhuǎn)換結(jié)束,會(huì)顯示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行信息我想大家都能明白,其中我一直關(guān)注的是那個(gè)142.564kbit/s,用過flash8自帶轉(zhuǎn)換工具的應(yīng)該知道高級設(shè)置里有個(gè)選項(xiàng)是最大數(shù)據(jù)速率,當(dāng)選中中等畫質(zhì)的時(shí)候,是400kb/s,而低品質(zhì)也是150kb/s,也就是說,用那句命令轉(zhuǎn)換的視頻,其畫質(zhì)都不如品質(zhì)的,那么,品質(zhì)怎么樣呢?看一下,怎么看flv文件?別忘了我們有萬能播放器mplayer,哈哈,直接在命令行里輸入:
mplayer "d:\output.flv",看到咱們剛剛轉(zhuǎn)好的視頻,我當(dāng)時(shí)一看,畫面上馬賽克倒是沒有,全是瓷磚,我暈倒...
進(jìn)入正題了,怎么來提高畫面品質(zhì)?(暈倒,原來前面都不是正題...=_=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。
下面一個(gè)一個(gè)分析:
mencoder 說明你用的是mencoder;
"d:\.....wmv" -> 是指你的輸入視頻;
-o -> 后面指定輸出路徑;(前面有“-”的都是option(選項(xiàng)的意思))
-of -> 大概是output format的縮寫,輸出文件格式,咦!為什么不是flv,而是lavf?lavf表示你使用了libavcodec里的格式,flv正好是libavcodec里的,呵呵;
-oac -> 大概是output audio codec的縮寫,指定輸出音頻編碼,這兒選用的是mp3lame;
-lameopts -> 指定lame的options,就是設(shè)置音頻輸出的一些參數(shù)啦,我只關(guān)心視頻,跳過
-ovc -> 大概是output video codec的縮寫,制定輸出視頻編碼(我最關(guān)心的好像要上場了),選用的lavc,什么意思?說是用了libavcodec的編碼器;
-lavcopts -> 是lavc的options,要設(shè)置視頻編碼的參數(shù)了!(心跳加速,血壓升高,口中開始大量分泌唾液),看看它后面都有什么:
codec=flv 說的是用的flv編碼器,這個(gè)咱不理;
vbitrate=150 video bit rate!視頻數(shù)據(jù)速率!就是它了!原來我設(shè)的是150。
找到了,下面不看了!改成vbitrate=1000,再試試看!
結(jié)果,和前一次一模一樣......(我還改成10000的,真的,還是一樣,我當(dāng)時(shí)以為它的單位是b/s而不是kb/s)
冷靜下來,去往上看了一下官方文檔,這個(gè)參數(shù)是最大數(shù)據(jù)速率,最大嘛,你設(shè)多大都一樣啊,看來不是靠它來控制品質(zhì)。
不賣關(guān)子了,直接給出我的結(jié)論吧,設(shè)置品質(zhì)有2種途徑:
1、設(shè)置-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條
他們的含義我只是大概了解一點(diǎn)點(diǎn),畢竟不是專業(yè)搞視頻編碼的
dia越大品質(zhì)越高,如果需要快速編碼,設(shè)置為-1,設(shè)為4時(shí)已經(jīng)很有利于品質(zhì)了;
cmp越大品質(zhì)越高,默認(rèn)值0,是最快速的,一般設(shè)到3,設(shè)為6已經(jīng)只會(huì)細(xì)微提高品質(zhì)了,但速度會(huì)慢
vb_strategy,大概是1或者0,默認(rèn)值可能為0,我這里設(shè)為1,會(huì)對編碼有幫助,這個(gè)參數(shù)我自己沒有過多推敲,可能并不影響品質(zhì)......
2、加-sws選項(xiàng),看下面的命令:
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
只是加一個(gè) -sws 3進(jìn)去,轉(zhuǎn)換后的效果和前面一種方法大致相同,視頻數(shù)據(jù)速率都是422.5kb/s左右,解釋一下
-sws就是用來設(shè)置品質(zhì)的,默認(rèn)值為2,那么,為什么不用這種簡單的方式呢?我個(gè)人認(rèn)為,用前面一種方法有利于找到一個(gè)速度和品質(zhì)的平衡點(diǎn),畢竟變化的范圍比較大。
其他一些選項(xiàng),我也沒有深入研究。

需要用到的組件
ASPExec
mencoder
ffmpeg.exe

第一步驟: 在線轉(zhuǎn)換

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執(zhí)行 .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視頻整站程序制作完成, 在線錄制視頻+音頻+ 縮略圖+在線轉(zhuǎn)flv +asp + sqlserver

關(guān)鍵詞:ASP

贊助商鏈接: