天天看點

flv視訊轉換和flash播放的解決方案筆記

淩晨2點洗澡的時候,突然決定把flv的視訊轉換和線上播放的問題研究一下。于是在之後花了2小時進行Google,并在睡覺前初步試驗成功。今天晚上對這些資訊進行了一下整理,分享給大家。

youtube火起來以後,國内外跟進的一大把,不過技術和流程上沒有任何突破,基本上就是伺服器自動對使用者上傳的視訊進行壓縮,壓成可以用flash線上播放的flv,縮小尺寸并降低碼率。然後再用Flash制作一個播放器,可以根據參數線上播放指定的flv視訊,當然有些還會加上水印和跳自己網站等功能。

轉換工具可以選擇ffmpeg和mencoder,這2個都是gnu項目,并且可以非常完美的在linux/Mac/Win32等平台下使用。不過ffmpeg支援的視訊格式較少(不能很友善的支援rmvb,mov等,不過據說Google Video用的是這個),而mencoder則不能進行截圖,是以可以考慮2者結合使用,mencoder負責轉換,ffmpeg負責截圖。

關于下載下傳和安裝,ffmpeg煩一點,官方網站上隻提供了svn,需要自己編譯。具體可以參考 這篇文章,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研究也不深,也就不多說了,要自定義播放器界面的參考 這裡

唯一需要補充一下的是視訊的smoothing屬性,現在的線上播放器尺寸一般都回比實際壓縮後的視訊尺寸大一些,smoothing=true可以保證放大的品質(包括全屏後的),具體的文章見 這裡。

很長時間沒在技術方面做些研究了,難得在晚上可以清靜些。我所了解的内容都已列出,也不會再作進一步研究,是以其他的問題就不要問我了,Google一下會比問我更有效率。