ffmpeg+mencoder幾乎可以完成目前基于web的播客平臺任何音視頻處理的操作.如果還需要添加一些什么的話,那么就是視頻在線錄制功能了,這個也可以用ffmpeg+fms來完成,因此一般的類似于YouTube的一些可見功能都可以在ffmpeg+mencoder+fms來做后臺實現(xiàn).由于fms沒有實踐,因此這里不描述.
本文檔有三部分:
1)ffmpeg+mencoder環(huán)境搭建
2)常見操作說明
3)個人的一些使用心得
1.ffmpeg+mencoder環(huán)境搭建
1)概論
音視頻界眾多的編解碼協(xié)議和各個公司定義的專用格式導致目前的視頻音頻文件紛繁復雜,單純的ffmpeg支持的格式并不完全包括所有種類,至少swf,rmvb(rv4)目前的版本是不支持的.同時wma9似乎可以支持了.但沒有測試.同時mencoder能支持rm,rmvb等格式,但是從視頻中獲取某幀截圖的工作只能由ffmpeg完成.因此可以采用ffmpeg+mencoder完成目前所有流行格式的視頻壓縮轉換,設置視頻信息,截取視頻中的圖片等功能了,同時,采用其他的一些開源工具如MediaInfo可以獲取視頻的元數(shù)據(jù)信息.
2)ffmpeg篇
首先獲取軟件包:ffmpeg,lame(支持mp3),ogg vorbis,x264(h264 codec),xvid,3gp,libdts,mpeg4 aac.這些軟件包在71.21的/home/zhengyu/tools里面都能找到.如果需要網(wǎng)上下載的話,可以提供下載地址.
ffmpeg官網(wǎng)下載:http://ffmpeg.…
如果官網(wǎng)下載有問題的,xplore也提供了1月30的snapshot:下載ffmpeg.
lame下載:當前版本為3.97,http:///pro…
或者到xplore下載lame.
ogg vorbis:這個一般的redhat自帶,不需要下載.可以去看看/usr/lib/libvorbis.a在不在,如果不在可以yum install或apt-get install.
xvid下載:http://downloads./…, xplore下載xvid.
x264下載:這個可以去ftp://ftp.videolan.org/下尋找最近的snapshot下載,或者svn獲取,注意如果ffmpeg是什么時候的,x264的snapshot也應該是什么時候的,不然編譯的時候容易報錯.ftp://ftp.videolan.org/pub…
xplore下載x264的1月29日的snapshot.
libdts:http://inaunix…., xplore下載libdts:
上面的軟件包除了ffmpeg之外,在下載完成后解包,編譯的參數(shù)都是./configure –prefix=/usr –enable-shared;make;sudo make install
mpeg4 aac/aad2:http://www.…,http://www.…
faac和faad2在下載解包之后需要自己automake生成編譯文件.其中faac的1.25版本需要將內(nèi)置的configure.in文件最后的AM_OUTPUT中的幾個續(xù)行去掉,并取消分行.然后按照bootstrap里面的操作進行,無非是aclocal -I .;autoheader;libtoolize –automake;automake -a –copy;autoconfig(或者前面的由autoreconf -vif替代);./configure –prefix=/usr –enable-shared;make;sudo make install;
faad2的2.5版本需要修改內(nèi)置的configure.in文件,不然會在沒有l(wèi)ibbmp時編譯會通不過.找到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;
這里提供兩個已經(jīng)修改好的.只需要make clean;make;sudo make install;的tar包.faac1.25下載,faad2.5下載.
3gp支持:在編譯ffmpeg加入–enable-amr_nb –enable-amr_wb的時候,會有提示,下載:http://www./ftp/Sp…,解壓的源代碼文件以后把里面的文件都拷貝到ffmpeg的源代碼目錄下libavcodec/amrwb_float;然后下載:http://www./ftp/Sp…,解壓得源代碼文件以后把里面的文件都拷貝到ffmpeg解包目錄下的libavcodec/amr_float,然后交給ffmpeg編譯去做了.
也可以在這里下載這兩個包:amrwb_float下載,amr_float下載.
PS: 其實上面很多l(xiāng)ib庫可以不需要手動編譯的.在安裝開源的vlc播放器時有很多自己都可以通過yum自動安裝好.如果嫌麻煩可以先用yum安裝好vlc,例如這樣:
引用
sudo rpm -ivh
http://rpm./livna…sudo yum install vlc
/* sudo yum install python-vlc mozilla-vlc (optionnal) */
于是,便可以看到:
引用
Installing:
vlc i386 0.8.6c-4.lvn6 livna 6.5 M
Installing for dependencies:
a52dec i386 0.7.4-10.lvn6 livna 49 k
aalib i386 1.4.0-0.11.rc5.fc6 extras 74 k
dirac-libs i386 0.7.0-1.fc6 extras 386 k
faac i386 1.25-2.lvn6 livna 82 k
faad2 i386 2.0-19.20050131.lvn6 livna 209 k
ffmpeg-libs i386 0.4.9-0.37.20070503.lvn6 livna 1.6 M
freeglut i386 2.4.0-11.fc6 extras 142 k
gsm i386 1.0.12-3.fc6 extras 27 k
imlib2 i386 1.3.0-3.fc6 extras 576 k
jack-audio-connection-kit i386 0.103.0-1.fc6 extras 138 k
lame-libs i386 3.97-4.lvn6 livna 331 k
libcaca i386 0.99-0.1.beta11.fc6 extras 160 k
libcddb i386 1.3.0-1.fc6 extras 71 k
libcdio i386 0.78.2-2.fc6 extras 268 k
libdca i386 0.0.2-3.lvn6 livna 103 k
libdvbpsi i386 0.1.5-2.lvn6 livna 39 k
libdvdnav i386 0.1.10-3.20070503.lvn6 livna 123 k
libdvdread i386 0.9.7-2.fc6 extras 66 k
libebml i386 0.7.7-2.fc6 extras 72 k
libfreebob i386 1.0.0-3.fc6 extras 155 k
libid3tag i386 0.15.1b-3.fc6 extras 44 k
libmatroska i386 0.8.0-4.fc6 extras 199 k
libmodplug i386 1:0.8.4-1.fc6 extras 167 k
libmp4v2 i386 1.5.0.1-3.fc6 extras 279 k
libmpcdec i386 1.2.2-4.fc6 extras 30 k
libshout i386 2.2.2-1.fc6 extras 43 k
libsndfile i386 1.0.17-2.fc6 extras 227 k
libtar i386 1.2.11-8.fc6 extras 29 k
libupnp i386 1.6.0-1.fc6 extras 101 k
lirc i386 0.8.1-1.fc6 extras 240 k
mpeg2dec i386 0.4.1-2.lvn6 livna 101 k
svgalib i386 1.9.25-3.fc6 extras 465 k
twolame i386 0.3.10-1.lvn6 livna 79 k
vcdimager i386 0.7.23-3.lvn6 livna 657 k
x264 i386 0-0.8.20061028.lvn6 livna 241 k
xosd i386 2.2.14-9.fc6 extras 47 k
xvidcore i386 1.1.3-1.lvn6 livna 242 k
這些codec都安裝完畢之后便可以編譯ffmpeg了,編譯參數(shù)如下:
./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做視頻轉換截圖了.
當然,上面那些codec的編譯是相當乏味的.你也可以根本不理會這些.因為最新版本的ffmpeg已經(jīng)比以前支持更多的格式了.因此也可以只安裝lame,xvid,x264就可以了.下面是兩種配置下支持的格式diff -w的結果:
引用
2c2
< configuration: –prefix=/usr –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
—
> configuration: –prefix=/usr/local –enable-mp3lame
6c6
< built on Jan 30 2007 17:55:22, gcc: 4.1.1 20061011 (Red Hat 4.1.1-30)
—
> built on Jan 30 2007 17:46:19, gcc: 4.1.1 20061011 (Red Hat 4.1.1-30)
40c40
< DE gxf GXF format
—
> D gxf GXF format
72c72
< DE ogg Ogg Vorbis
—
> D ogg Ogg
111d110
< DEA aac
113c112
< DEA ac3
—
> EA ac3
132,133d130
< DEA amr_nb
< DEA amr_wb
147d143
< D A dts
164c160
< DEV DT h264
—
> D V DT h264
190d185
< D A mpeg4aac
275d269
< EV xvid
3)mencoder篇
首先獲取mplayer軟件包極其mplayer官網(wǎng)上自帶的codecs.如果喜歡mplayer,也可以下載gui和font.關于mplayer-1.0rc1在71.21的/home/zhengyu/tools中能找到.如果需要網(wǎng)上下載,可以去官網(wǎng):http://www./de…下載rc1地址如下:http://www1./M…最新的svn版本:http://www1./M…官網(wǎng)同時也給出了一些codec,其中就有rm格式的codec:http://www1./M…
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的命令行參數(shù)因為太多,這里不列出,可以用ffpmeg -h可以查看到.列出非高級參數(shù)如下:
引用
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開發(fā)了.其實這些堆積起來的命令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),所有的格式選項(比特率,編解碼以及緩沖區(qū)大小)自動設置,只需要輸入如下的就可以了:ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高質(zhì)量設置
-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進制的數(shù),紅:綠:藍排列,比如 000000代表黑色)
-vn 不做視頻記錄
-bt tolerance 設置視頻碼率容忍度kbit/s
-maxrate bitrate設置最大視頻碼率容忍度
-minrate bitreate 設置最小視頻碼率容忍度
-bufsize size 設置碼率控制緩沖區(qū)大小
-vcodec codec 強制使用codec編解碼方式. 如果用copy表示原始編解碼數(shù)據(jù)必須被拷貝.(很重要)
-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 打印特定調(diào)試信息
-benchmark 為基準測試加入時間
-hex 傾倒每一個輸入包
-bitexact 僅使用位精確算法 用于編解碼測試
-ps size 設置包大小,,以bits為單位
-re 以本地幀頻讀數(shù)據(jù),,主要用于模擬捕獲設備
-loop 循環(huán)輸入流。只工作于圖像流,,用于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是音頻的參數(shù),可以指定ar=22050,24000,44100(PAL制式),48000(NTSC制式),后兩種常見,ab=56(視音頻協(xié)議的codec而定,如果要聽高品質(zhì),則80以上).vr,vb,vsize是視頻參數(shù),可以指定vr=15,25(PAL),29(NTSC),vb=200,500,800,1500(視視頻協(xié)議的codec而定,可以通過查看專業(yè)的codec說明文檔獲取,如果你手頭有一份詳細的各種codec的文檔,請?zhí)峁┮环萁o我,不勝感激.)
還有一些參數(shù)-acodec ac -vcodec vc(ac指定音頻codec,ar和ab可以省去,vc指定視頻codec,vr和vb可以省去,自動采用相應的codec參數(shù))
還有很多高級參數(shù),如-qmin,-qcale等,請查看詳細文檔.
還有-an和-vn參數(shù),分別從多媒體文件中提取出純粹視頻和音頻.
另,如果你是用shell批量處理,請使用-y參數(shù)覆蓋生成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的參數(shù)更加復雜,不過也無非是音頻處理視頻處理兩個方面,可以參看網(wǎng)絡例子:http://www./pos…這里不作詳細的列舉了.
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文件(復雜寫法,其中高級參數(shù)可以省去): 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參數(shù),-oac是指定音頻codec,也會在其后帶一個codec的opt參數(shù).可以指定細節(jié)以決定視頻音頻質(zhì)量和轉換速率.具體的細節(jié)可以參看專業(yè)的技術文檔.
3.個人的一些心得
在視頻播客網(wǎng)站上,對于音視頻本身一般存在如下幾個問題:
1)有些格式的音視頻文件不支持.不能做到全的問題.
2)上傳的同樣內(nèi)容,但不同格式音視頻排重的問題.從存儲和應用兩個方面描述這個問題會有不同層次的解決方案.
3)對于某些格式的音視頻文件,既有可能是純粹音頻的,也可以是純粹視頻的.如rm格式.怎樣區(qū)分這種文件以方便應用的問題.
4)音視頻檢索,視頻描述能不能做到內(nèi)容方式而不是用戶定義關鍵字的方式.
5)音視頻相似度的利用和處理.
6)音視頻文件的下載獲取.
對于第一個問題采用ffmpeg+mencoder可以獲取一個讓人可以接受的解決辦法.第三個問題可以在上傳之后安裝一個前端過濾程序,區(qū)分音頻文件和視頻文件,已經(jīng)有相應的開源工具和代碼做這些事情.對于第二個問題,首先是統(tǒng)一格式,然后計算音視頻文件的hash,在存儲部分采用分布式CAS技術存儲,應用方面構架在CAS之上.而第四個問題,第五個問題有待深入研究.第六個問題可以考慮p2p的方式,不過這個不是太重要.
對于采用shell在ffmpeg+mencoder+MediaInfo環(huán)境下處理視頻隊列和截取視頻文件,可以參看這篇文章.