今天接到一個視頻網站的兼職項目,本來不想做的,但是正好是老鄉,但有一時半會找不到合適的人,我就接下來了。這個一個將電視臺節目中插播的廣告提取出來并點播的網站,實際提供的就是電視節目的avi視頻文件和節目單。那這里就需要使用到現在非常流行視頻技術了,到網上搜索了一下,下面是整理的內容:
youtube火起來以后,國內外跟進的一大把,不過技術和流程上沒有任何突破,基本上就是服務器自動對用戶上傳的視頻進行壓縮,壓成可以用flash在線播放的flv,縮小尺寸并降低碼率。然后再用Flash制作一個播放器,可以根據參數在線播放指定的flv視頻,當然有些還會加上水印和跳自己網站等功能。
轉換工具可以選擇ffmpeg和mencoder,這2個都是gnu項目,并且可以非常完美的在linux/Mac/Win32等平臺下使用。不過ffmpeg支持的視頻格式較少(不能很方便的支持rmvb,mov等,不過據說Google Video用的是這個),而mencoder則不能進行截圖,所以可以考慮2者結合使用,mencoder負責轉換,ffmpeg負責截圖。
關于下載和安裝,ffmpeg煩一點,官方網站上只提供了svn,需要自己編譯。具體可以參考http://blog.5ilinux.com/archives/2006/08/ffmpeg.html,Windows還需要裝MinGW來MSYS模擬linux環境,偷懶的話可以直接找個編譯好的版本,不過功能可能會不全。
mencoder則很簡單,本來就是mplayer的一部分,會裝mplayer就成。注意把codecs都裝全了
首先通過mencoder把普通視頻轉化為flv格式,命令如下
代碼
mencoder test.avi -o test.flv -of lavf -oac mp3lame -lameopts abr:br=32:mode=3 -ovc lavc -lavcopts vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -srate 22050 -lavfopts i_certify_that_my_video_stream_does_not_use_b_frames -vf scale=350:-3 -sws 2
mencoder 的參數超級復雜,視音頻壓縮本身又是一門非常高深的學問,本人略知皮毛,下面只對自己了解的一些參數做些說明,詳細解釋請看手冊
引用
test.avi
輸入文件路徑,是Mplayer能支持的格式即可
-o test.flv
輸出路徑
-of lavf
輸出格式 lavf表示libavcodec
-oac mp3lame
輸出音頻編碼方式,lame是最好的mp3編碼器
-lameopts abr:br=32:mode=3
lame的選項
abr代表平均碼率,相對于cbr(固定碼率)和vbr(可變碼率,貌似不支持)
br就是音頻的碼率,越高音質越好
mode=3,0-3分別代表Stereo,Joint Stereo,Force ms_stereo,Mono(默認為自動,事實上1和3對文件大小的影響并不是很大)
另外可選的還有 vol(音量,取值0-10,數值越大音量越大,不建議修改)等
-srate 22050
聲音采樣頻率設置,也可以選11025,文件可以稍小一點
-ovc lavc
輸出視頻編碼 lavc就是libavcodec
-lavcopts
lavc的的選項
codec=flv flv格式壓縮
vbitrate=150 視頻碼率
其他幾個選項一概不懂,請看手冊(一般來說看了還是不懂)
-vf scale=350:-3 -sws 2
縮放視頻,指定寬度為350,高度按比例來。質量由-sws選項控制,具體看手冊
-ofps 23 設定幀數,縮小幀數對節約文件大小效果不明顯,且可能造成畫面聲音同步。建議不設置
mencoder壓縮后生成的flv缺少meta信息,會造成播放時沒有進度條等問題,需要再用flvmdi修復一下
代碼
flvmdi test.flv
生成后的flv通過MPC就可以預覽。
ffmpeg截圖
代碼
ffmpeg -i test.flv -ss 10 -vframes 1 -r 1 -ac 1 -ab 2 -s 320×240 -f image2 test.jpg
-ss 10 就是說1秒后的那一幀
然后生成flash視頻播放器的話,網上例子很多,自己對Flash研究也不深,也就不多說了,要自定義播放器界面的參考http://www.adobe.com/cn/devnet/flash/articles/custom_flvcomp_print.html
唯一需要補充一下的是視頻的smoothing屬性,現在的在線播放器尺寸一般都回比實際壓縮后的視頻尺寸大一些,smoothing=true可以保證放大的質量(包括全屏后的),具體的文章見http://www2.flash8.net/Teach/5156.htm。