本系列文章導航
Windows下FFmpeg快速入門
ffmpeg參數解釋
mencoder和ffmpeg參數詳解(Java處理視頻)
Java 產生影片縮圖(ffmpeg)
使用ffmpeg進行視頻檔案轉換成FLV整理
java 視頻處理 mencoder
java 視頻處理 ffmped+mencoder
ffmpeg+mencoder幾乎可以完成目前基於web的播客平台任何音視頻處理的操作.如果還需要添加一些什麼的話,那麼就是視頻線上錄製功能了,這個也可以用ffmpeg+fms來完成,因此一般的類似於YouTube的一些可見功能都可以在ffmpeg+mencoder+fms來做後台實現.由於fms沒有實踐,因此這裡不描述.
本文有三部分:
1)ffmpeg+mencoder環境搭建
2)常見操作說明
3)個人的一些使用心得
1.ffmpeg+mencoder環境搭建
1)概論
音視頻界眾多的編解碼協議和各個公司定義的專用格式導致目前的視頻音頻檔案紛繁複雜,單純的ffmpeg支援的格式並不完全包括所有種類,至少 swf,rmvb(rv4)目前的版本是不支援的.同時wma9似乎可以支援了.但沒有測試.同時mencoder能支援rm,rmvb等格式,但是從視頻中擷取某幀的工作只能由ffmpeg完成.因此可以採用ffmpeg+mencoder完成目前所有流行格式的視頻壓縮轉換,設定視頻資訊,截取視頻中的圖片等功能了,同時,採用其他的一些開源工具如MediaInfo可以擷取視頻的中繼資料資訊.
2)ffmpeg篇
首先擷取軟體包:ffmpeg,lame(支援mp3),ogg vorbis,x264(h264 codec),xvid,3gp,libdts,mpeg4 aac.這些軟體包在71.21的/home/zhengyu/tools裡面都能找到.如果需要網上下載的話,可以提供.
ffmpeg官網下載:http://ffmpeg.mplayerhq.hu/ffmpeg-checkout-snapshot.tar.bz2(svn).
如果官網下載有問題的,xplore也提供了1月30的snapshot:下載ffmpeg.
lame下載:目前的版本為3.97,http://sourceforge.net/project/showfiles.php?group_id=290&package_id=309 或者到xplore下載lame.
ogg vorbis:這個一般的redhat內建,不需要下載.可以去看看/usr/lib/libvorbis.a在不在,如果不在可以yum install或apt-get install.
xvid下載:http://downloads.xvid.org/downloads/xvidcore-1.1.0.tar.gz, xplore下載xvid.
x264下載:這個可以去ftp://ftp.videolan.org/下尋找最近的snapshot下載,或者svn擷取,注意如果ffmpeg是什麼時候的,x264的snapshot也應該是什麼時候的,不然編譯的時候容易報錯.ftp://ftp.videolan.org/pub /videolan/x264/snapshots/
xplore下載x264的1月29日的snapshot.
libdts:http://download.chinaunix.net/down.php?id=11568&ResourceID=5785&site=1, xplore下載libdts:
上面的軟體包除了ffmpeg之外,在下載完成後解包,編譯的參數都是./configure --prefix=/usr --enable-shared;make;sudo make install
mpeg4 aac/aad2:http://www.audiocoding.com/modules/mydownloads/visit.php?cid=1&lid=25&PHPSESSID=8267ff75b7c18826fe75eb1c15690862,http://www.audiocoding.com/modules/mydownloads/visit.php?cid=1&lid=23&PHPSESSID=8267ff75b7c18826fe75eb1c15690862.
faac和faad2在下載解包之後需要自己automake產生編譯檔案.其中faac的1.25版本需要將內建的configure.in檔案最後的AM_OUTPUT中的幾個續行去掉,並取消分行.然後按照bootstrap裡面的操作進行,無非是aclocal -I .;autoheader;libtoolize --automake;automake -a --copy;autoconfig(或者前面的由autoreconf -vif替代);./configure --prefix=/usr --enable-shared;make;sudo make install;
faad2的2.5版本需要修改內建的configure.in檔案,不然會在沒有libbmp時編譯會通不過.找到configure.in中下面一段:
引用if test x$WITHBMP = xyes; then
AC_DEFINE([HAVE_BMP], 1, [User wants beep media player plugin built])
AM_CONDITIONAL([HAVE_XMMS], true)
AM_CONDITIONAL([HAVE_BMP], true)
fi
if test x$WITHDRM = xyes; then
改成
if test x$WITHBMP = xyes; then
AC_DEFINE([HAVE_BMP], 1, [User wants beep media player plugin built])
AM_CONDITIONAL([HAVE_XMMS], true)
AM_CONDITIONAL([HAVE_BMP], true)
else
AC_MSG_NOTICE(no bmp build configured)
AM_CONDITIONAL([HAVE_BMP], false)
fi
if test x$WITHDRM = xyes; then
然後autoreconf -vif;./configure --prefix=/usr --enable-shared;make;sudo make install;
這裡提供兩個已經修改好的.只需要make clean;make;sudo make install;的tar包.faac1.25下載,faad2.5下載.
3gp支援:在編譯ffmpeg加入--enable-amr_nb --enable-amr_wb的時候,會有提示,下載:http://www.3gpp.org/ftp/Specs/archive /26_series/26.204/26204-510.zip,解壓的原始碼檔案以後把裡面的檔案都拷貝到ffmpeg的原始碼目錄下 libavcodec/amrwb_float;然後下載:http://www.3gpp.org/ftp/Specs/archive /26_series/26.104/26104-510.zip,解壓得原始碼檔案以後把裡面的檔案都拷貝到ffmpeg解包目錄下的 libavcodec/amr_float,然後交給ffmpeg編譯去做了.
也可以在這裡下載這兩個包:amrwb_float下載,amr_float下載.
這些codec都安裝完畢之後便可以編譯ffmpeg了,編譯參數如下:
./configure --prefix=/usr/local --enable-gpl --enable-shared --enable-mp3lame --enable-amr_nb --enable-amr_wb --enable-amr_if2 --enable-libogg --enable-vorbis --enable-xvid --enable-a52 --enable-a52bin --enable-faadbin --enable-dts --enable-pp --enable-faad --enable-faac --enable-x264 --enable-pthreads --disable-ffserver --disable-ffplay
make
(sudo make install)
然後就可以嘗試用ffmpeg做視頻轉換了.
3)mencoder篇
首先擷取mplayer軟體包極其mplayer官網上內建的codecs.如果喜歡mplayer,也可以下載gui和font.關於 mplayer-1.0rc1在71.21的/home/zhengyu/tools中能找到.如果需要網上下載,可以去官網:http: //www.mplayerhq.hu/design7/dload.html.下載rc1地址如下:http://www1.mplayerhq.hu /MPlayer/releases/MPlayer-1.0rc1.tar.bz2.最新的svn版本:http: //www1.mplayerhq.hu/MPlayer/releases/mplayer-checkout-snapshot.tar.bz2.官網同時也給出了一些codec,其中就有rm格式的codec:http://www1.mplayerhq.hu/MPlayer/releases /codecs/essential-20061022.tar.bz2(x86).
xplore也提供下載,mplayer1.0rc1下載,codec下載.
下載完成之後,將tar vxjf essential-20061022.tar.bz2;sudo mkdir -p /usr/lib/codecs;sudo cp -rf essential-20061022/* /usr/lib/codecs;然後解包mplayer,按如下方式編譯:
./configure --prefix=/usr/local --enable-gui --enable-largefiles --enable-gif --enable-png --enable-jpeg --language=zh_CN --with-codecsdir=/usr/lib/codecs/
make
(sudo make install)
然後就可以使用mencoder,當然也有一個沒有gui的mplayer可以播放各種視頻了.不過我們需要的是mencoder.至此,ffmpeg+mencoder搭建完成.
2.常見操作說明
對於ffmpeg,可以將除swf,rmvb,wmav9以外的視頻/音頻格式轉換成flv/mp3,同時可以截取這些視頻檔案中的某個時間的該幀圖片.這些實際上就是一個視頻播客顯示的部分.對於mencoder,支援各種常見格式的視頻/音頻轉換成flv/mp3.或者轉換成avi.
1)ffmpeg篇:
ffmpeg的命令列參數因為太多,這裡不列出,可以用ffpmeg -h可以查看到.列出非進階參數如下:
引用Main options:
-L show license
-h show help
-version show version
-formats show available formats, codecs, protocols, ...
-f fmt force format
-i filename input file name
-y overwrite output files
-t duration set the recording time
-fs limit_size set the limit file size
-ss time_off set the start time offset
-itsoffset time_off set the input ts offset
-title string set the title
-timestamp time set the timestamp
-author string set the author
-copyright string set the copyright
-comment string set the comment
-album string set the album
-v verbose control amount of logging
-target type specify target file type ("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", ...)
-dframes number set the number of data frames to record
-scodec codec force subtitle codec ('copy' to copy stream)
-newsubtitle add a new subtitle stream to the current output stream
-slang code set the ISO 639 language code (3 letters) of the current subtitle stream
Video options:
-vframes number set the number of video frames to record
-r rate set frame rate (Hz value, fraction or abbreviation)
-s size set frame size (WxH or abbreviation)
-aspect aspect set aspect ratio (4:3, 16:9 or 1.3333, 1.7777)
-croptop size set top crop band size (in pixels)
-cropbottom size set bottom crop band size (in pixels)
-cropleft size set left crop band size (in pixels)
-cropright size set right crop band size (in pixels)
-padtop size set top pad band size (in pixels)
-padbottom size set bottom pad band size (in pixels)
-padleft size set left pad band size (in pixels)
-padright size set right pad band size (in pixels)
-padcolor color set color of pad bands (Hex 000000 thru FFFFFF)
-vn disable video
-vcodec codec force video codec ('copy' to copy stream)
-sameq use same video quality as source (implies VBR)
-pass n select the pass number (1 or 2)
-passlogfile file select two pass log file name
-newvideo add a new video stream to the current output stream
Subtitle options:
-scodec codec force subtitle codec ('copy' to copy stream)
-newsubtitle add a new subtitle stream to the current output stream
-slang code set the ISO 639 language code (3 letters) of the current subtitle stream
Audio/Video grab options:
-vd device set video grab device
-vc channel set video grab channel (DV1394 only)
-tvstd standard set television standard (NTSC, PAL (SECAM))
-ad device set audio device
-grab format request grabbing using
-gd device set grab device
Advanced options:
-map file:stream[:syncfile:syncstream] set input stream mapping
-map_meta_data outfile:infile set meta data information of outfile from infile
-benchmark add timings for benchmarking
-dump dump each input packet
-hex when dumping packets, also dump the payload
-re read input at native frame rate
-loop_input loop (current only works with images)
-loop_output number of times to loop output in formats that support looping (0 loops forever)
-threads count thread count
-vsync video sync method
-async audio sync method
-vglobal video global header storage type
-copyts copy timestamps
-shortest finish encoding within shortest input
-dts_delta_threshold timestamp discontinuity delta threshold
-ps size set packet size in bits
-muxdelay seconds set the maximum demux-decode delay
-muxpreload seconds set the initial demux-decode delay
如果這些都明白了,並且有編程基礎,你就可以去參與ffmpeg開發了.其實這些堆積起來的命令95%一般是用不上的.這裡介紹一些簡單的常見的命令:
-fromats 顯示可用的格式
-f fmt 強迫採用格式fmt
-I filename 輸入檔案
-y 覆蓋輸出檔案
-t duration 設定紀錄時間 hh:mm:ss[.xxx]格式的記錄時間也支援(需要)
-ss position 搜尋到指定的時間 [-]hh:mm:ss[.xxx]的格式也支援
-title string 設定標題
-author string 設定作者
-copyright string 設定著作權
-comment string 設定評論
-target type 設定目標檔案類型(vcd,svcd,dvd),所有的格式選項(位元速率,編解碼以及緩衝區大小)自動化佈建,只需要輸入如下的就可以了:ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 啟用高品質設定
-b bitrate 設定位元速率,預設200kb/s
-r fps 設定幀頻,預設25
-s size 設定幀大小,格式為WXH,預設160X128.下面的簡寫也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設定橫縱比 4:3 16:9 或 1.3333 1.7777
-croptop/botton/left/right size 設定頂部切除帶大小,像素單位
-padtop/botton/left/right size 設定頂部補齊的大小,像素單位
-padcolor color 設定補齊條顏色(hex,6個16進位的數,紅:綠:藍排列,比如 000000代表黑色)
-vn 不做視頻記錄
-bt tolerance 設定視頻碼率容忍度kbit/s
-maxrate bitrate設定最大視頻碼率容忍度
-minrate bitreate 設定最小視頻碼率容忍度
-bufsize size 設定碼率控制緩衝區大小
-vcodec codec 強制使用codec編解碼方式. 如果用copy表示原始編解碼資料必須被拷貝.(很重要)
-ab bitrate 設定音頻碼率
-ar freq 設定音頻採樣率
-ac channels 設定通道,預設為1
-an 不使能音頻紀錄
-acodec codec 使用codec編解碼
-vd device 設定視頻擷取裝置,比如/dev/video0
-vc channel 設定視頻捕獲通道 DV1394專用
-tvstd standard 設定電視標準 NTSC PAL(SECAM)
-dv1394 設定DV1394捕獲
-av device 設定音訊裝置 比如/dev/dsp
-map file:stream 設定輸入資料流映射
-debug 列印特定調試資訊
-benchmark 為基準測試加入時間
-hex 傾倒每一個輸入包
-bitexact 僅使用位精確演算法 用於編解碼測試
-ps size 設定包大小,以bits為單位
-re 以本地幀頻讀資料,主要用於類比擷取裝置
-loop 迴圈輸入資料流。只工作於映像流,用於ffserver測試
ffmpeg進行操作的常用方法:
1.轉換成flv檔案:ffmpeg -i infile.* -y (-ss second_offset -ar ar -ab ab -r vr -b vb -s vsize) outfile.flv
其中second_offset是從開始的多好秒鐘.可以支援**:**:**格式,至於ar,ab是音訊參數,可以指定 ar=22050,24000,44100(PAL制式),48000(NTSC制式),後兩種常見,ab=56(視音頻協議的codec而定,如果要聽高品質,則80以上).vr,vb,vsize是視頻參數,可以指定 vr=15,25(PAL),29(NTSC),vb=200,500,800,1500(視視頻協議的codec而定,可以通過查看專業的codec說明文檔擷取,如果你手頭有一份詳細的各種codec的文檔,請提供一份給我,不勝感激.)
還有一些參數-acodec ac -vcodec vc(ac指定音頻codec,ar和ab可以省去,vc指定視頻codec,vr和vb可以省去,自動採用相應的codec參數)
還有很多進階參數,如-qmin,-qcale等,請查看詳細文檔.
還有-an和-vn參數,分別從多媒體檔案中提取出純粹視頻和音頻.
另,如果你是用shell批量處理,請使用-y參數覆蓋產生flv.
2.截取圖片:ffmpeg -i infile.* -y (-ss second_offset) -t 0.001 -s msize (-f image_fmt) outfile.jpg
其中second_offset同上,msize同vsize,圖片大小.image_fmt=image2強制使用jpg,image_fmt=gif,強制使用gif格式.
還可以用-vframes fn指定截取某幀圖片,fn=1,2,3,...
2)mencoder篇:
mencoder的作用主要在視頻轉碼方面.在安裝完mplayer後,mencoder也編譯產生了.可以man mencoder擷取mencoder的說明文檔.
mencoder的參數更加複雜,不過也無非是音頻處理視頻處理兩個方面,可以參看網路例子:http://www.masoncn.com/post/144.html.這裡不作詳細的列舉了.
mencoder進行操作的常用方法: mencoder infile.* -o outfile.* [-ovc 目標視頻格式] [-oac 目標音頻格式] [-of 目標檔案格式]
1.轉換成flv檔案: mencoder infile.* -o outfile.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 infile.rmvb -o outfile.flv -vf scale=-3:150 -ofps 12 -oac mp3lame -ovc xvid -xvidencopts bitrate=112
2.轉換成avi檔案: mencoder infile.* -o outfile.avi -of avi -oac mp3lame -lameopts preset=64 -ovc xvid -xvidencopts bitrate=600
3.轉換成wmv檔案(複雜寫法,其中進階參數可以省去): mencoder infile.* -o outfile.wmv -of lavf -ofps 25 -oac mp3lame -lameopts cbr:preset=128 -ovc lavc -lavcopts vcodec=mpeg4:vbitrate=768:mbd=2:mv0:trell:v4mv:cbp:last_pred=3 -vf scale=320:240 -srate 22050 -sws 9 -subcp cp936 -subpos 0 -subalign 0 -subfont-text-scale 3 -lavfopts i_certify_that_my_video_strea
4.: mplayer infile -ss START_TIME -noframedrop -nosound -vo jpeg -frames N
其中-ovc,-oac和-of是必須的,-ovc是指定視頻codec,指定了ovc之後通常帶一個該codec的opt參數,-oac是指定音頻 codec,也會在其後帶一個codec的opt參數.可以指定細節以決定視頻音頻品質和轉換速率.具體的細節可以參看專業的技術文檔.
3.個人的一些心得
在視頻播客網站上,對於音視頻本身一般存在如下幾個問題:
1)有些格式的音視頻檔案不支援.不能做到全的問題.
2)上傳的同樣內容,但不同格式音視頻排重的問題.從儲存和應用兩個方面描述這個問題會有不同層次的解決方案.
3)對於某些格式的音視頻檔案,既有可能是純粹音訊,也可以是純粹視頻的.如rm格式.怎樣區分這種檔案以方便應用的問題.
4)音視頻檢索,視頻描述能不能做到內容方式而不是使用者定義關鍵字的方式.
5)音視頻相似性的利用和處理.
6)音視頻檔案的下載擷取.
對於第一個問題採用ffmpeg+mencoder可以擷取一個讓人可以接受的解決辦法.第三個問題可以在上傳之後安裝一個前端過濾程式,區分音頻檔案和視頻檔案,已經有相應的開源工具和代碼做這些事情.對於第二個問題,首先是統一格式,然後計算音視頻檔案的hash,在儲存部分採用分布式CAS技術儲存,應用方面構架在CAS之上.而第四個問題,第五個問題有待深入研究.第六個問題可以考慮p2p的方式,不過這個不是太重要.
對於採用shell在ffmpeg+mencoder+MediaInfo環境下處理視頻隊列和截取視頻檔案,可以參看這篇文章.
博文來源:http://huqilong.blog.51cto.com/53638/136985