ffmpeg和mencoder做x264/h264高清編碼筆記

 本文使用的ffmpeg和mencoder分別爲ffmpeg SVN-r23004和mencoder SVN-r31144版,其他版本具體指令和操作方法可能不同。
 
    編碼後的mp4文件,可在flash中播放,且測試支持Nginx + H264 Streaming Module for Nginx (version 2)進行視頻拖動播放。
 
    使用ffmpeg進行高清編碼,使用如下命令參數:
    ffmpeg -y -i input.mp4 -acodec libfaac -ab 64k -ar 22050 -b 200k -vcodec libx264 -cqp 28 -coder 1 -refs 3 -deblockalpha 1 -deblockbeta -1 -me_method umh -subq 7 -me_range 32 -trellis 1 -chromaoffset -2 -nr 0 -bf 4 -b_strategy 1 -bframebias 0 -directpred 3 -g 250 -i_qfactor 1.3 -b_qfactor 1.4 -flags2 +bpyramid+wpred+mixed_refs+8x8dct -er 2 -threads 4 output.mp4
    其中相對重要以及對編碼速度影響較大的參數有 -refs -me_method -bf -threads 等,具體涵義可另查。
 
    使用如上ffmpeg命令編碼,出現的問題是生成的文件較大,碼率相比-b的設置偏高不少,即使加上-maxrate也控制不住,還需繼續關注如何改進。
 
    使用如下mencoder命令對視頻進行高清編碼:
    mencoder input.mp4 -of lavf -oac faac -faacopts mpeg=4:object=2:raw:br=32 -srate 22050 -ovc x264 -x264encopts global_header:cabac=1:ref=3:deblock=1:me=umh:frameref=5:mixed_refs=1:me_range=32:chroma_me=1: trellis=1:8x8dct:no-chroma-me=0:chroma_qp_offset=-2:nr=0:dct_decimate=1:bframes=4:b_pyramid=0: b_adapt=1:b_bias=0:direct=auto:keyint=250:keyint_min=25:scenecut=40:qp=18:bitrate=256:subq=7: threads=auto -lavdopts er=2 -lavfopts format=mp4 -sws 3 -vf harddup,scale=480:-3 -ofps 24 -idx -o output.mp4
    其中的重要參數與ffmpeg的類似。
 
    使用以上mencoder命令參數編碼,-of lavf 不能少,發現 -srate 既不起作用也不影響執行,global_header也必須有。以上參數爲較高質量的設置,編碼時間長,差不多需要視頻時長的2倍時間,但是相比ffmpeg碼率控制的很好,與bitrate參數設置的很接近,最終文件較小,比同等編碼的flv還小,在畫質很不錯的同時,每分鐘視頻僅有2MB多大小。
 
 
    原本計劃用ffmpeg編碼x264/AVC的同時添加透明水印,之後再用mencoder在壓小文件大小的同時進行添加字幕或合併多視頻的操作。結果每次使用mencoder想對使用上述ffmpeg編碼命令生成的mp4文件進行編碼時,總是報 dimensions not set 錯誤,編碼失敗,多處查詢解決辦法未果,看來要麼ffmpeg生成的x264視頻文件有問題,要麼mencoder不認ffmpeg生成的視頻。
 
    後採取折中的辦法,想先用ffmpeg生成xvid編碼的文件,再用mencoder壓制x264/AVC,結果應該是又碰上了ffmpeg進行libxvid編碼時的另一個bug,對有的視頻文件報 Invalid pixel aspect ratio 錯誤。
 
    最終選擇先用ffmpeg進行mpeg4編碼,再用mencoder壓制的步驟,這樣,整個處理過程基本順利,沒有出現什麼大問題了。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章