x264 代码重点详解 详细分析
eg mplayer x264 代碼重點(diǎn)詳解 詳細(xì)分析
分類: ffmpeg 2012-02-06 09:19 4229人閱讀 評(píng)論(1) 收藏 舉報(bào) h.264codecflv優(yōu)化initializationinteger目錄(?)[+]
ffmpeg和mplayer中求平均值得方法
1 ordinary c language level
#define avg2(a,b) ((a+b+1)>>1)
#define avg4(a,b,c,d) ((a+b+c+d+2)>>2)
顯而易見(jiàn)...,注意a,b宏表達(dá)式可能引出的副作用
2 SIMD by software
實(shí)現(xiàn)方法1:
inline static uint64_t BYTE_VEC(uint64_t x)
{
??? x |= x <<? 8;
??? x |= x << 16;
??? x |= x << 32;
??? return x;
}
static inline uint64_t avg2_no_rnd(uint64_t a, uint64_t b)
{
??? return (a & b) + (((a ^ b) & BYTE_VEC(0xfe))>> 1);
}
static inline uint64_t avg2(uint64_t a, uint64_t b)
{
??? return (a | b) - (((a ^ b) & BYTE_VEC(0xfe)) >>1);
}
實(shí)現(xiàn)方法2:
#define op_avg_round(a,b)? a = ( ((a)|(b)) -((((a)^(b))&0xFEFEFEFEUL)>>1) )
#define op_avg_noround(a,b)? a = ( ((a)&(b)) + ((((a)^(b))&0xFEFEFEFEUL)>>1))
通 過(guò)軟件實(shí)現(xiàn) singl instruction multi data,單指令多數(shù)據(jù)流,上述實(shí)現(xiàn)方法一樣方法1實(shí)現(xiàn)8個(gè)8bits寬度數(shù)據(jù)的同時(shí)平均,在64位cpu上使用方法2實(shí)現(xiàn)4個(gè)8bits寬度數(shù)據(jù)的同時(shí) 平均,在32位cpu上使用,簡(jiǎn)單對(duì)此加以分析加法結(jié)果有2個(gè)成分,1個(gè)是進(jìn)位,1個(gè)是邏輯和((a)&(b))<<1是進(jìn)位 (((a)^(b))是邏輯和((a)&(b))<<1 +(((a)^(b))&0xFEFEFEFEUL) 為和,各自右移一位得到平均值,之所以是0xFE..,因?yàn)榘衙總€(gè)字節(jié)的最后一個(gè)bit置零以免移位時(shí)進(jìn)入下一個(gè)字節(jié)影響下一個(gè)字節(jié)的值((a)| (b)) 對(duì)應(yīng)位在 0 1, 1 0, 1 1的3種情況下都得到1,所以((a)|(b))<<1表示進(jìn)位+非滿進(jìn)位,因?yàn)樵? 1, 1 0這種情況下也產(chǎn)生了進(jìn)位,剛好是它的邏輯和,其他分析同上
3 machine instruction levelAMD
3DNOW 指令:
#define AVG_3DNOW_OP(a,b,temp, size) /
"mov" #size " " #b ", " #temp "??/n/t"/
"pavgusb " #temp ", " #a"??????? /n/t"/
"mov" #size " " #a ", " #b"????? /n/t"
intel MMX指令:
#define AVG_MMX2_OP(a,b,temp, size) /
"mov" #size " " #b ", " #temp "??/n/t"/
"pavgb " #temp ", " #a"????????? /n/t"/
"mov" #size " " #a ", " #b "?????/n/t"
?
mplayer和ffmpeg的編譯大全
MPlayer下載
http://www.mplayerhq.hu/design7/dload.html
目前版本MPlayer v1.0rc2
MPlayer編譯
tar -xjvf MPlayer-1.0rc2.tar.bz2
cd MPlayer-1.0rc2
./configure
make
make install
如果出現(xiàn)以下錯(cuò)誤
cabac.h: In function `get_cabac_noinline':
cabac.h:525: error: can't find a register in class `GENERAL_REGS' whilereloading `asm'
make[1]: *** [h264.o] 錯(cuò)誤 1
在make前加入
export CFLAGS=-fomit-frame-pointer
make clean
?
ffmpeg的編譯大全
1. 首先獲取ffmpeg
很多人找不到怎么下載,其實(shí)之前ffmpeg可以通過(guò)cvs下載,不過(guò)最近他已經(jīng)換成了更加強(qiáng)大的svn
如何使用SVN我這里不再介紹,網(wǎng)上還有大量的安裝和使用的文章可以借鑒,這里簡(jiǎn)單羅列幾個(gè)SVN輔助的軟件:
SubVersion,從 http://subversion.tigris.org/ 下載,支持linux,我們這里就裝這個(gè)
TortoiseSVN,從 http://tortoisesvn.tigris.org/ 下載,是很不錯(cuò)的SVN客戶端程序,為windows外殼程序集成到windows資源管理器和文件管理系統(tǒng)的Subversion客戶端,用起來(lái)很方便,commit動(dòng)作變得就像Winrar右鍵壓縮一樣方便。
ok,那我們先裝subversion,記住最好之前裝過(guò)apr和apr-util,在apache.org網(wǎng)站能下到
wget http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz
tar zvxf subversion-1.3.2.tar.gz
cd subversion-1.3.2
./configure --with-apr=/usr/local/apr-httpd --with-apr-util=/usr/local/apr-util-httpd/
make
make install
到此,我們就可以通過(guò)svn命令獲取最新的ffmpeg了
svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
你會(huì)發(fā)現(xiàn)在你所在的目錄,自動(dòng)出現(xiàn)一個(gè)ffmpeg的目錄,就是你下載的源代碼。
官網(wǎng):http://ffmpeg.mplayerhq.hu/download.html
我們還不能這么快編譯ffmpeg,應(yīng)該如果要讓ffmpeg支持更多格式的轉(zhuǎn)換,還需做一些前期工作
2. 支持mp3,linux當(dāng)然是lame,下載解壓
http://sourceforge.net/projects/lame
?
| ? | lame-3.97.tar.gzMirror |
cd lame-3.97
./configure --enable-shared --prefix=/usr
./make
./make install
這里推薦盡量裝在/usr下,默認(rèn)是裝在/usr/local下。這樣ffmpeg編譯都能順利的找到庫(kù)文件
3.支持Ogg Vorbis:
as4自帶相應(yīng)的rpm包,你可以安裝一下如下rpm包
libvorbis, libvorbis-devel,libogg, libogg-devel
FC3和FC4應(yīng)該是預(yù)設(shè)安裝了有關(guān)的library的,實(shí)際上要安裝的套件有4個(gè):libvorbis、libvorbis-devel、libogg 和libogg-devel。您可以用以下指令檢查一下有沒(méi)有。
#rpm -qa | grep libogg
#rpm -qa | grep libvorbis
如果沒(méi)有的話,用yum安裝就可以了。
4.支持xvid x264,現(xiàn)在最流行的兩種高質(zhì)量的壓縮格式
xvid的編譯安裝
Get the latest version on http://www.xvid.org/,and uncompress it on
your disk. Let's name the resulting source directory ${xvidcore}.
wget http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz
The next step allows you to configure the xvid sources.
# cd ${xvidcore}/build/generic
# ./configure
Some building options can be tuned thanks to the ./configure tool. You
can use your own CC and CFLAGS variables in order to override xvid's
default ones. To have a list of known options:
# ./configure --help
Now xvidcore is configured according to your specific platform. You
can still handwrite the platform.inc file in order to add/remove
specific flags that ./configure may have set them wrong.
It is time to build xvidcore:
# make
That creates a =build directory where all object files go, and where
the build targets are linked. If no error was reported by the build
process, then you can install it on your system:
# make install
This copies the shared and static libraries to the prefix location
passed to the ./configure tool (/usr/local by default). The xvid.h
include file is also copied during the "make install" run.
Voila, xvidcore is installed on your system, make sure your runtime
linker knows about the xvidcore prefix lib dir where it is
installed. And make also sure that it generates a symlink to its
SONAME. In case it would do not take care of the symlink itself:
# cd ${prefix}/lib
# ls libxvidcore.so.*
??? ls should list at least one libxvidcore.so.MAJOR.MINOR file
# ln -s libxvidcore.so.MAJOR.MINOR libxvidcore.so.MAJOR
You may also add a .so link to .so.MAJOR, so that applications linked
against .so are in fact linked to .so.MAJOR and thus ensures better
binary compatibility as we take care not changing the MAJOR number
until there is an incompatible ABI change.
# ln -s libxvidcore.so.MAJOR libxvidcore.so
#tar zvxf xvidcore-1.1.2.tar.gz
#cd xvidcore-1.1.2/build/generic/
#./configure --prefix=/usr
#make
#make install
H264/AVC 支援:x264
要壓HQ1080、iPod和PSP的影片,x264是少不了的。不過(guò)要安裝x264,就需要用yasm來(lái)編譯。那就先裝個(gè)yasm吧。
yasm下載網(wǎng)址:http://www.tortall.net/projects/yasm/releases/yasm-0.6.0.tar.gz
最新的 下載:???? Source.tar.gz 0.6.2
#tar xzvf yasm-0.6.0.tar.gz
#cd yasm-0.6.0
#./configure --prefix=/usr/local/yasm
#make
#make install
#export PATH="$PATH:/usr/local/yasm/bin"
#vi /etc/profile
--[在最後,插入]--
export PATH="$PATH:/usr/local/yasm/bin"
--[存檔並關(guān)閉]--
跟ffmpeg一樣,x264的官網(wǎng)也是鼓勵(lì)大家 checkout SVN來(lái)取得最新版本。但據(jù)SupeSite在2007年5月16日的說(shuō)明指出官網(wǎng)的x264最新版有Bug,無(wú)法正常在一些Intel的CPU上編譯安 裝(甚麼雙至強(qiáng)、四至強(qiáng)CPU嘛,是指雙核和四核嗎?)。不過(guò)起碼米奇在公司的P4 2.8GHz CPU安裝沒(méi)有問(wèn)題啦,所以...管它。如果您遇上問(wèn)題的話,就去下載SupeSite的開(kāi)發(fā)公司Comsenz的版本吧,不過(guò)先旨聲明,那個(gè)改版的授權(quán) 還是不是原來(lái)的GPL就不知道了。如果您在意於授權(quán)的話,那就用SVN checkout吧,我想那問(wèn)題可能在您安裝時(shí)已經(jīng)修正好了。
x264的獲取同樣是采用svn方式,看來(lái)svn取代cvs不遠(yuǎn)了
svn co svn://svn.videolan.org/x264/trunk x264
cd x264
./configure --prefix=/usr --enable-shared
make
make install
5.AC3和dts編碼的支持
as4系統(tǒng)似乎已經(jīng)支持ac3編碼,編譯的時(shí)候只要加--enable-a52--enable-gpl參數(shù)就行
現(xiàn)在的ffmpeg又沒(méi)附有l(wèi)iba52了,所以,還是自己動(dòng)手裝吧...
下載網(wǎng)站:http://liba52.sourceforge.net/
# tar zxvf a52dec-0.7.4.tar.gz
# cd a52dec-0.7.4
# ./configure --enable-shared --prefix=/usr
# make
# make install
6.mpg4 aac格式支持,由于服務(wù)器還針對(duì)手機(jī)用戶服務(wù),所以,類似aac,mpg4鈴聲格式的支持,我們也得做。這里我們安裝faad2和faac就行
faac是用來(lái)壓製AAC音軌的,而faad2就是AAC音軌的解碼器。手機(jī)鈴聲和MP4影片都是使用AAC作聲音編碼的,所以要裝這個(gè)。
另外,faac和faad2都可以配合libmp4v2來(lái)安裝,有些網(wǎng)站說(shuō)需要先安 裝libmp4v2,(http://mpeg4ip.net/) 不過(guò)米奇就發(fā)覺(jué)只要編譯faac和faad2時(shí)加入適當(dāng)參數(shù),就可以連同libmp4v2一同安裝了。
下載請(qǐng)到http://www.audiocoding.com/downloads.html
FAAD2的編譯
cd faad2
autoreconf -vif
./configure --prefix=/usr --with-mp4v2 --enable-shared
make
make install
faac的編譯
cd faac
chmod +x bootstrap
./bootstrap
./configure --prefix=/usr --with-mp4v2 --enable-shared
make
make install
Comsenz版下載網(wǎng)址:http://download.discuz.net/env/video/faac-1.25-Comsenz.tar.bz2
#tar xjvf faac-1.25-Comsenz.tar.bz2
#cd faac-Comsenz
#autoreconf -vif
#./configure --prefix=/usr --with-mp4v2 --enable-shared
#make
#make install
要知道安裝了faac和faad2之後有沒(méi)有安裝好libmp4v的話,只要找一找/usr/lib目錄裡有沒(méi)有 libmp4v2.so等一系列檔案就可以了。找不到的話,就到這裡去下載,安裝好之後再重頭安裝faac和 faad2了。
7.支持3gp格式,這也是現(xiàn)在好多手機(jī)支持的格式,因?yàn)槭謾C(jī)用戶是我們的主要用戶,所以也得支持編譯
編譯的時(shí)候加上--enable-amr_nb --enable-amr_wb參數(shù)就行,根據(jù)編譯系統(tǒng)的提示,所以我們得下載一
些編譯3gp所需得文件。
wget http://www.3gpp.org/ftp/Specs/ar ... 6.204/26204-510.zip
解壓以后把里面的文件都拷貝到libavcodec/amrwb_float
wget http://www.3gpp.org/ftp/Specs/ar ... 6.104/26104-510.zip
解壓以后把里面的文件都拷貝到libavcodec/amr_float
3GPP AMR Floating point 和AMR-Wideband支援:libamrnb、libamrwb
3GP 影片的影像是h263編碼,而聲音就用AMR-NB或AMR-WB編碼,所以要轉(zhuǎn)換手機(jī)影片,就要安裝AMR程式庫(kù)。最初坊間的安裝方式都是到3GPP官 網(wǎng)去下載那些連名字也搞不懂的檔案來(lái),放在ffmpeg裡的指定目錄去跟ffmpeg一同編譯的,但現(xiàn)在已經(jīng)有人抽取了出來(lái)而成為獨(dú)立的程式庫(kù),安裝起來(lái) 就簡(jiǎn)單得多了。
下載網(wǎng)址:http://www.penguin.cz/~utx/amr
libamrnb
#tar xjvf amrnb-7.0.0.0.tar.tar
#cd amrnb-7.0.0.0
#./configure --prefix=/usr --enable-shared
#make
#make install
libamrwb
#tar xjvf amrwb-7.0.0.2.tar.tar
#cd amrwb-7.0.0.2
#./configure --prefix=/usr --enable-shared
#make
#make install
8. DTS 支援:libdca
ffmpeg已經(jīng)內(nèi)含了用來(lái)解碼DTS的libdca,所以不用安裝,也沒(méi)有要入加的參數(shù)。
9. 安裝ffmpeg
安裝完成必要的程式庫(kù)之後,終於可以動(dòng)手安裝ffmpeg本體了。如果您先前曾經(jīng)安裝過(guò)ffmpeg的話,就先把ffmpeg的源碼目錄刪掉,再次 checkout個(gè)新版本回來(lái)安裝吧。
#svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk/usr/local/src/ffmpeg
#cd /usr/local/src/ffmpeg
#./configure --prefix=/usr --enable-gpl --enable-shared --enable-libmp3lame--enable-libvorbis --enable-libamr-nb --enable-libamr-wb --enable-libxvid --enable-libx264 --enable-liba52--enable-liba52bin --enable-libfaac --enable-libfaad --enable-libfaadbin--enable-pp --enable-pthreads --disable-ffserver --disable-ffplay
#make clean && make
#make install
經(jīng)過(guò)可以去看一節(jié)動(dòng)畫(huà)的時(shí)間編譯之後,你應(yīng)該可以在/usr/bin目錄裡找到ffmpeg程式。輸入ffmpeg便會(huì)列出用了甚麼參數(shù)來(lái)編譯這個(gè) ffmpeg和它的版本。米奇試過(guò)用以這程序來(lái)安裝的ffmpeg來(lái)編製和解壓3GP、Xvid、mov、wmv9、msmpeg4、MPEG2+AC3 音源、h264+aac音源的mkv、PSP用的MP4和FLV影片,都沒(méi)有問(wèn)題,只有wmv7的影片無(wú)法解碼,相信已經(jīng)對(duì)應(yīng)得到大部份現(xiàn)時(shí)流行的影音格式了。
可以用 ffmpeg -threads [thread_count] -deinterlace -i [input_file] -ac 2-ab [audio_bitrate] -acodec libfaac -vcodec libx264 -b [video_bitrate][output_file] 來(lái)產(chǎn)生 H.264+AAC 的mp4 檔案了。
ffmpeg編譯及使用
ffmpeg編譯及使用
1 ffmpeg介紹
ffmpeg是音視頻的分離,轉(zhuǎn)換,編碼解碼及流媒體的完全解決方案,其中最重要的就是libavcodec庫(kù)。它被mplayer或者xine使用作為解碼器。還有,國(guó)內(nèi)比較流行的播放器影音風(fēng)暴或MyMPC的后端ffdshow也是使用ffmpeg的解碼庫(kù)的。
ffmpeg軟件包經(jīng)編譯過(guò)后將生成三個(gè)可執(zhí)行文件,ffmpeg,ffserver,ffplay。其中ffmpeg用于對(duì)媒體文件進(jìn)行處理,ffserver是一個(gè)http的流媒體服務(wù)器,ffplay是一個(gè)基于SDL的簡(jiǎn)單播放器。
ffmpeg 中有五個(gè)庫(kù)文件,libavcodec,libavformat,libavutil,libswscale,libpostproc,其中庫(kù) libavcodec,libavformat用于對(duì)媒體文件進(jìn)行處理,如格式的轉(zhuǎn)換;libavutil是一個(gè)通用的小型函數(shù)庫(kù),該庫(kù)中實(shí)現(xiàn)了CRC校 驗(yàn)碼的產(chǎn)生,128位整數(shù)數(shù)學(xué),最大公約數(shù),整數(shù)開(kāi)方,整數(shù)取對(duì)數(shù),內(nèi)存分配,大端小端格式的轉(zhuǎn)換等功能;libswscale,libpostproc 暫時(shí)不知道何用。
2 ffmpeg下載
最新的ffmpeg可以通過(guò)svn下載,SVN輔助的軟件有:
SubVersion,從 http://subversion.tigris.org/下載,支持linux。
TortoiseSVN,從 http://tortoisesvn.tigris.org/下載,是很不錯(cuò)的SVN客戶端程序,為windows外殼程序集成到windows資源管理器和文件管理系統(tǒng)的Subversion客戶端,用起來(lái)很方便。
subversion安裝,記住最好之前裝過(guò)apr和apr-util,在apache.org網(wǎng)站能下到
wget http://subversion.tigris.org/downloads/subversion-1.3.2.tar.gz
tar zvxf subversion-1.3.2.tar.gz
cd subversion-1.3.2
./configure --with-apr=/usr/local/apr-httpd--with-apr-util=/usr/local/apr-util-httpd/
make
make install
如果安裝了FC6,它已經(jīng)帶了svn,不用裝了。
ffmpeg的下載:我們就可以通過(guò)svn命令獲取最新的ffmpeg,命令如下:
svn checkout svn://svn.mplayerhq.hu/ffmpeg/trunk ffmpeg
3 ffmpeg支持庫(kù)的安裝
* xvid
xvid的獲取地址如下:
http://www.xvid.org/
wget http://downloads.xvid.org/downloads/xvidcore-1.1.3.tar.gz
配置編譯
? ?for x86
#./configure --prefix=/usr/local
#make
#make install
? ?for arm
#CC=arm-linux-gcc ./configure--prefix=/usr/local/arm/arm-linux --build=i686-pc-linux --host=arm-linux--target=arm-linux
#make
#make install
* x264
x264的獲取地址如下:
svn co svn://svn.videolan.org/x264/trunk x264
配置編譯
? ?for x86
#./configure --enable-shared --prefix=/usr/local
#make
#make install
? ?for arm
#CC=arm-linux-gcc ./configure --enable-pthread--enable-shared --host=arm-linux
--prefix=/usr/local/arm/arm-linux
#make
#make install
* 支持mp3
lame的獲取地址如下: http://lame.sourceforge.net/index.php
配置編譯
? ?for x86
./configure --enable-shared --prefix=/usr/local
* 支持Ogg Vorbis:
* AC3和dts編碼的支持
libdts編譯參數(shù)
./configure --prefix=/usr
make
make install
* mpg4 aac格式支持,如果ffserver服務(wù)器還針對(duì)手機(jī)用戶服務(wù),所以,類似aac,mpg4鈴聲格式的支持,我們也得做。這里我們安裝faad2和faac就行,下載請(qǐng)到http://www.audiocoding.com/modules/mydownloads/,http://prdownloads.sourceforge.net/faac
? ?FAAD2的編譯
cd faad2
autoreconf -vif
./configure --prefix=/usr --with-mp4v2 --enable-shared
make
make install
? ?faac的編譯
cd faac
chmod +x bootstrap
./bootstrap
./configure --prefix=/usr --with-mp4v2 --enable-shared
make
make install
在編譯ffmpeg,在configure時(shí)加上--enable-amr_nb --enable-faad --enable-faac參數(shù)。
* 支持3gp格式,這也是現(xiàn)在好多手機(jī)支持的格式,所以也得支持編譯
編譯的時(shí)候加上--enable-amr_nb --enable-amr_wb參數(shù)就行,根據(jù)編譯系統(tǒng)的提示,所以我們得下載一些編譯3gp所需得文件。
源碼網(wǎng)址:http://www.3gpp.org/ftp/Specs
wget http://www.3gpp.org/ftp/Specs/ar ... 6.204/26204-510.zip
解壓以后把里面的文件都拷貝到libavcodec/amrwb_float
wget http://www.3gpp.org/ftp/Specs/ar ... 6.104/26104-510.zip
解壓以后把里面的文件都拷貝到libavcodec/amr_float
* ffmpeg支持VC1格式
? ? 微軟ASF格式的三個(gè)版本,WMV1,WMV2,WMV3分別對(duì)應(yīng)MediaPlayer的版本7,8和9,所以很多時(shí)候會(huì)稱VC1為WMV3或 WMV9,都是它了,有時(shí)候在代碼里,也能看到稱呼它為VC9的。因?yàn)槲④涍€沒(méi)有正式公開(kāi)這種格式,所以當(dāng)前對(duì)VC1的支持還很不完善。本文基本是根據(jù)Multimedia Mike的一篇博客翻譯和完善而來(lái)。
? ? (1) 首先要下載 SMPTE VC-1 reference decoder,這個(gè)組織是要收費(fèi)的,可以從這里下載免費(fèi)的。
? ? (2) 在ffmpeg目錄下的libavcodec目錄下面,建立目錄libvc1。
? ? (3) 將VC1_reference_decoder_release6/decoder/目錄中的*.c和*.h文件全部copy到libvc1目錄下。
? ? (4) 將VC1_reference_decoder_release6/shared/目錄中的*.c和*.h文件全部copy到libvc1目錄下。
? ? (5) 將 libvc1-makefile.txt放到libvc1下的Makefile文件。
? ? (6) 將smpte-vc1.c文件放到libavcodec目錄下。
? ? (7) 修改libavcodec目錄下的vc9.c,將文件最后的wmv3_decoder這個(gè)AVCodec的structure,用#if 0和#endif包含起來(lái),也就是使它失效了。
? ? (8) 修改libavcodec目錄下的allcodecs.c,將register_avcodec(&wmv3_decoder)上下的注釋去掉,使它發(fā)揮作用。
? ? (9) 修改libavcodec目錄下的Makefile,把OBJS的列表中加入smpte-vc1.o。
? ? (10)修改ffmpeg主目錄下的Makefile文件,把-L./libavcodec/libvc1 -lvc1$(BUILDSUF)加入到FFLIBS后面。
? ? (11) 進(jìn)入ffmpeg/libavcodec/libav1,執(zhí)行make
? ? (12) 到ffmpeg主目錄下,執(zhí)行config;make;make install。config時(shí)根據(jù)實(shí)際情況帶參數(shù)。
* 采用ffmpeg轉(zhuǎn)碼制作FLV文件的方法
? ? 采用ffmpeg轉(zhuǎn)碼制作FLV文件,和轉(zhuǎn)碼成其它媒體類型的重要差別是一定要有l(wèi)ame庫(kù)支持,因?yàn)镕LV的聲音編碼采用mp3格式,非lame這個(gè)東東不行。編譯ffmpeg中加入lame庫(kù)真是一場(chǎng)災(zāi)難,特別在windows下,很多參數(shù)都不能發(fā)揮作用,最后直接手工copy和改一些文件,記錄如下:
? ? (1) 如果在Windows下編譯,第一步當(dāng)然是下載MinGW和MSYS來(lái)裝上了。到http://mingw.sourceforge.net/去下載最新版的MinGW-5.0.2.exe和MSYS-1.0.11-2004.04.30-1.exe。
? ? (2) 先安裝MinGW,直接運(yùn)行MinGW-5.0.2.exe安裝,選擇目錄,譬如選擇D:\MinGW為安裝目錄。安裝時(shí)需要選擇gcc和make模塊,安裝文件本身很小,會(huì)從網(wǎng)上下載模塊來(lái)安裝。
? ? (3) 然后安裝MSYS,也是直接運(yùn)行MSYS-1.0.11-2004.04.30-1.exe安裝。安裝目錄一般選擇D:\MinGW\bin \1.0。,安裝過(guò)程會(huì)詢問(wèn)剛才安裝MinGW的目錄,輸入D:\MinGW,其它都回答'Y'就搞定了。如果不清楚,可以看這個(gè)圖片效果。
? ? (4) 運(yùn)行MSYS,桌面上有個(gè)圖標(biāo),雙擊就運(yùn)行了,運(yùn)行結(jié)果是一個(gè)模擬unix的命令窗口,后面的編譯都在這種狀態(tài)下進(jìn)行。前面4步在linux不需要。
? ? (5) 到http://lame.sourceforge.net/去下載最新版的lame-3.97b2.tar.gz,copy到你認(rèn)為合適的地方,解壓后進(jìn)入lame解壓出來(lái)的目錄中。執(zhí)行
? ?? ???./configure--prefix=PREFIX
? ?? ???make
? ?? ???make install
? ? (6) 就把編譯出來(lái)的include下的lame目錄copy到/usr/include目錄下,把lib下的幾個(gè)庫(kù)文件都copy到/usr/lib目錄 下。這里注意有個(gè)變化,如果只copy lib目錄下的靜態(tài)庫(kù)到/usr/lib下,就是只copy libmp3lame.a文件,編譯出來(lái)的ffmpeg最終就不會(huì)對(duì)libmp3lame的動(dòng)態(tài)庫(kù)有依賴關(guān)系,這是因?yàn)榫幾g首先找動(dòng)態(tài)庫(kù),動(dòng)態(tài)庫(kù)沒(méi)有才找靜態(tài)庫(kù)。如果不做這個(gè)copy,后面編譯ffmpeg時(shí)無(wú)論如何指定參數(shù),都會(huì)報(bào)錯(cuò)LAME not found,不知道是哪里的bug。
? ? (7) 從http://ffmpeg.mplayerhq.hu/取得最新的ffmpeg,現(xiàn)在自由軟件都大量采用SVN了,要先裝一個(gè)SVN,可以去http://tortoisesvn.tigris.org/下載windows版的SVN,去http://subversion.tigris.org/下載linux版的SVN。SVN如何編譯安裝這里就省略了。
? ? (8) 如果在windows下,打開(kāi)解壓后的ffmpeg目錄下的Makefile文件,在FFLIBS的那一行后面加上-lmp3lame$(BUILDSUF)。這個(gè)也不知道是哪個(gè)bug引起的,搞了好長(zhǎng)時(shí)間才搞出來(lái),郁悶。Linux下不用這樣。
4 ffmpeg的編譯
配置編譯
for x86
#./configure --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
make
make install
補(bǔ)充1:
關(guān)于3gp的編譯,如果大家要編譯--enable-amr_nb-fixed,那就不能跟--enable-amr_nb同時(shí)編譯,我不大清楚這兩者到底有什么區(qū)別,似乎
fixed是修正版,管他呢,編譯的方法:
wget http://www.3gpp.org/ftp/Specs/ar ... 6.073/26073-510.zip
解壓以后把里面的文件都拷貝到libavcodec/amr目錄下
修改libavcodec/amr/makefile 找到CFLAGS =-Wall -pedantic-errors -I. $(CFLAGS_$(MODE)) -D$(VAD) 換成CFLAGS = -Wall -I.
$(CFLAGS_$(MODE)) -D$(VAD) -DMMS_IO
整體編譯參數(shù)就是
#./configure --prefix=/usr --enable-gpl --enable-shared--enable-mp3lame --enable-amr_nb-fixed --enable-amr_wb --enable-amr_if2--enable-libogg --enable-vorbis --enable-xvid --enable-a52 --enable-a52bin--enable-dts --enable-pp --enable-faad --enable-faadbin --enable-faac--enable-x264 --enable-pthreads --disable-ffserver --disable-ffplay
make
make install
for x86的簡(jiǎn)易配置
#./configure --prefix=./install --disable-shared--enable-pthreads --enable-libx264 --enable-libxvid --arch=i686 --enable-gpl
#make
#make install
for arm
配置編譯
#./configure--prefix=/home/zht/redhatzht/sources/image-colletct/ffmpeg/install--enable-static --disable-shared --enable-libx264 --enable-libxvid--cross-compile --cc=arm-linux-gcc --arch=arm --enable-gpl --disable-strip--disable-network --disable-ipv6 --disable-vhook --disable-audio-beos--disable-audio-oss --disable-mpegaudio-hp??--enable-pthreads--enable-small --disable-parsers --disable-debug
#make
#make install
注意:
(1)“/home/zht/redhatzht/sources/image-colletct/ffmpeg”為ffmpeg源碼所在目錄。
(2)“/usr/local/arm”為arm-linux-gcc交叉編譯器所在目錄。
(3) 如果庫(kù)文件安裝在/usr/local/lib目錄中導(dǎo)致配置失敗,可以在/etc/ld.so.conf文件中添加/usr/local/lib目錄,然后執(zhí)行#ldconfig。
? ? x86上的ldconfig不能在arm上運(yùn)行,arm上的ldconfig工具是在建立交叉編譯器時(shí),編譯glibc是產(chǎn)生的,可以拷貝到arm-linux中。
(4) 本文大部分內(nèi)容來(lái)自網(wǎng)絡(luò),其中xvid,x264的庫(kù),我親手安裝過(guò),ffmpeg的配置編譯for x86的簡(jiǎn)易配置,for arm,我親手配置編譯過(guò),并在x86,arm上可用,編譯配置都是采用靜態(tài)庫(kù)。
5 ffmpeg用法
ffmpeg作為媒體文件處理軟件,基本用法如下:
ffmpeg -i INPUTfile [OPTIONS] OUTPUTfile
輸入輸出文件通常就是待處理的多媒體文件了。可以是純粹的音頻文件,純粹的視頻文件,或者混合的。ffmpeg支持絕大部分的常見(jiàn)音頻,視頻格式,象常見(jiàn)的 各種mpeg,AVI封裝的DIVX和Xvid等等,具體的格式支持列表可以使用ffmpeg -formats查看或直接查閱文檔。
另外,由于Linux把設(shè)備視為文件,因此-i選項(xiàng)后可以跟設(shè)備名。比如DV,視頻卡,光驅(qū)或者其它的各類設(shè)備。輸出的內(nèi)容通過(guò)
Options調(diào)整,其主要的選項(xiàng)如下:
-vcodec??視頻流編碼方式
-b? ?? ???視頻流碼率(默認(rèn)只有200k,一般都需要手動(dòng)設(shè)置,具體的數(shù)值視codec選擇而定)
-r? ?? ???視頻流幀數(shù)(一般說(shuō)來(lái)PAL制式通常用25,NTSC制式通常用29)
-s? ?? ?? ?視頻解析度(分辨率,也要視codec和你的需要而定。另:具體寫(xiě)法使用“數(shù)字x數(shù)字”的形式)
-t? ?? ?? ?處理持續(xù)時(shí)間。
-acodec? ?音頻流編碼方式
-ab? ?? ?? ? 音頻流碼率(默認(rèn)是同源文件碼率,也需要視codec而定)
-ar? ?? ?? ???音頻流采樣率(大多數(shù)情況下使用44100和48000,分別對(duì)應(yīng)PAL制式和NTSC制式,根據(jù)需要選擇)
-vn??屏蔽視頻流
-an??屏蔽音頻流
-author??設(shè)置媒體文件的作者
-title??設(shè)置媒體文件的題目
-f??強(qiáng)制使用某種格式
-target type 使用預(yù)置的格式轉(zhuǎn)換(可以轉(zhuǎn)成dvd,vcd或svcd)
除此之外還有些更高級(jí)的選項(xiàng),如設(shè)定vbr,或設(shè)定high quality,或者設(shè)定vbr的buff和max/min碼率,象一般我們自用的dvd抓軌啦,DV轉(zhuǎn)vcd dvd啦,網(wǎng)上下載的電影轉(zhuǎn)成vcd或dvd都不一定需要用到它們。
常用命令選項(xiàng)說(shuō)明
-fromats 顯示可用的格式
-f fmt 強(qiáng)迫采用格式fmt
-I filename 輸入文件
-y 覆蓋輸出文件
-t duration 設(shè)置紀(jì)錄時(shí)間hh:mm:ss[.xxx]格式的記錄時(shí)間也支持(截圖需要)
-ss position 搜索到指定的時(shí)間[-]hh:mm:ss[.xxx]的格式也支持
-title string 設(shè)置標(biāo)題
-author string 設(shè)置作者
-copyright string 設(shè)置版權(quán)
-comment string 設(shè)置評(píng)論
-target type 設(shè)置目標(biāo)文件類型(vcd,svcd,dvd),所有的格式選項(xiàng)(比特率,編解碼以及緩沖區(qū)大小)自動(dòng)設(shè)置,只需要輸入如下的就可以了:ffmpeg -i myfile.avi -target vcd /tmp/vcd.mpg
-hq 激活高質(zhì)量設(shè)置
-b bitrate 設(shè)置比特率,缺省200kb/s
-r fps 設(shè)置幀頻,缺省25
-s size 設(shè)置幀大小,格式為WXH,缺省160X128.下面的簡(jiǎn)寫(xiě)也可以直接使用:Sqcif 128X96 qcif 176X144 cif 252X288 4cif 704X576
-aspect aspect 設(shè)置橫縱比 4:316:9 或 1.3333 1.7777
-croptop/botton/left/right size 設(shè)置頂部切除帶大小,像素單位
-padtop/botton/left/right size 設(shè)置頂部補(bǔ)齊的大小,像素單位
-padcolor color 設(shè)置補(bǔ)齊條顏色(hex,6個(gè)16進(jìn)制的數(shù),紅:綠:藍(lán)排列,比如 000000代表黑色)
-vn 不做視頻記錄
-bt tolerance 設(shè)置視頻碼率容忍度kbit/s
-maxrate bitrate設(shè)置最大視頻碼率容忍度
-minrate bitreate 設(shè)置最小視頻碼率容忍度
-bufsize size 設(shè)置碼率控制緩沖區(qū)大小
-vcodec codec 強(qiáng)制使用codec編解碼方式. 如果用copy表示原始編解碼數(shù)據(jù)必須被拷貝.(很重要)
-ab bitrate 設(shè)置音頻碼率
-ar freq 設(shè)置音頻采樣率
-ac channels 設(shè)置通道,缺省為1
-an 不使能音頻紀(jì)錄
-acodec codec 使用codec編解碼
-vd device 設(shè)置視頻捕獲設(shè)備,比如/dev/video0
-vc channel 設(shè)置視頻捕獲通道DV1394專用
-tvstd standard 設(shè)置電視標(biāo)準(zhǔn) NTSC PAL(SECAM)
-dv1394 設(shè)置DV1394捕獲
-av device 設(shè)置音頻設(shè)備 比如/dev/dsp
-map file:stream 設(shè)置輸入流映射
-debug 打印特定調(diào)試信息
-benchmark 為基準(zhǔn)測(cè)試加入時(shí)間
-hex 傾倒每一個(gè)輸入包
-bitexact 僅使用位精確算法 用于編解碼測(cè)試
-ps size 設(shè)置包大小,以bits為單位
-re 以本地幀頻讀數(shù)據(jù),主要用于模擬捕獲設(shè)備
-loop 循環(huán)輸入流。只工作于圖像流,用于ffserver測(cè)試
5 example
(1) ffmpeg的使用
"Video and Audio grabbing"
FFmpeg can use a video4linux compatible video sourceand any Open Sound System audio source:? ?? ?? ?
? ?? ???ffmpeg/tmp/out.mpg
Note that you must activate the right video source andchannel before launching ffmpeg. You can use any TV viewer such as
xawtv (<http://bytesex.org/xawtv/>) by Gerd Knorr which I findvery good. You must also set correctly the audio recording
levels with a standard mixer.
"Video and Audio file format conversion"
* You can input from YUV files:? ???
? ?? ???ffmpeg -i /tmp/test%d.Y/tmp/out.mpg
The Y files usetwice the resolution of the U and V files. They are raw files, without header.They can be generated by all decent video decoders. You must specify the sizeof the image with the -s option if ffmpeg cannot guess it.
* You can input from a RAW YUV420P file:??? ?? ?
? ?? ???ffmpeg -i/tmp/test.yuv /tmp/out.avi
The RAW YUV420P is a file containing RAW YUV planar,for each frame first come the Y plane followed by U and V planes, which arehalf vertical and horizontal resolution.
* You can output to a RAW YUV420P file:??? ?? ?
? ?? ???ffmpeg -imydivx.avi -o hugefile.yuv
* You can set several input files and outputfiles:? ?? ?? ?
? ?? ???ffmpeg -i/tmp/a.wav -s 640x480 -i /tmp/a.yuv /tmp/a.mpg
Convert the audio file a.wav and the raw yuv video filea.yuv to mpeg file a.mpg
* You can also do audio and video conversions at thesame time:? ?? ?? ?
? ?? ???ffmpeg -i/tmp/a.wav -ar 22050 /tmp/a.mp2
Convert the sample rate of a.wav to 22050 Hz and encodeit to MPEG audio.
* You can encode to several formats at the same timeand define a mapping from input stream to output streams:? ???? ?
? ?? ???ffmpeg -i/tmp/a.wav -ab 64 /tmp/a.mp2 -ab 128 /tmp/b.mp2 -map 0:0 -map 0:0
Convert a.wav to a.mp2 at 64 kbits and b.mp2 at 128kbits. "-map file:index" specify which input stream is used for eachoutput stream, in the order of the definition of output streams.
* You can transcode decrypted VOBs? ???? ?
? ?? ???ffmpeg -isnatch_1.vob -f avi -vcodec mpeg4 -b 800 -g 300 -bf 2 -acodec mp3 -ab 128snatch.avi
This is a typical DVD ripper example, input from a VOBfile, output to an AVI file with MPEG-4 video and MP3 audio, note that in this command we use B frames so theMPEG-4 stream is DivX5 compatible, GOP size is 300 that means an INTRA frameevery 10
seconds for 29.97 fps input video.??Also theaudio stream is MP3 encoded so you need LAME support which is enabled using--enable-mp3lame when configuring.??The mapping is particularlyuseful for DVD transcoding to get the desired audio language.
NOTE: to see the supported input formats, use ffmpeg-formats.
(2) ffplay的使用
ffplay - FFplay media player
SYNOPSIS
ffplay [options] input_file
DESCRIPTION
FFplay is a very simple and portable media player usingthe FFmpeg libraries and the SDL library. It is mostly used as a test bench forthe various APIs of FFmpeg.
OPTIONS
"Main options"
show help force displayed width force displayed heightdisable audio disable video disable graphical display force format
"Advanced options"
show the stream duration, the codec parameters, thecurrent position in the stream, and the audio/video synchronisation drift.force RTP/TCP protocol usage instead of RTP/UDP. It is only meaningful if youare doing stream with the RTSP protocol.
set the master clock to audio ( type=audio), video (type=video) or external ( type=ext). Default is audio. The master clock is usedto control audio-video synchronization. Most media players use audio as masterclock, but in some cases (streaming or high quality broadcast) it is necessaryto change that. This option is mainly used for debugging purposes.
(3) ffserver的使用
ffsserver - FFserver video server
SYNOPSIS
ffserver [options]
DESCRIPTION
FFserver is a streaming server for both audio andvideo. It supports several live feeds, streaming from files and time shiftingon live feeds (you can seek to positions in the past on each live feed,provided you specify a big enough feed
storage in ffserver.conf).
This documentation covers only the streaming aspects offfserver / ffmpeg. All questions about parameters for ffmpeg, codec questions,etc. are not covered here. Read ffmpeg-doc.html for more information.
OPTIONS
print the license print the help use configfile insteadof /etc/ffserver.conf
6 其他(參考)
(1)mencoder篇
? ?首先獲取mplayer軟件包極其mplayer官網(wǎng)上自帶的codecs.如果喜歡mplayer,也可以下載gui和font.關(guān)于mplayer-1.0rc1在71.21的/home/zhengyu/tools中能找到.如果需要網(wǎng)上下載,可以去官網(wǎng):http://www.mplayerhq.hu/de...下載rc1地址如
下:http://www1.mplayerhq.hu/M...最新的svn版本:http://www1.mplayerhq.hu/M...官網(wǎng)同時(shí)也給出了一些codec,其中就有rm格式的codec:http://www1.mplayerhq.hu/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,當(dāng)然也有一個(gè)沒(méi)有g(shù)ui的mplayer可以播放各種視頻了.不過(guò)我們需要的是mencoder.至此,ffmpeg+mencoder搭建完成.
(2) 常見(jiàn)操作說(shuō)明
對(duì)于ffmpeg,可以將除swf,rmvb,wmav9以外的視頻/音頻格式轉(zhuǎn)換成flv/mp3,同時(shí)可以截取這些視頻文件中的某個(gè)時(shí)間的該幀圖片.這些實(shí)際上就是一個(gè)視頻播客顯示的部分.對(duì)于mencoder,支持各種常見(jiàn)格式的視頻/音頻轉(zhuǎn)換成flv/mp3.或者轉(zhuǎn)換成avi.
1) ffmpeg進(jìn)行操作的常用方法:
? ?* 轉(zhuǎn)換成flv文件:ffmpeg -i infile.* -y (-ss second_offset -ar ar -ab ab -r vr -b vb-s vsize) outfile.flv
? ?? ???其中second_offset是從開(kāi)始的多好秒鐘.可以支持**:**:**格式,至于ar,ab是音頻的參數(shù),可以指定ar= 22050,24000,44100(PAL制式),48000(NTSC制式),后兩種常見(jiàn),ab=56(視音頻協(xié)議的codec而定,如果要聽(tīng)高品質(zhì),則80以上).vr,vb,vsize是視頻參數(shù),可以指定vr=15,25(PAL),29(NTSC),vb=200,500,800,1500 (視視頻協(xié)議的codec而定,可以通過(guò)查看專業(yè)的codec說(shuō)明文檔獲取,如果你手頭有一份詳細(xì)的各種codec的文檔,請(qǐng)?zhí)峁┮环萁o我,不勝感 激.),還有一些參數(shù)-acodec ac -vcodec vc(ac指定音頻codec,ar和ab可以省去,vc指定視頻codec,vr和vb可以省去,自動(dòng)采用相應(yīng)的codec參數(shù))還有很多高級(jí)參數(shù),如 -qmin,-qcale等,請(qǐng)查看詳細(xì)文檔。還有-an和-vn參數(shù),分別從多媒體文件中提取出純粹視頻和音頻。另,如果你是用shell批量處理,請(qǐng)使用-y參數(shù)覆蓋生成flv.
? ?* 截取圖片:ffmpeg-i infile.* -y (-ss second_offset) -t 0.001 -s msize (-f image_fmt) outfile.jpg
? ?? ?? ?? ?其中second_offset同上,msize同vsize,圖片大小.image_fmt=image2強(qiáng)制使用 jpg,image_fmt=gif,強(qiáng)制使用gif格式.還可以用-vframes fn指定截取某幀圖片,fn=1,2,3,...
2)mencoder操作
? ? mencoder的作用主要在視頻轉(zhuǎn)碼方面.在安裝完mplayer后,mencoder也編譯生成了.可以man mencoder獲取mencoder的說(shuō)明文檔. mencoder的參數(shù)更加復(fù)雜,不過(guò)也無(wú)非是音頻處理視頻處理兩個(gè)方面,可以參看網(wǎng)絡(luò)例子:http://www.masoncn.com/pos...這里不作詳細(xì)的列舉了.
? ?mencoder進(jìn)行操作的常用方法: mencoder infile.* -o outfile.* [-ovc 目標(biāo)視頻格式] [-oac 目標(biāo)音頻格式] [-of 目標(biāo)文件格式]
? ?* 轉(zhuǎn)換成flv文件: mencoder infile.* -o outfile.flv -of lavf -oac mp3lame -lameoptsabr:br=56 -ovc lavc -lavcopts
vcodec=flv:vbitrate=150:mbd=2:mv0:trell:v4mv:cbp:last_pred=3-srate 22050
? ?* 轉(zhuǎn)換成avi文件: mencoder infile.* -o outfile.avi -of avi -oac mp3lame -lameoptspreset=64 -ovc xvid -xvidencopts
bitrate=600
? ?* 轉(zhuǎn)換成wmv文件(復(fù)雜寫(xiě)法,其中高級(jí)參數(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
? ?其中-ovc,-oac和-of是必須的,-ovc是指定視頻codec,指定了ovc之后通常帶一個(gè)該codec的opt參數(shù),-oac是指定音頻 codec,也會(huì)在其后帶一個(gè)codec的opt參數(shù).可以指定細(xì)節(jié)以決定視頻音頻質(zhì)量和轉(zhuǎn)換速率.具體的細(xì)節(jié)可以參看專業(yè)的技術(shù)文檔.
7??ffmpeg配置選項(xiàng)
[root@web ffmpeg]# ./configure --help
Usage: configure [options]
Options: [defaults in brackets after descriptions]
Standard options:? ?基本選項(xiàng)參數(shù)
??--help? ?? ???? ?? ?? ? 顯示此幫助信息|print this message
??--log[=FILE|yes|no]? ???記錄測(cè)試并輸出到config.err文件|log tests and output to FILE [config.err]
??--prefix=PREFIX? ???? ? 安裝程序到指定目錄(默認(rèn)/usr/local)|install in PREFIX [/usr/local]
??--libdir=DIR? ???? ?? ? 安裝庫(kù)到指定目錄(默認(rèn)prefix/lib)|install libs in DIR [PREFIX/lib]
??--shlibdir=DIR? ???? ???指定共享庫(kù)路徑(默認(rèn)prefix/lib)|install shared libs in DIR [PREFIX/lib]
??--incdir=DIR? ???? ?? ? 指定includes路徑(默認(rèn)prefix/include/ffmpeg)|installincludes in DIR[PREFIX/include/ffmpeg]
??--mandir=DIR? ???? ?? ? 指定man page路徑(默認(rèn)prefix/man)install manpage in DIR [PREFIX/man]
??--enable-mp3lame? ???? ?啟用mp3編碼libmp3lame(默認(rèn)關(guān)閉)enableMP3 encoding via libmp3lame[default=no]
??--enable-libogg? ???? ? 啟用ogg支持libogg(默認(rèn)關(guān)閉)enable Oggsupport via libogg [default=no]
??--enable-vorbis? ???? ? 啟用Vorbis支持libvorbis(默認(rèn)關(guān)閉)enableVorbis support via libvorbis [default=no]
??--enable-faad? ???? ?? ?啟用faad支持libfaad(默認(rèn)關(guān)閉)enable FAADsupport via libfaad [default=no]
??--enable-faadbin? ???? ?啟用faad運(yùn)行時(shí)鏈接支持(默認(rèn)關(guān)閉)build FAAD support with runtime linking[default=no]
??--enable-faac? ???? ?? ?啟用faac支持libfaac(默認(rèn)關(guān)閉)enable FAACsupport via libfaac [default=no]
??--enable-libgsm? ???? ? 啟用GSM支持libgsm(默認(rèn)關(guān)閉)enable GSMsupport via libgsm [default=no]
??--enable-xvid? ???? ?? ?啟用xvid支持xvidcore(默認(rèn)關(guān)閉)enableXviD support via xvidcore [default=no]
??--enable-x264? ???? ?? ?啟用H.264編碼(默認(rèn)關(guān)閉)enable H.264 encoding via x264 [default=no]
??--enable-mingw32? ???? ?啟用MinGW本地/交叉win環(huán)境編譯|enable MinGW native/cross Windows compile
??--enable-mingwce? ???? ?啟用MinGW本地/交叉winCE環(huán)境編譯enable MinGW native/cross WinCE compile
??--enable-a52? ???? ?? ? 啟用A52支持(默認(rèn)關(guān)閉)enable GPLed A52 support [default=no]
??--enable-a52bin? ???? ? 啟用運(yùn)行時(shí)打開(kāi)liba52.so.0(默認(rèn)關(guān)閉)open liba52.so.0 at runtime [default=no]
??--enable-dts? ???? ?? ? 啟用DTS支持(默認(rèn)關(guān)閉)enable GPLed DTS support [default=no]
??--enable-pp? ?? ???? ???啟用后加工支持(默認(rèn)關(guān)閉)enableGPLed postprocessing support [default=no]
??--enable-static? ???? ? 構(gòu)建靜態(tài)庫(kù)(默認(rèn)啟用)buildstatic libraries [default=yes]
??--disable-static? ???? ?禁止構(gòu)建靜態(tài)庫(kù)(默認(rèn)關(guān)閉)donot build static libraries [default=no]
??--enable-shared? ???? ? 構(gòu)建共享庫(kù)(默認(rèn)關(guān)閉)buildshared libraries [default=no]
??--disable-shared? ???? ?禁止構(gòu)建共享庫(kù)(默認(rèn)啟用)donot build shared libraries [default=yes]
??--enable-amr_nb? ???? ? 啟用amr_nbfloat音頻編解碼器|enable amr_nbfloat audio codec
??--enable-amr_nb-fixed? ? 啟用fixed amr_nb codec | use fixed point for amr-nb codec
??--enable-amr_wb? ???? ? 啟用amr_wbfloat音頻編解碼器|enable amr_wbfloat audio codec
??--enable-amr_if2? ???? ?啟用amr_wb IF2音頻編解碼器|enable amr_wb IF2 audio codec
??--enable-sunmlib? ???? ?啟用Sunmedialib(默認(rèn)關(guān)閉) | use Sunmedialib [default=no]
??--enable-pthreads? ?????啟用pthreads(多線程)(默認(rèn)關(guān)閉)use pthreads [default=no]
??--enable-dc1394? ???? ? 啟用libdc1394、libraw1394抓取IIDC-1394(默認(rèn)關(guān)閉)enable IIDC-1394 grabbing using libdc1394 and
libraw1394 [default=no]
??--enable-swscaler? ?????啟用計(jì)數(shù)器支持?(默認(rèn)關(guān)閉)softwarescaler support [default=no]
??--enable-avisynth? ?????允許讀取AVISynth腳本本件(默認(rèn)關(guān)閉)allow reading AVISynth script files [default=no]
??--enable-gpl? ???? ?? ? 允許使用GPL(默認(rèn)關(guān)閉)allow use of GPL code, the resulting libav* and ffmpeg will be underGPL
[default=no]
Advanced options (experts only): 高級(jí)選項(xiàng)參數(shù)(供專業(yè)人員使用)
??--source-path=PATH? ??? 源碼的路徑(當(dāng)前為/root/flv/ffmpeg)| path to source code [/root/flv/ffmpeg]
??--cross-prefix=PREFIX? ? 為編譯工具指定路徑 | use PREFIX for compilation tools []
??--cross-compile? ???? ? 假定使用了交叉編譯 |assume a cross-compiler is used
??--cc=CC? ?? ???? ?? ?? ?指定使用何種C編譯器(默認(rèn)gcc)use C compiler CC [gcc]
??--make=MAKE? ?? ???? ???使用特定的make |use specified make [make]
??--extra-cflags=ECFLAGS? ?添加ECFLAGS到CFLAGS | add ECFLAGSto CFLAGS []
??--extra-ldflags=ELDFLAGS 添加ELDFLAGS到LDFLAGS(默認(rèn)-Wl,--as-needed)| add ELDFLAGS to LDFLAGS [ -Wl,--as-needed]
??--extra-libs=ELIBS? ??? 添加ELIBS | add ELIBS[]
??--build-suffix=SUFFIX? ? 為專用程序添加后綴 | suffix for application specific build []
??--arch=ARCH? ?? ???? ???選擇機(jī)器架構(gòu)(默認(rèn)x86)select architecture??[x86]
??--cpu=CPU? ?? ???? ?? ? 選用最低的cpu(影響指令的選擇,可以在老CPU上出錯(cuò)) | selects theminimum cpu required (affects
instruction selection, may crash on older CPUs)
??--powerpc-perf-enable? ? 啟用PPC上面的性能報(bào)告(需要啟用PMC)enable performance report on PPC
? ?? ?? ???? ?? ?? ?? ???(requires enabling PMC)
??--disable-mmx? ???? ?? ?禁用MMX |disable MMX usage
??--disable-armv5te? ?????禁用armv5te | disablearmv5te usage
??--disable-iwmmxt? ???? ?禁用iwmmxt |disable iwmmxt usage
??--disable-altivec? ?????禁用AltiVec | disableAltiVec usage
??--disable-audio-oss? ???禁用OSS音頻支持(默認(rèn)啟用)disable OSS audio support [default=no]
??--disable-audio-beos????禁用BeOS音頻支持(默認(rèn)啟用)disable BeOS audio support [default=no]
??--disable-v4l? ???? ?? ?禁用video4linux提取(默認(rèn)啟用)disable video4linux grabbing [default=no]
??--disable-v4l2? ???? ???禁用video4linux2提取(默認(rèn)啟用)disable video4linux2 grabbing [default=no]
??--disable-bktr? ???? ???禁用bktr視頻提取(默認(rèn)啟用)disable bktr video grabbing [default=no]
??--disable-dv1394? ???? ?禁用DV1394提取(默認(rèn)啟用)disable DV1394 grabbing [default=no]
??--disable-network? ?????禁用網(wǎng)絡(luò)支持(默認(rèn)支持)disablenetwork support [default=no]
??--disable-ipv6? ???? ???禁用ipv6支持(默認(rèn)支持)disable ipv6 support [default=no]
??--disable-zlib? ???? ???禁用zlib(默認(rèn)支持)disable zlib [default=no]
??--disable-simple_idct? ? 禁用simple IDCT例程(默認(rèn)啟用)disablesimple IDCT routines [default=no]
??--disable-vhook? ???? ? 禁用videohooking支持 | disable videohooking support
??--enable-gprof? ???? ???enable profiling with gprof [no]
??--disable-debug? ???? ? 禁用調(diào)試符號(hào) |disable debugging symbols
??--disable-opts? ???? ???禁用編譯器最優(yōu)化 |disable compiler optimizations
??--disable-mpegaudio-hp? ?啟用更快的解碼MPEG音頻(但精確度較低)(默認(rèn)禁用)faster(but less accurate) MPEG audio decoding
[default=no]
??--disable-protocols? ???禁用 I/O 協(xié)議支持(默認(rèn)啟用)disable I/O protocols support [default=no]
??--disable-ffserver? ??? 禁用生成ffserver |disable ffserver build
??--disable-ffplay? ???? ?禁用生成ffplay |disable ffplay build
??--enable-small? ???? ???啟用優(yōu)化文件尺寸大小(犧牲速度)optimize for size instead of speed
??--enable-memalign-hack? ?啟用模擬內(nèi)存排列,由內(nèi)存調(diào)試器干涉? | emulate memalign, interferes with memory debuggers
??--disable-strip? ???? ? 禁用剝離可執(zhí)行程序和共享庫(kù)| disable stripping of executables and shared libraries
??--disable-encoder=NAME? ?禁用XX編碼器 | disablesencoder NAME
??--enable-encoder=NAME? ? 啟用XX編碼器 | enables encoderNAME
??--disable-decoder=NAME? ?禁用XX解碼器 | disablesdecoder NAME
??--enable-decoder=NAME? ? 啟用XX解碼器 | enables decoderNAME
??--disable-encoders? ??? 禁用所有編碼器 | disablesall encoders
??--disable-decoders? ??? 禁用所有解碼器 | disablesall decoders
??--disable-muxer=NAME????禁用XX混音器 | disables muxer NAME
??--enable-muxer=NAME? ???啟用XX混音器 | enables muxer NAME
??--disable-muxers? ???? ?禁用所有混音器 |disables all muxers
??--disable-demuxer=NAME? ?禁用XX解軌器 | disablesdemuxer NAME
??--enable-demuxer=NAME? ? 啟用XX解軌器 | enables demuxerNAME
??--disable-demuxers? ??? 禁用所有解軌器 | disablesall demuxers
??--enable-parser=NAME????啟用XX剖析器 | enables parser NAME
??--disable-parser=NAME? ? 禁用XX剖析器 | disables parserNAME
??--disable-parsers? ?????禁用所有剖析器 | disablesall parsers
8 參考資料
ffmpeg的編譯大全
ffmpeg的使用
ffmpeg_mencoder環(huán)境搭建和視頻處理總結(jié)
自譯的ffmpeg ./configure參數(shù)
?
mplayer 使用手冊(cè)(中文)
MPlayer
名稱
概要
說(shuō)明
一般注記
播放選項(xiàng) ( 僅用于 MPLAYER)
分路器 / 媒體流選項(xiàng)
OSD/ 字幕選項(xiàng)
音頻輸出選項(xiàng) ( 僅用于 MPLAYER)
視頻輸出選項(xiàng) ( 僅用于 MPLAYER)
解碼 / 濾鏡選項(xiàng)
編碼選項(xiàng) ( 僅用于 MENCODER)
鍵盤(pán)控制
SLAVE 模式協(xié)議
文件
示例
BUGS
作者
標(biāo)準(zhǔn)聲明
名稱
mplayer ? Linux下的電影播放器
mencoder ? Linux下的電影編碼器
概要
mplayer [選項(xiàng)] [ 文件 | URL | 播放列表 | - ]
mplayer [全局選項(xiàng)] 文件1 [特定選項(xiàng)] [文件2] [特定選項(xiàng)]
mplayer [全局選項(xiàng)] {一組文件和選項(xiàng)} [針對(duì)該組的特定選項(xiàng)]
mplayer [dvd|vcd|cdda|cddb|tv]://title [選項(xiàng)]
mplayer [mms[t]|http|http_proxy|rt[s]p]:// [用戶名:密碼@]URL[:端口] [選 項(xiàng)]
mencoder [選項(xiàng)] [ 文件 | URL | - ] [?o 輸出文件]
gmplayer [選項(xiàng)] [?skinskin]
說(shuō)明
mplayer 是一個(gè)LINUX下的電影播放器, (也能運(yùn)行在許多其它的Unices 和非x86 的CPU 上, 參看文檔). 它能使用本地的, XAnim, Win32 DLL的編解碼器播放絕大 部分的MPEG/VOB, AVI, ASF/WMA/WMV, RM, QT/MOV/MP4, OGG/OGM, VIVO, FLI,NuppelVideo, yuv4mpeg, FILM 和RoQ 文件. 你還能觀看VideoCD,SVCD,DVD, 3ivx, DivX 3/4/5甚至WMV電影(不需要使用avifile庫(kù)).
MPlayer 的另一個(gè)優(yōu)越的特性是對(duì)輸出設(shè)備的廣泛的支持. 它可以使 用X11, XV,DGA, OpenGL, SVGAlib, fbdev, AAlib, DirectFB, 但你也可以使用GGI, SDL(由 此可以使用他們的所有驅(qū)動(dòng)),VESA(所有VESA兼容的顯卡,甚至可以 沒(méi)有X11), 某 些 低級(jí)的顯卡相關(guān)的驅(qū)動(dòng)(Matrox,3Dfx和ATI)和一些硬件MPEG解碼器卡, 比 如Siemens DVB,DXR2和DXR3/Hollywood+. 它們中絕大多數(shù)支持軟件或硬件縮放, 所以你可以 享 受全屏電影.
MPlayer 具有onscreendisplay(OSD)功能, 用來(lái)顯示狀態(tài)信息, 清晰放大反鋸齒 帶陰影的字幕和鍵盤(pán)控制的視覺(jué)反饋. 支持的字體包括歐洲語(yǔ)種/ISO8859-1,2 ( 匈 牙 利語(yǔ), 英語(yǔ), 捷克語(yǔ)等等), 西里爾語(yǔ)和韓語(yǔ), 可以播放10種格式的字幕文件(MicroDVD, SubRip, SubViewer, Sami, VPlayer, RT, SSA, AQTitle,JACOsub 和 我 們 自 己 的: MPsub)和DVD字幕(SPU流, VobSub和隱藏字幕數(shù)據(jù) 表(ClosedCaptions)).
mencoder (MPlayer的電影編碼器)是一個(gè)簡(jiǎn)單的電影編碼器, 設(shè)計(jì)用來(lái)把MPlayer 可以播放的電影(見(jiàn)上面)編碼成另一些MPlayer可以播放的格式(見(jiàn)下面). 它可 以通過(guò)1, 2或者3 pass的方式編碼DivX4, XviD,libavcodec的編解碼器支持的視 頻格式和PCM/MP3/VBRMP3的音頻. 進(jìn)一步的它還擁有流復(fù)制的能力, 一個(gè)強(qiáng)大的插件系統(tǒng)(crop, expand, flip, postprocess, rotate, scale, noise, rgb/yuv 轉(zhuǎn)換)和更多.
gmplayer 是使用圖形用戶界面的MPlayer.它使用跟MPlayer相同的參數(shù).
一般注記
參見(jiàn)HTML文檔!
每個(gè)’flag’選項(xiàng)都有一個(gè)對(duì)應(yīng)的’noflag’選項(xiàng), 比如?fs選項(xiàng)的對(duì)應(yīng)選項(xiàng)是?nofs.
你可以把所有選項(xiàng)放在配置文件中, mplayer每次運(yùn)行時(shí)都會(huì)讀取它們. 系統(tǒng)范圍的配置文件’mplayer.conf’在你的配置目錄中, (比如/etc/mplayer或者/usr/local/etc/mplayer), 用戶特定的配置文件是’~/.mplayer/config’.用戶特定的選項(xiàng)優(yōu)先于系統(tǒng)范圍的選項(xiàng), 而命令行選項(xiàng)優(yōu)先于這兩者. 配置文件的語(yǔ)法是’選項(xiàng)=<參數(shù)>’, ’#’后面的都認(rèn)為是注釋. 啟用沒(méi)有參數(shù)的選項(xiàng)可以把參數(shù)設(shè)為’yes’ 或者’1’, 而如果要禁用就把它們?cè)O(shè)置為’no’或者’0’. 甚至子選項(xiàng)也可以通過(guò)這種方式設(shè)定.
示例:
# 默認(rèn)使用Matrox驅(qū)動(dòng).
vo=xmga
# 我喜歡在看片子的時(shí)候練習(xí)倒立.
flip=yes
# 從多個(gè)png文件解碼/編碼, 以-mf啟動(dòng)
mf= type=png:fps=25
你也可以制作針對(duì)特定文件的配置文件. 如果你希望’movie.avi’這個(gè)文件有自己的配置文件, 創(chuàng)建一個(gè)叫’movie.avi.conf’的文件, 寫(xiě)上針對(duì)該文件的選項(xiàng), 把它放在~/.mplayer中或者該文件同一目錄下.
播放選項(xiàng) ( 僅用于 MPLAYER)
?, ?use-stdin
從標(biāo)準(zhǔn)輸入讀取數(shù)據(jù). ?idx選項(xiàng)無(wú)法與這個(gè)選項(xiàng)同時(shí)工作.
?autoq <質(zhì)量> (與?vf pp一起使用)
根據(jù)可用的CPU空閑時(shí)間動(dòng)態(tài)調(diào)整后期處理的級(jí)別. 你設(shè)定的數(shù)字是允許使用的最高級(jí)別. 一般來(lái)說(shuō)你可以使用一些比較大的數(shù)字. 你必須使用不帶參數(shù)的?vf pp才能使用它.
?autosync <因子>
基于音頻延遲的檢測(cè)逐步調(diào)整A/V同步. 設(shè)定?autosync 0, 也就是默 認(rèn)值, 將導(dǎo)致幀記時(shí)完全基于音頻延遲的檢測(cè). 設(shè)定?autosync 1也是一 樣, 但將會(huì)微妙的改變所使用的A/V修正算法. 設(shè)置大于1的值對(duì)那些視頻幀速率不均勻, 但用?nosound可以正常播放的電影一般會(huì)有幫助. 這 個(gè)值越大, 記時(shí)方法越接近于?nosound. 對(duì)于沒(méi)有好的音頻延遲檢測(cè)功 能的聲卡驅(qū)動(dòng)試試用?autosync 30來(lái)平滑這個(gè)問(wèn)題. 使用這個(gè)值時(shí), 如 果出現(xiàn)大的A/V同步偏移, 只需要1或2秒就可以擺平. 對(duì)于任何聲卡驅(qū)動(dòng), 打開(kāi)這個(gè)選項(xiàng)的唯一缺點(diǎn)就是對(duì)于突然的A/V偏移的反應(yīng)延遲時(shí)間.
?benchmark
在終端顯示一些CPU使用率和丟幀數(shù)的統(tǒng)計(jì)信 息. 與?nosound 和?vo null聯(lián)合使用可以用來(lái)評(píng)測(cè)視頻解碼器.
?edl <文件名>
在播放時(shí)啟用編輯決定列表(EDL)的動(dòng)作. 根據(jù)所給文件的內(nèi)容, 可以跳 過(guò)視頻, 靜音和取消靜音. 具 體 內(nèi) 容 和 使 用 方 法 參 見(jiàn)DOCS/documentation.html#edl.
?edlout <文件名>
建立一個(gè)新文件并寫(xiě)入編輯決定列表(EDL)的記錄. 在播放時(shí), 當(dāng)用戶按 下’i’, 一個(gè)跳過(guò)下面兩秒的記錄將寫(xiě)入文件. 用戶以后可以以此作為調(diào) 整EDL記錄的出發(fā)點(diǎn). 具體內(nèi)容參見(jiàn)DOCS/documentation.html#edl.
?enqueue (僅用于GUI)
將命令行中的文件加入播放序列而不是立刻播放它們.
?fixed-vo (BETA代碼!)
對(duì)多個(gè)文件使用一個(gè)固定的視頻系統(tǒng)(對(duì)所有文件初始化/釋放一次). 所以對(duì)所有文件只使用一個(gè)窗口, 目前fixed-vo兼容的驅(qū) 動(dòng) 有: x11, xv,xvidix, xmga, gl2, and svga.
?framedrop (參見(jiàn)?hardframedrop)
跳過(guò)一些幀從而在慢的機(jī)器上實(shí)現(xiàn)A/V同步.視頻濾鏡不會(huì)應(yīng)用到這些幀上. 對(duì)于B幀解碼也會(huì)完全跳過(guò).
?h, ?help, ??help
顯示簡(jiǎn)短的選項(xiàng)摘要.
?hardframedrop
丟掉更多的幀(破壞解碼). 導(dǎo)致圖像破損!
?identify
用容易分析的格式顯示文件參數(shù). 調(diào)用的TOOLS/midentify腳本將濾除mplayer的其它輸出而(但愿能)留下文件名.
?input <命令>
這個(gè)選項(xiàng)可以用來(lái)配置輸入系統(tǒng)的特定部分. 路徑相對(duì)于~/.mplayer/.
注意:
自動(dòng)重復(fù)功能目前只有游戲操縱桿支持.
可用的命令有:
conf=<文件>
讀取另外的input.conf. 如果沒(méi)有給出路徑名, 將假設(shè)是~/ .mplayer.
ar?delay
在開(kāi)始自動(dòng)重復(fù)一個(gè)鍵之前等待多少毫秒(0代表禁用).
ar?rate
當(dāng)自動(dòng)重復(fù)是每秒重復(fù)多少次.
keylist
列出所有可以被綁定的鍵.
cmdlist
列出所有可以被綁定的命令.
js?dev
指定可用的游戲操縱桿設(shè)備(默認(rèn)為/dev/input/js0).
file
從指定文件讀取命令, 用于命名管道很有效.
?lircconf <文件>
指定LIRC(Linux Infrared Remote Control, 參見(jiàn)http://www.lirc.org)的配置文件, 如果你不喜歡默認(rèn)的~/.lircrc的話.
?loop <數(shù)字>
重復(fù)播放電影<數(shù)字>遍. 0表示不斷重復(fù).
?menu (BETA代碼)
打開(kāi)OSD菜單支持.
?menu-root <參數(shù)> (BETA代碼)
指定主菜單.
?menu-cfg <文件> (BETA代碼)
使用另外的menu.conf.
?nojoystick
關(guān)閉游戲操縱桿的支持. 默認(rèn)是只要編譯了就會(huì)打開(kāi).
?nolirc
關(guān)閉LIRC支持.
?nortc
關(guān)閉使用Linux的RTC(real-time clock? /dev/rtc)作為計(jì)時(shí) 器的功能.
?playlist <文件>
根據(jù)播放列表播放文件(每行一個(gè)文件或者Winamp或ASX格式).
?quiet
顯示較少的輸出和狀態(tài)信息.
?really?quiet
顯示更少的輸出和狀態(tài)信息.
?sdp
指定輸入文件為描述一個(gè)RTP會(huì)話 的SDP(’SessionDescription Protocol’)文件, (參見(jiàn)http://www.live.com/mplayer/).
?shuffle
以隨機(jī)順序播放文件.
?skin <skin目錄> (BETA代碼)
從指定目錄中裝載skin(沒(méi)有路徑名).
示例:
?skin fittyfene
嘗試Skin/fittyfene. 將 會(huì) 首 先 察 看/usr/local/share/mplayer/,然后是~/.mplayer/.
?slave
這個(gè)選項(xiàng)打開(kāi)slave模式. 這用來(lái)將MPlayer作為其它程序的后 端. MPlayer將從他的標(biāo)準(zhǔn)輸入讀取簡(jiǎn)單命令行, 而不再截獲鍵盤(pán)事件. SLAVE模式協(xié)議部分將解釋其語(yǔ)法.
?softsleep
使用高質(zhì)量的軟件計(jì)時(shí)器. 跟RTC同樣精確且不需要特別權(quán)限. 代價(jià)是更 高的CPU消耗.
?speed <0.01?100>
設(shè)置播放速率.
?sstep <秒>
設(shè)定各幀顯示之間的時(shí)間間隔. 用于幻燈片播放.
分路器 / 媒體流選項(xiàng)
?aid <標(biāo)識(shí)> (參見(jiàn) ?alang選項(xiàng))
選擇音頻頻道 [MPEG: 0?31 AVI/OGM: 1?99 ASF/RM: 0?127 VOB(AC3): 128?159VOB(LPCM): 160?191] MPlayer在冗長(zhǎng)(-v)模式下會(huì)顯示可用的標(biāo)識(shí).
?alang <兩個(gè)字母的國(guó)家代碼>(參見(jiàn)?aid選項(xiàng))
僅用于DVD播放. 它選擇DVD的音頻語(yǔ)言并總是嘗試播放與所給代碼符合 的語(yǔ)言. 加上?v參數(shù)觀察輸出可以獲得可用語(yǔ)言的列表.
示例:
?alang hu,en
播放匈牙利語(yǔ), 英語(yǔ)在沒(méi)有匈牙利語(yǔ)時(shí)備用.
?audio?demuxer <數(shù)字> (僅用于?audiofile)
指定用于?audiofile的分路器. 分路器的標(biāo)識(shí)在demuxers.h 中. 使用?audio?demuxer 17將指定.mp3檢測(cè).
?audiofile <文件名>
在看電影時(shí)播放外部文件(WAV, MP3或Ogg Vorbis)的音頻.
-audiofile-cache <kBytes>
對(duì)-audiofile的文件流啟用緩存, 使用指定大小的內(nèi)存.
?bandwidth <參數(shù)>
設(shè)定網(wǎng)絡(luò)流的最大帶寬(用于服務(wù)器可以以不同帶寬傳送內(nèi)容的情況).當(dāng)你以慢速連接觀看流媒體實(shí)況時(shí)有用.
?cdrom?device <設(shè)備路徑>
替代默認(rèn)的CDROM設(shè)備名/dev/cdrom.
?cache <kBytes>
這個(gè)選項(xiàng)設(shè)定用多少內(nèi)存(以kBytes為單位)作為播放文件/URL的預(yù)緩沖. 對(duì)速度慢的媒體特別有用(默認(rèn)為?nocache).
?cdda <選項(xiàng)1:選項(xiàng)2>
這個(gè)選項(xiàng)用來(lái)調(diào)整MPlayer的CD音頻讀取特性.
可用選項(xiàng)有:
speed=<參數(shù)>
設(shè)定CD轉(zhuǎn)速
paranoia=<0?2>
設(shè)定謹(jǐn)慎級(jí)別
0: 關(guān)閉檢測(cè)
1: 只進(jìn)行重疊檢測(cè)(默認(rèn))
2: 完全數(shù)據(jù)修正和校檢
generic-dev=<參數(shù)>
使用指定的通用SCSI設(shè)備
sector-size=<參數(shù)>
單位讀取量
overlap=<參數(shù)>
將校檢時(shí)的最小重疊搜索設(shè)置為<參數(shù)>個(gè)扇區(qū).
toc-bias
假定TOC中報(bào)告的第1音軌的起始偏移量將按照LBA 0定位. 有些東芝光驅(qū)需要這個(gè)來(lái)獲得正確的音軌邊界.
toc-offset=<參數(shù)>
給定位音軌時(shí)在報(bào)告的扇區(qū)數(shù)上再加上<參數(shù)>個(gè)扇區(qū). 可以是負(fù) 數(shù).
(no)skip
(不)接受不完整的數(shù)據(jù)重建.
?channels <數(shù)字>
改變播放的聲道數(shù), 如果沒(méi)有設(shè)定默認(rèn)值為’2’. 如果輸出聲道數(shù)比輸入聲道數(shù)多時(shí), 將插入空聲道(但在將單聲道混合為立體聲時(shí), 會(huì)把單聲道 復(fù) 制到兩個(gè)輸出聲道). 如果輸出聲道比輸入聲道少, 結(jié)果取決與所用 的音頻解碼器(?afm).MPlayer會(huì)要求解碼器把音頻解碼到跟指定數(shù) 量的聲道. 由解碼器來(lái)實(shí)現(xiàn)這個(gè)要求. 如果解碼器的輸出比要求的多, 多 余的聲道會(huì)被去掉. 這個(gè)選項(xiàng)通常只有在播放AC3音頻(比如DVD)的視頻 時(shí)才顯得重要. 在那時(shí)默認(rèn)使用liba52解碼并把音頻適當(dāng)?shù)幕旌系叫枰?的輸出聲道.
注意:
這個(gè)選項(xiàng)可以被解碼器(僅用于AC3)濾鏡(surround)和音頻輸出驅(qū)動(dòng)( 至少OSS可以)接受.
可用選項(xiàng)有:
2
Stereo
4
Surround
6
Full 5.1
?chapter <場(chǎng)景標(biāo)識(shí)>[-<結(jié)束的場(chǎng)景標(biāo)識(shí)>]
設(shè)定從哪個(gè)場(chǎng)景開(kāi)始播放. 也可以設(shè)定在哪個(gè)場(chǎng)景結(jié)束播放(默認(rèn)值: 1). 示例可以在下面找到.
?csslib <文件名>
(老式DVD選項(xiàng))這個(gè)選項(xiàng)用來(lái)替代libcss.so的默認(rèn)位置.
?cuefile <文件名> (參見(jiàn)?vcd)
從指定的文件中描述的, CDRwin的(bin/cue文件格式)光盤(pán) 鏡 像 中 播 放(S)VCD.
?demuxer <參數(shù)>
指定分路器類型. 分路器的標(biāo)識(shí)定義在demuxers.h中. 使用?demuxer 17將指定.mp3檢測(cè).
?dumpaudio (僅用于MPLAYER)
將原始的音頻壓縮流復(fù)制到./stream.dump(用于mpeg/ac3).
?dumpfile <文件名> (僅用于MPLAYER)
指定MPlayer復(fù)制的輸出文件. 應(yīng)該與?dumpaudio / ?dumpvideo / ?dumpstream一起使用.
?dumpstream (僅用于MPLAYER)
將原始流復(fù)制到./stream.dump. 當(dāng)從DVD或網(wǎng)絡(luò)上rip時(shí)候有用.
?dumpvideo (僅用于MPLAYER)
將原始的視頻壓縮流復(fù)制到./stream.dump(不是十分好用).
vd://<節(jié)目標(biāo)識(shí)>
告訴MPlayer播放哪個(gè)電影(通過(guò)節(jié)目標(biāo)識(shí)指定). 比如有時(shí)’1’是一部預(yù)告片, 而’2’才是真正的電影.
注意:
有時(shí)DVD播放時(shí)需要進(jìn)行交錯(cuò)/逐行掃描轉(zhuǎn)換, 參見(jiàn)?vf pp=0x20000選項(xiàng).
?dvd?device <設(shè)備路徑>
替代默認(rèn)的DVD設(shè)備名/dev/dvd.
?dvdangle <視角標(biāo)識(shí)>
有些DVD 碟 片中的場(chǎng)景可以從多個(gè)視角觀看. 通過(guò)這個(gè)選項(xiàng)你可以告 訴MPlayer使用那個(gè)視角(默認(rèn)值: 1). 示例可以在下面找到.
?dvdauth <DVD設(shè)備>
(老式DVD選項(xiàng))打開(kāi)指定設(shè)備的DVD認(rèn)證.
?dvdkey <CSS密鑰>
(老式DVD選項(xiàng))當(dāng)解碼一個(gè)由DVD上復(fù)制的未解密的VOB文件時(shí), 用這個(gè)選項(xiàng)提供解碼VOB需要的CSS密鑰(密鑰在?dvdauth通過(guò)DVD設(shè)備認(rèn)證時(shí)會(huì)顯 示出來(lái)).
?dvdnav (BETA代碼!)
強(qiáng)行使用libdvdnav.
?forceidx
指定重新生成索引. 對(duì)索引損壞的文件(不同步等等)有用. 可以進(jìn)行收縮. 你能使用MEncoder永久性的修復(fù)索引(參見(jiàn)文檔).
?fps <參數(shù)>
替代幀速率(如果文件頭中沒(méi)有該參數(shù)/參數(shù)是錯(cuò)誤的)(浮點(diǎn)數(shù)).
?frames <參數(shù)>
只播放/轉(zhuǎn)換前<參數(shù)>幀, 然后退出.
?hr?mp3?seek (僅用于MP3)
高精度mp3搜索. 默認(rèn)為: 在播放外部MP3文件時(shí)啟用, 因?yàn)槲覀冃枰?索到非常精確的位置來(lái)保持A/V同步. 這種方法在后退搜索時(shí)特別 慢 ? 它需要繞回開(kāi)頭來(lái)找到準(zhǔn)確的幀.
?idx (參見(jiàn)?forceidx)
在沒(méi)有找到索引的情況下重建AVI文件的索引, 從而允許搜索. 對(duì)于損 壞的/不完整的下載, 或制作低劣的AVI.
?mc <每幀秒數(shù)>
每幀的最大A-V同步修正(以秒為單位).
?mf <選項(xiàng)1:選項(xiàng)2:...>
用來(lái)從多個(gè)PNG或JPEG文件解碼.
可用選項(xiàng)有:
on
打開(kāi)多文件支持
w=<參數(shù)>
輸出的寬度(自動(dòng)檢測(cè))
h=<參數(shù)>
輸出的高度(自動(dòng)檢測(cè))
fps=<參數(shù)>
輸出的幀速率(默認(rèn)值: 25)
type=<參數(shù)>
輸入文件的類型(可用類型: jpeg, png, tga,sgi)
?ni (僅用于AVI)
指定使用非交錯(cuò)的AVI分析器(用來(lái)處理某些質(zhì)量差的AVI文件的播放).
?nobps (僅用于AVI)
不使用平均比特率值來(lái)維持A?V同步(AVI). 對(duì)某些文件頭損壞的AVI文件 有幫助.
?noextbased
禁用基于后綴名的分路器選擇機(jī)制. 默認(rèn)情況下, 當(dāng)文件類型(分路器) 無(wú)法可靠檢測(cè)時(shí), (文件沒(méi)有頭部或者不夠可靠), 將使用后綴名來(lái)選擇分路器. 后備的基于內(nèi)容的分路器總是可用的.
?passwd <密碼> (參見(jiàn)?user選項(xiàng))
設(shè)置http認(rèn)證的密碼.
?rawaudio <選項(xiàng)1:選項(xiàng)2:...>
用這個(gè)選項(xiàng)你可以播放原始音頻文件. 也可以用來(lái)播放不是44KHz 16Bit立體聲的音頻CD.
可用選項(xiàng)有:
on
使用原始音頻分路器
channels=<參數(shù)>
聲道數(shù)
rate=<參數(shù)>
每秒采樣率
samplesize=<參數(shù)>
以字節(jié)為單位的樣本大小
format=<參數(shù)>
16進(jìn)制的fourcc
?rawvideo <選項(xiàng)1:選項(xiàng)2:...>
用這個(gè)選項(xiàng)你可以播放原始視頻文件.
可用選項(xiàng)有:
on
使用原始視頻分路器
fps=<參數(shù)>
每秒幀速率, 默認(rèn)值為25.0
sqcif|qcif|cif|4cif|pal|ntsc
設(shè)置默認(rèn)的圖像大小
w=<參數(shù)>
以像素為單位的圖像寬
h=<參數(shù)>
以像素為單位的圖像高
y420|yv12|yuy2|y8
設(shè)置色彩空間
format=<參數(shù)>
16進(jìn)制的色彩空間(fourcc)
size=<參數(shù)>
以字節(jié)為單位的幀大小
?rtsp-stream-over-tcp
與’rtsp://’URL一起用來(lái)指定最后結(jié)果輸入的RTP和RTCP的包通過(guò)TCP流, (跟RTSP使用同一個(gè)TCP連接 ). 這個(gè)選項(xiàng)可以用于當(dāng)你的Internet連接不允許UDP包進(jìn)入的情況. (參見(jiàn)http://www.live.com/mplayer/).
?skipopening
提過(guò)DVD打開(kāi)(僅用于dvdnav).
?sb <比特位置> (參見(jiàn)?ss選項(xiàng))
搜索到比特位置. 用于播放開(kāi)始部分是垃圾的CDROM鏡像/.VOB文件.
?srate <Hz>
指定音頻播放速, 視頻播放速度也會(huì)改變以保持a-v同步. MEncoder 會(huì) 把這個(gè)值傳給lame用于重新采樣.
?ss <時(shí)間> (參見(jiàn)?sb選項(xiàng))
搜索到指定的時(shí)間位置.
示例:
?ss 56
搜索到56秒處
?ss 01:10:00
搜索到1小時(shí)10分鐘處
?tv <選項(xiàng)1:選項(xiàng)2:...>
這個(gè)選項(xiàng)會(huì)啟用MPlayer的電視截取功能.
注意:
MPlayer 不 接受冒號(hào)所以在設(shè)備標(biāo)識(shí)中用逗號(hào)代替. (例如.用hw.0,0代 替hw:0,0).
雖然使用ALSA是你可以選擇任何采樣率, 但LAME音頻編碼器只能 對(duì)’ 標(biāo)準(zhǔn)’ 的采樣率進(jìn)行編碼. 如果你選擇一個(gè)奇怪的采樣率使用這個(gè)編碼器得到的.avi文件會(huì)沒(méi)有聲音.
可用選項(xiàng)有:
on
使用電視輸入
noaudio
沒(méi)有聲音
driver=<參數(shù)>
可用參數(shù): dummy, v4l, bsdbt848
device=<參數(shù)>
設(shè)定默認(rèn)的/dev/video0之外的設(shè)備
input=<參數(shù)>
設(shè)定默認(rèn)的0(電視)之外的輸入(參見(jiàn)輸出的列表)
freq=<參數(shù)>
設(shè)定電視調(diào)諧器的頻率(例如 511.250). 與頻道參數(shù)不兼容.
outfmt=<參數(shù)>
電視調(diào)諧器的輸出格式(yv12, rgb32, rgb24, rgb16, rgb15, uyvy, yuy2, i420)
width=<參數(shù)>
輸出窗口的寬度
height=<參數(shù)>
輸出窗口的高度
fps=<參數(shù)>
捕捉視頻的幀速率(幀每秒)
buffersize=<參數(shù)>
設(shè)定以兆為單位的捕捉緩沖區(qū)的大小(默認(rèn)值: 動(dòng)態(tài))
norm=<參數(shù)>
可用參數(shù): PAL, SECAM, NTSC
channel=<參數(shù)>
把電視調(diào)諧器設(shè)定到<參數(shù)>頻道.
chanlist=<參數(shù)>
可用參數(shù): europe-east, europe-west, us-bcast, us-cable, 等等
channels=<頻道>?<名稱>,<頻道>?<名稱>,...
設(shè)定頻道的名稱. 在名稱中用_代替空格(或者玩引號(hào) 游 戲. 頻 道 名 稱 會(huì)用OSD顯示, tv_step_channel, tv_set_channel 和tv_last_channel等命令將可以被遙控器(參見(jiàn)lirc)使用. 與頻率參數(shù)不兼容. 警告: 頻道編號(hào)將出現(xiàn)在’頻道’列表上, 從1 開(kāi)始. 示例: 使用tv://1,tv://2, tv_set_channel1, tv_set_channel 2等等.
[brightness|contrast|hue|saturation]=<?100?100>
設(shè)置顯卡的色彩均衡器.
audiorate=<參數(shù)>
設(shè)定音頻捕捉比特率
forceaudio
即使v4l報(bào)告沒(méi)有音頻源也捕捉音頻
alsa
從ALSA捕捉
amode=<0?3>
選擇音頻模式:
0: mono
1: stereo
2: language 1
3: language 2
forcechan=<1?2>
默認(rèn)情況下, 記錄音頻聲道數(shù)由電視卡檢察音頻模式自動(dòng)決定.這個(gè)選項(xiàng)允許指定立體聲/單聲道記錄而不管amode選項(xiàng)和v4l 返 回 的參數(shù). 在電視卡不能報(bào)告正確的音頻模式的時(shí)候可以用這個(gè)選項(xiàng)解決麻煩.
adevice=<參數(shù)>
設(shè)置音頻設(shè)備
/dev/...用于OSS
硬件標(biāo)識(shí)用于ALSA
audioid=<參數(shù)>
選擇捕捉卡的音頻輸出, 如果它有不止一個(gè)的話
[volume|bass|treble|balance]=<0?65535>
這些選項(xiàng)用來(lái)設(shè)定視頻捕捉卡上的混音器參數(shù). 如果你的卡 沒(méi) 有混音器, 它們將沒(méi)有效果.
immediatemode=<布爾值>
參數(shù)值為0表示同時(shí)捕捉和緩沖音頻和視頻(mencoder的默認(rèn)值). 參數(shù)值為1(mplayer的默認(rèn)值)表示只捕捉視頻而讓音頻通過(guò)通過(guò) 環(huán)路電纜由電視卡輸入聲卡.
mjpeg
使用硬件mjpeg壓縮(如果芯片支持的話). 當(dāng)使用這個(gè)選項(xiàng)的時(shí) 候, 你不需要設(shè)置輸出窗口的寬和高, mplayer會(huì)根據(jù)抽樣參數(shù)( 見(jiàn)下面)自動(dòng)確定.
decimation=<1,2,4>
選擇硬件mjpeg壓縮的圖像的尺寸:
1: 全尺寸 704x576PAL 704x480 NTSC
2: 中等尺寸 352x288PAL 352x240 NTSC
4: 小尺寸 176x144PAL 176x120 NTSC
quality=<0-100>
選擇jpeg壓縮的質(zhì)量
(全尺寸推薦使用quality< 60)
?user <用戶名> (參見(jiàn)?passwd選項(xiàng))
設(shè)定http認(rèn)證的用戶名.
://<音軌>
從設(shè)備或鏡像文件中播放video CD音軌(參見(jiàn)?cuefile).
?vid <標(biāo)識(shí)>
選擇視頻頻道[MPG: 0?15 ASF: 0?255].
?vivo <子選項(xiàng)> (調(diào)試代碼)
指定.vivo分路器的音頻參數(shù)(用于調(diào)試).
OSD/ 字幕選項(xiàng)
注意:
參見(jiàn)?vf expand.
?dumpmicrodvdsub (僅用于MPLAYER)
把給定的字幕文件(由?sub選項(xiàng)設(shè)置)轉(zhuǎn)換為MicroDVD字幕格式. 在當(dāng)前 目錄中創(chuàng)建一個(gè)dumpsub.sub文件.
?dumpmpsub (僅用于MPLAYER)
把給定的字幕文件(由?sub選項(xiàng)設(shè)置)轉(zhuǎn)換為MPlayer的字幕格式, MPsub. 在當(dāng)前目錄中創(chuàng)建一個(gè)dump.mpsub文件.
?dumpsrtsub (僅用于MPLAYER)
把給定的字幕文件(由?sub選項(xiàng)設(shè)置)轉(zhuǎn)換為基于時(shí)間的SubViewer(SRT)字幕格式. 在當(dāng)前目錄中創(chuàng)建一個(gè)dumpsub.srt文件.
?dumpjacosub (僅用于MPLAYER)
把給定的字幕文件(由?sub選項(xiàng)設(shè)置)轉(zhuǎn)換為基于時(shí)間的JACOsub字幕格式. 在當(dāng)前目錄中創(chuàng)建一個(gè)dumpsub.js文件.
?dumpsami (僅用于MPLAYER)
把給定的字幕文件(由?sub選項(xiàng)設(shè)置)轉(zhuǎn)換為基于時(shí)間的SAMI字幕格式. 在當(dāng)前目錄中創(chuàng)建一個(gè)dumpsub.smi文件.
?dumpsub (僅用于MPLAYER)(BETA代碼)
從VOB流中復(fù)制子字幕流. 參見(jiàn)-dump*sub和-vobsubout*選項(xiàng).
?ifo <vobsub的ifo文件>
設(shè)置用于讀取的包含VOBSUB字幕的調(diào)色板和幀尺寸的文件.
?ffactor <數(shù)字>
對(duì)字體的alpha映射圖重新采樣. 可設(shè)為:
0
普通白色字體
0.75
非常細(xì)的黑色邊框(默認(rèn)值)
1
細(xì)的黑色邊框
10
粗的黑色邊框
?font <font.desc文件的路徑>
在另外目錄你尋找OSD/SUB字體(默認(rèn)的普通字體為: ~/.mplayer/font/ font.desc, 默認(rèn)的FreeType字體為: ~/.mplayer/subfont.ttf).
注意:
對(duì)于FreeType, 這個(gè)選項(xiàng)指定文本字體文件的路徑.
?subfont-*選項(xiàng)只有當(dāng)編譯了FreeType支持才可用.
示例:
?font ~/.mplayer/arial?14/font.desc
?font ~/.mplayer/arialuni.ttf
?noautosub
關(guān)閉字幕文件的自動(dòng)載入功能.
?overlapsub
對(duì)所有字幕格式啟用重疊字幕支持.
?nooverlapsub
對(duì)所有字幕格式禁用重疊字幕支持(默認(rèn)行為是只對(duì)特定格式啟用支持).
?osdlevel <0?3> (僅用于MPLAYER)
設(shè)定開(kāi)始的OSD模式.
0
只有字幕
1
音量 + 搜索(默認(rèn))
2
音量 + 搜索 + 計(jì)時(shí)器 + 百分比
3
音量 + 搜索 + 計(jì)時(shí)器 + 百分比 + 總時(shí)間
?sid <標(biāo)識(shí)> (參見(jiàn)?slang選項(xiàng))
打開(kāi)DVD字幕顯示. 同時(shí), 你必須設(shè)置一個(gè)對(duì)應(yīng)于一種DVD字幕語(yǔ)言的數(shù)字(0?31). 至于可用字幕的列表, 可以加上?v選項(xiàng)并察看輸出.
?slang <兩個(gè)字母的國(guó)家代碼>(參見(jiàn)?sid選項(xiàng))
僅用于DVD播放. 打開(kāi)/選擇DVD字幕語(yǔ)言. 至于可用字幕的列表, 可以加上?v選項(xiàng)并察看輸出.
示例:
?slang hu,en
選擇匈牙利語(yǔ), 英語(yǔ)在沒(méi)有匈牙利語(yǔ)時(shí)備用.
?sub <字幕文件>
使用/顯示指定的字幕文件.
?sub-bg-alpha <0?255>
設(shè)置字幕和OSD背景的alpha通道值. 值越大代表越透明. 0是一個(gè)例外代表完全透明.
?sub-bg-color <0?255>
設(shè)置字幕和OSD背景的顏色值. 目前字幕是灰度圖像所以這個(gè)值相當(dāng)于顏色的亮度. 255代表白色0代表黑色.
?subcc 顯示DVD的隱藏字幕數(shù)據(jù)表(CC)字幕.
它們不是VOB字幕, 它們是為聽(tīng)力障礙的人準(zhǔn)備的特殊的ASCII字幕, 編碼在大多數(shù)區(qū)碼為1的VOB的用戶數(shù)據(jù)流中. CC字幕到目前為止還沒(méi)有在 別的區(qū)碼的DVD中發(fā)現(xiàn).
?subcp <編碼頁(yè)>
如果你的系統(tǒng)支持iconv(3), 你可以用這個(gè)選項(xiàng)來(lái)設(shè)置字幕文件的編 碼頁(yè).
示例:
?subcp latin2
?subcp cp1250
?sub?demuxer <數(shù)值> (BETA代碼)
指定?subfile的字幕分路器的類型.
?subdelay <參數(shù)>
字幕延遲<參數(shù)>秒. 可以是負(fù)數(shù).
?subfont-autoscale <0?3>
設(shè)置自動(dòng)縮放模式.
注意:
0表示text-scale和osd-scale的參數(shù)為以點(diǎn)為尺寸的字體高度.
可用模式有:
0
不自動(dòng)縮放
1
按電影高度縮放
2
按電影寬度縮放
3
按電影對(duì)角線縮放(默認(rèn)值)
?subfont-blur <0?8>
設(shè)置字體模糊半徑(默認(rèn)值: 2).
?subfont-encoding <參數(shù)>
設(shè)置字幕編碼. 當(dāng)設(shè)為’unicode’時(shí), 字體文件中的所有字模都會(huì)被渲染 并使用unicode編碼(默認(rèn)值: unicode).
?subfont-osd-scale <0?100>
設(shè)置osd元素的自動(dòng)縮放系數(shù)(默認(rèn)值: 6).
?subfont-outline <0?8>
設(shè)置字體邊框的寬度(默認(rèn)值: 2).
?subfont-text-scale <0?100>
設(shè)置字幕文本的自動(dòng)縮放系數(shù)(屏幕尺寸的百分比) (默認(rèn)值: 5).
?subfps <速率>
設(shè)置字幕文件的幀/秒速率(浮點(diǎn)數(shù)), 默認(rèn)值: 與電影同樣的fps.
注意:
僅用于基于幀的SUB文件, 比如不能用于MicroDVD格式.
?subfile <文件名> (BETA代碼)
目前沒(méi)有用. 與?audiofile一樣, 但用于字幕流(OggDS?).
?subpos <0?100> (用于?vf expand)
設(shè)置字幕在屏幕上顯示的位置. 參數(shù)表示字幕的垂直位置位于屏幕的 百分之多少.
?subalign <0?2>
設(shè)置字幕相對(duì)于subpos如何對(duì)齊. 0表示頂部對(duì)齊(最初的/默認(rèn)的行為), 1表示中央對(duì)齊, 而2標(biāo)識(shí)底部對(duì)齊.
?subwidth <10?100>
設(shè)置字幕在屏幕上顯示的最大寬度. 對(duì)于電視輸出有用. 參數(shù)表示字幕寬度占屏幕寬度的百分之多少.
?unicode
告訴MPlayer以UNICODE格式處理字幕.
?utf8
告訴MPlayer以UTF8格式處理字幕.
?sub-no-text-pp
禁用載入字幕后的任何形式的文字后期處理. 用于調(diào)試.
?vobsub <無(wú)后綴名的vobsub文件名>
設(shè)置用于字幕顯示的VobSub文件. 這是無(wú)后綴名的完整路徑名, 例如沒(méi) 有’.idx’,′.ifo’或者’.sub’.
?vobsubid <0-31>
設(shè)置VobSub字幕標(biāo)識(shí).
?spualign <-1?2>
設(shè)置spu(DVD/VobSub)字幕如何對(duì)齊. 參數(shù)值與-subpos相同, 特別的, -1表示在初始位置顯示.
?spuaa <模式>
設(shè)置DVD/VobSub的反鋸齒/縮放模式. 加上16可以在原始和縮放幀尺寸完全相同時(shí)強(qiáng)制進(jìn)行縮放, 比如使用高斯模糊來(lái)平滑字幕. 可用模式有:
0
不縮放(最快, 很丑)
1
近似縮放(好像壞了?)
2
完全縮放(慢)
3
二次線性縮放(默認(rèn)值, 快速而且效果不壞)
4
使用軟件縮放的高斯模糊(看起來(lái)很好)
?spugauss <0.0?3.0>
-spuaa 4使用的高斯模糊的可變參數(shù).越高表示越模糊. 默認(rèn)值為1.0.
音頻輸出選項(xiàng) ( 僅用于 MPLAYER)
?abs <參數(shù)> (已被放棄)
替代音頻驅(qū)動(dòng)/聲卡的緩沖區(qū)大小檢測(cè), 僅用于?ao oss
?af <濾鏡1[=選項(xiàng)],濾鏡2,...>
激活一個(gè)逗號(hào)分隔的帶參數(shù)的音頻濾鏡列表.
可用濾鏡有:
resample[=srate[:sloppy][:type]]
將音頻流的采樣率變?yōu)檎麛?shù)值srate(Hz). 它只支持16 bit低位在前格式.
channels[=nch]
將聲道變?yōu)閚ch個(gè)輸出聲道. 如果輸出聲道數(shù)比輸入聲道數(shù)多時(shí), 將插入空聲道(但在將單聲道混合為立體聲時(shí), 會(huì)把單聲道復(fù) 制 到兩個(gè)輸出聲道). 如果輸出聲道數(shù)比輸入聲道數(shù)少, 多余的聲 道會(huì)被去掉.
format[=bps,f]
選擇插件層輸出格式為f, 樣本比特率為bps. 選項(xiàng)bps是一個(gè)整 數(shù)表示每個(gè)樣本的字節(jié)數(shù). 格式f是下面幾個(gè)字符串的連接:
alaw, mulaw或imaadpcm
float或int
unsigned或signed
le或be(低位或高位在前)
volume[=v:sc]
選擇輸出音量級(jí)別.這個(gè)選項(xiàng)是不可重入的, 所以對(duì)每個(gè)音頻流只能使用一次.
v: 對(duì)流中所有聲道的增益, 以dB為單位. 增益可以從-200dB 到+40dB(-200dB 完全靜音completely而+40dB等于放大1000 倍).
sc: 啟用軟修飾.
pan[=n:l01:l02:..l10:l11:l12:...ln0:ln1:ln2:...]
任意混合聲道, 細(xì)節(jié)參見(jiàn)DOCS/sound.html.
n: 輸出聲道數(shù)(1 - 6).
lij: 輸出聲道i中混合多少輸入聲道j的成分.
sub[=fc:ch]
增加副低音聲道.
fc: 低通濾波器的剪除頻率(20Hzto 300Hz)默認(rèn)值為60Hz.
ch: 副聲道的聲道號(hào).
surround[=d]
矩陣編碼的環(huán)繞音效解碼器, 能用于許多2聲道文件.
d: 以毫秒為單位的后部揚(yáng)聲器的延遲時(shí)間(0ms到1000ms), 默認(rèn)值為15ms.
delay[=ch1:ch2:...]
延遲聲音的輸出. 以百萬(wàn)分之一秒為單位設(shè)置每個(gè)聲道的延遲(0到1000之間的浮點(diǎn)數(shù)).
?af-adv <force=(0?3):list=(filters)> (參見(jiàn)?af選項(xiàng))
設(shè)置高級(jí)音頻濾鏡選項(xiàng):
force=<0-3>
將插入音頻濾鏡的方式指定為下面之一:
0: 完全自動(dòng)插入濾鏡(默認(rèn))
1: 速度優(yōu)化
2: 精度優(yōu)化
3: 關(guān)閉自動(dòng)插入
list=<濾鏡>
與?af相同(參見(jiàn)?af選項(xiàng)).
?ao <驅(qū)動(dòng)1[:設(shè)備],驅(qū)動(dòng)2,...[,]>
設(shè)置可用的音頻輸出驅(qū)動(dòng)的優(yōu)先級(jí)列表(可以加上設(shè)備). ′設(shè)備’ 也 用 于SDL, 那里它表示子驅(qū)動(dòng).
注意:
要獲得完整的可用驅(qū)動(dòng)列表, 參考?ao help.
如果列表結(jié)尾有一個(gè)’,’ 它將可以使用沒(méi)有列出的驅(qū)動(dòng)作為后備.
示例
?ao oss:/dev/dsp2,oss:/dev/dsp1,
嘗試使用指定聲音設(shè)備的OSS而把其它設(shè)置作為后備
?ao sdl:esd
設(shè)置SDL的子驅(qū)動(dòng)
?aofile <文件名>
用于?ao pcm的文件.
?aop <list=插件1,插件2...:選項(xiàng)1=參數(shù)1:選項(xiàng)2=參數(shù)2...>
設(shè)置音頻插件和他們的選項(xiàng)(參見(jiàn)文檔).
可用選項(xiàng)有:
list=[插件]
逗號(hào)分隔的插件列表(resample, surround, format, volume, extrastereo, volnorm)
delay=<秒>
插件例子, 沒(méi)有用
format=<格式>
輸出格式(僅用于format插件)
fout=<Hz>
輸出頻率(僅用于resample插件)
volume=<0?255>
音量(僅用于volume插件)
mul=<參數(shù)>
立體聲系數(shù)(默認(rèn)值: 2.5)(僅用于extrastereo插件)
softclip
使用’軟修飾’壓縮功能(僅用于volume插件)
?delay <秒>
以秒為單位延遲音頻(可以是+/?浮點(diǎn)值).
?format <0?8192>
選擇濾鏡層使用的輸出格式 (依據(jù)libao2/afmt.h中的定義):
1
Mu-Law
2
A-Law
4
Ima-ADPCM
8
Signed 8-bit
16
Unsigned 8-bit
32
Unsigned 16-bit (低位優(yōu)先)
64
Unsigned 16-bit (高位優(yōu)先)
128
Signed 16-bit (低位優(yōu)先)
256
Signed 16-bit (高位優(yōu)先)
512
MPEG (2)音頻
1024
AC3
4096
Signed 32-bit (低位優(yōu)先)
8192
Signed 32-bit (高位優(yōu)先)
?mixer <設(shè)備>
這個(gè)選項(xiàng)讓MPlayer使用/dev/mixer之外的設(shè)備進(jìn)行混音.
?nowaveheader (僅用于-ao pcm)
不包括wave文件頭. 用于原始RAW PCM.
視頻輸出選項(xiàng) ( 僅用于 MPLAYER)
?aa* (僅用于?vo aa)
你可以運(yùn)行 mplayer ?aahelp 來(lái)獲得一份可用選項(xiàng)的解釋的列表.
?bpp <深度>
使用與自動(dòng)檢測(cè)結(jié)果不同的顏色深度. 不 是 所 有?vo 驅(qū)動(dòng)都支持它(fbdev, dga2, svga, vesa).
?brightness <?100?100>
調(diào)整視頻輸出的亮度(默認(rèn)值為0). 它改變視頻信號(hào)中RGB組份的亮度, 從黑到白.
?contrast <?100?100>
調(diào)整視頻輸出的對(duì)比度(默認(rèn)值為0). 工作方式與brightness差不多.
?dfbopts <參數(shù)> (僅用于?vo directfb2)
設(shè)置directfb驅(qū)動(dòng)的參數(shù)列表.
?display <name>
設(shè)置你希望使用的X server的hostname和display number.
示例:
?display xtest.localdomain:0
?double
啟用雙緩沖. 通過(guò)在內(nèi)存里儲(chǔ)存兩幀來(lái)解決閃爍問(wèn)題, 在顯示一幀的同時(shí)解碼另一幀. 會(huì)影響OSD. 需要單一緩沖方式兩倍的內(nèi)存. 所以不能 用于顯存很少的顯卡.
?dr
打開(kāi)直接渲染功能(不是所有的編解碼器和視頻輸出都支持)(默認(rèn)為關(guān)閉). 警告: 可能導(dǎo)致OSD/字幕損壞!
?dxr2 <選項(xiàng)1:選項(xiàng)2:...>
這個(gè)選項(xiàng)用來(lái)控制dxr2驅(qū)動(dòng). 注意: 現(xiàn)在當(dāng)你播放非MPEG1/2格式時(shí)lavc 濾鏡會(huì)自動(dòng)插入, 所以現(xiàn)在所有MPlayer支持的格式都可以播放(如果你有實(shí)時(shí)編碼所需要的CPU速度). dxr2的疊加芯片的質(zhì)量相當(dāng)差不過(guò)默認(rèn)設(shè)置應(yīng)該可以用于每一個(gè)人. OSD可能可以通過(guò)使用colorkey的繪制方法在疊加(不能用于TV)輸出中實(shí)現(xiàn). 使用默認(rèn)的colorkey設(shè)定你可能獲得各種效果, 一般情況下你可能看到colorkey環(huán)繞在字符周?chē)蛘咂渌尚Φ男Ч? 但只要你適當(dāng)?shù)恼{(diào)節(jié)colorkey的設(shè)定你應(yīng)該可以獲得可接受的效果.
ar-mode=<參數(shù)>
長(zhǎng)寬比模式(0 = 普通, 1 = pan scan模式, 2 = letterbox 模 式(默認(rèn)))
iec958?encoded/decoded
iec958輸出模式
mute
聲音輸出靜音
ucode=<參數(shù)>
microcode的路徑
TV Out
75ire
啟用7.5IRE
bw
黑白電視輸出
color
彩色電視輸出
interlaced
交錯(cuò)電視輸出
macrovision=<參數(shù)>
macrovision 模 式(0 = 關(guān)閉(默認(rèn)值), 1 = agc, 2 =agc 2 colorstripe, 3 = agc 4 colorstripe)
norm=<參數(shù)>
電視制式(ntsc(默認(rèn)),pal,pal60,palm,paln,palnc)
square/ccir601?pixel
電視像素模式
疊加
cr-[left|right|top|bot]=<?20?20>
調(diào)整疊加裁減
ck-[rgb]min=<0?255>
color key參數(shù)最小值
ck-[rgb]max=<0?255>
color key參數(shù)最大值
ck-[rgb]=<0?255>
color key參數(shù)
ignore?cache
不使用VGA緩存
ol-osd
啟用疊加模式的osd hack
ol[hwxy]?cor=<參數(shù)>
調(diào)整疊加尺寸和位置, 如果它跟窗口匹配不夠完美
overlay
啟用疊加
overlay-ratio=<1?2500>
調(diào)整疊加模式(默認(rèn)值為1000)
update?cache
重建VGA緩存
?fb <設(shè)備> (僅用于fbdev或者DirectFB)
設(shè)置使用的幀緩沖設(shè)備. 默認(rèn)為/dev/fb0.
?fbmode <模式名> (僅用于fbdev)
把視頻模式設(shè)為/etc/fb.modes中標(biāo)記為<模式名>的模式
注意:
VESA幀緩沖不支持改變顯示模式.
?fbmodeconfig <文件名> (僅用于fbdev)
使用這個(gè)配置文件取代默認(rèn)的/etc/fb.modes. 只對(duì)fbdev驅(qū)動(dòng)有效.
?forcexv (僅用于SDL)
指定使用XVideo.
?fs
全屏播放(電影顯示在中央, 四周填充黑色條邊). 用’f’鍵觸發(fā)( 不是所有的視頻輸出都支持它). 參見(jiàn)?zoom.
?fsmode-dontuse <0-31> (已放棄) (使用?fs選項(xiàng))
如果你還有全屏問(wèn)題試試這個(gè)選項(xiàng).
?fstype <type1,type2,...>
設(shè)置可用的全屏層設(shè)置模式的優(yōu)先級(jí)列表.
默認(rèn)的次序是"layer,stays_on_top,above,fullscreen". 如果設(shè)置的模式不正確或不支持會(huì)使用后備項(xiàng).
如果你遇到全屏窗口被別的窗口覆蓋的問(wèn)題試試設(shè)置不同的順序.
注意:
參考?fstype help列出的全部可用模式的列表.
?geometry x[%][:y[%]] or [WxH][+x+y]
調(diào)整屏幕輸出的初始位置. x和y代表從屏幕右上角到顯示圖像右上角的距離, 以像素為單位. 不過(guò)如果在參數(shù)后有百分號(hào)記號(hào)它將把參數(shù)理解為該方向上的屏幕尺寸比例. 它也支持標(biāo)準(zhǔn)的X ?geometry的標(biāo)準(zhǔn)選項(xiàng)格式. 參數(shù)必須為整數(shù).
注意: 這個(gè)選項(xiàng)只有一個(gè)vo支持: xv.
示例:
50:40
把窗口放在x=50, y=40處
50%:50%
把窗口放在屏幕中央
100%
把窗口放在屏幕左上角
100%:100%
把窗口放在屏幕左下角
?guiwid <窗口標(biāo)識(shí)>
這告訴GUI 也使用一個(gè)X11窗口并把自己粘到視頻窗口的下方, 在將一 個(gè)mini-GUI嵌入到瀏覽器時(shí)(比如mplayer插件)有用.
?hue <?100?100>
調(diào)整視頻信號(hào)的色相(默認(rèn): 0). 你可以通過(guò)這個(gè)選項(xiàng)得到負(fù)片效果的圖像.
?icelayer <0?15> (僅用于icewm)
設(shè)置icewm下mplayer的全屏窗口層.
0
Desktop
2
Below
4
Normal
6
OnTop
8
Dock
10
AboveDock
12
Menu (默認(rèn))
?jpeg <選項(xiàng)1:選項(xiàng)2:...> (僅用于?vo jpeg)
設(shè)置JPEG輸出的選項(xiàng).
可用選項(xiàng)有:
[no]progressive
設(shè)置標(biāo)準(zhǔn)的或漸進(jìn)的JPEG.
[no]baseline
設(shè)置是否使用基線.
optimize=<參數(shù)>
優(yōu)化因子[0-100]
smooth=<參數(shù)>
平滑因子[0-100]
quality=<參數(shù)>
質(zhì)量因子[0-100]
outdir=<參數(shù)>
保存JPEG文件的目錄
?monitor_dotclock <dotclock (or pixelclock) range> (僅用于fbdev和vesa)
察看etc/example.conf和DOCS/video.html來(lái)進(jìn)一步了解信息.
?monitor_hfreq <水平頻率范圍> (僅用于fbdev和vesa)
?monitor_vfreq <垂直頻率范圍> (僅用于fbdev和vesa)
?monitoraspect <長(zhǎng)寬比>
設(shè)置你的顯示器或電視屏幕的長(zhǎng)寬比, 參見(jiàn)用于電影長(zhǎng)寬比的?aspect選項(xiàng).
示例:
?monitoraspect 4:3或者1.3333
?monitoraspect 16:9或者1.7777
?nograbpointer
VidMode改變(?vm)后不截獲鼠標(biāo)焦點(diǎn), 用于多輸出頭設(shè)置.
?nokeepaspect
縮放X11 窗 口 時(shí) 不 保持窗口的長(zhǎng)寬比(只工作于?vo x11, xv, xmga 和xvidix而且你的窗口管理器必須理解window aspect hints.).
?noslices
禁用把視頻分隔成16像素高的條/帶繪制的方式, 而是一次繪制整個(gè) 幀. 可能更快或更慢, 取決于顯卡/緩存. 它只對(duì)libmpeg2和libavcodec編 解碼器有效.
?panscan <0.0?1.0>
啟用Pan & Scan功能, 也就是為了在4:3的顯示器上顯示16:9, 把電影的邊緣切掉來(lái)獲得4:3的, 與屏幕匹配的圖像的方法. 這個(gè)功能只能用 于xv, xmga, mga和xvidix視頻輸出驅(qū)動(dòng).
參數(shù)用來(lái)控制切掉多少圖像.
?rootwin
在根窗口(桌面背景)中播放電影而不是重新打開(kāi)一個(gè)新窗口. 只 能 用 于x11, xv,xmga和xvidix驅(qū)動(dòng).
?saturation <?100?100>
調(diào)整視頻輸出的飽和度(默認(rèn)值: 0). 你可以通過(guò)這個(gè)選項(xiàng)獲得灰度輸出.
?screenw <像素>?screenh <像素>
如果你使用的輸出驅(qū)動(dòng)無(wú)法獲得屏幕分辨率(fbdev/x11和/或者 TVout) ,你可以在這里設(shè)置水平和垂直分辨率.
?stop_xscreensaver
在啟動(dòng)是關(guān)閉xscreensaver在退出時(shí)再打開(kāi)它.
?vm
嘗試改變到更合適的視頻模式. dga, x11/xv (XF86VidMode)和sdl 輸出驅(qū)動(dòng)支持.
?vo <驅(qū)動(dòng)1[:設(shè)備],驅(qū)動(dòng)2,...[,]>
設(shè)置可用的視頻輸出驅(qū)動(dòng)的優(yōu)先級(jí)列表(可以加上設(shè)備). ′設(shè)備’ 也 用 于SDL和GGI, 那里它表示子驅(qū)動(dòng).
注意:
要獲得完整的可用驅(qū)動(dòng)列表, 參考?vo help.
如果列表結(jié)尾有一個(gè)’,’ 它將可以使用沒(méi)有列出的驅(qū)動(dòng)作為后備.
示例:
?vo xmga,xv,
先嘗試Matrox內(nèi)核驅(qū)動(dòng), 然后Xv驅(qū)動(dòng), 然后其它
?vo sdl:aalib
設(shè)置SDL子驅(qū)動(dòng)
?vsync
啟用vesa的VBI支持.
?wid <窗口標(biāo)識(shí)>
告訴MPlayer 使 用 一 個(gè)X11窗口, 在把MPlayer嵌入瀏覽器是有用(比 如plugger擴(kuò)展).
?xineramascreen <0?...>
在Xinerama配置時(shí),(就是一個(gè)單一桌面展開(kāi)在多個(gè)顯示器上),這個(gè) 選 項(xiàng)告訴MPlayer把電影顯示在哪個(gè)屏幕上.
?z <0?9>
設(shè)置PNG輸出的壓縮級(jí)別(僅用于?vo png)
0
不壓縮
9
最大壓縮
?zrbw (僅用于?vo zr)
黑白顯示(用于優(yōu)化性能, 這個(gè)選項(xiàng)可以跟屬于FFmpeg家族的編解碼器 的’黑白解碼’的選項(xiàng)聯(lián)合使用).
?zrcrop <[寬]x[高]+[x偏移]+[y偏移]> (僅用于?vo zr)
選擇顯示輸入圖像的一部分, 使用多個(gè)這樣的選項(xiàng)就啟動(dòng)了cinerama模式. 在cinerama模式下電影分布在多個(gè)電視(或投影儀)來(lái)創(chuàng)造一個(gè)更大的屏幕. 在第n個(gè)?zrcrop后面的選項(xiàng)應(yīng)用于第n個(gè)MJPEG解碼卡, 每一個(gè)編碼卡至少需要有一個(gè)?zrcrop選項(xiàng)加上一個(gè)?zrdev選項(xiàng). 察看?zrhelp 的輸出和文檔的Zr部分可以找到示例.
?zrdev <設(shè)備> (僅用于?vo zr)
設(shè)置你的MJPEG編碼卡使用的設(shè)備文件名, 默認(rèn)情況下這個(gè)驅(qū)動(dòng)將使用它找到的第一個(gè)v4l設(shè)備.
?zrfd (僅用于?vo zr)
指定使用簡(jiǎn)化取樣: 簡(jiǎn)化取樣由?zrhdec和?zrvdec設(shè)置, 一般只有在硬件縮放能把圖像延展到原始尺寸時(shí)才使用. 使用這個(gè)選項(xiàng)指定使用簡(jiǎn) 化取樣.
?zrhelp (僅用于?vo zr)
顯示所有?zr*選項(xiàng)列表, 他們的默認(rèn)值和使用cinerama模式的例子.
?zrnorm <制式> (僅用于?vo zr)
設(shè)置制式為PAL/NTSC, 默認(rèn)值為’不改變’
?zrquality <1?20> (僅用于?vo zr)
從1到20的數(shù)值代表jpeg編碼質(zhì)量. 1的質(zhì)量最好而20的質(zhì)量非常差.
?zrvdec <1,2,4> ?zrhdec <1,2,4> (僅用于?vo zr)
垂直/水平簡(jiǎn)化取樣: 驅(qū)動(dòng)只會(huì)把輸入圖像的每2或4行/點(diǎn)發(fā)送到MJPEG編碼卡, 而使用MJPEG卡的縮放器把圖像回復(fù)到原有尺寸.
?zrxdoff <x顯示位移>,?zrydoff <y顯示位移> (僅用于?vo zr)
如果電影比電視屏幕小, 這些選項(xiàng)控制電影相對(duì)于屏幕左上角的顯示 位置. 默認(rèn)情況下電影放在中央位置.
解碼 / 濾鏡選項(xiàng)
?ac <[-]編解碼器1,[-]編解碼器2,...[,]>
設(shè)置可用編解碼器的優(yōu)先級(jí)列表, 按照它們?cè)赾odecs.conf中的編解碼器名稱. 在名稱前加’-’表示忽略該編解碼器.
注意:
全部可用編解碼器的完整列表參見(jiàn)?ac help的輸出.
如果列表結(jié)尾有一個(gè)’,’ 將可以使用沒(méi)有列出的編解碼器作為后備.
示例:
?ac mp3acm
指定使用l3codeca.acm MP3編解碼器
?ac mad,
先嘗試libmad, 其它作為后備
?ac hwac3,a52,
先嘗試硬件AC3輸出, 然后是軟件AC3編解碼器, 最后是其它
?ac -ffmp3,
嘗試除了FFmpeg的MP3解碼器之外的所有解碼器
?afm <驅(qū)動(dòng)1,驅(qū)動(dòng)2,...>
設(shè)置可用的音頻驅(qū)動(dòng)優(yōu)先級(jí)列表, 按照它們?cè)赾odecs.conf中的驅(qū)動(dòng)名稱. 當(dāng)都不可用是使用默認(rèn)后備驅(qū)動(dòng).
注意:
全部可用編解碼器的完整列表參見(jiàn)?afm help的輸出.
示例:
?afm ffmpeg
先嘗試FFmpeg的libavcodec(mp1/2/3)編解碼器
?afm acm,dshow
先嘗試Win32編解碼器
?aspect <比率>
設(shè)置電影的長(zhǎng)寬比. MPEG文件會(huì)自動(dòng)檢測(cè), 但大多數(shù)AVI文件不會(huì).
示例:
?aspect 4:3或?aspect1.3333
?aspect 16:9或?aspect1.7777
?flip
上下翻轉(zhuǎn)圖像.
?lavdopts <選項(xiàng)1:選項(xiàng)2:...> (調(diào)試代碼)
如果使用libavcodec解碼, 你可以在這里設(shè)置參數(shù).
示例:
?lavdopts bug=1
注意:
只要加上你想要啟用的項(xiàng)目的參數(shù)即可.
可用選項(xiàng)有:
ec
錯(cuò)誤隱藏:
1: 對(duì)損壞的MB使用強(qiáng)柔化馬賽克濾鏡
2: MV重復(fù)搜索(很慢)
3: 所有(默認(rèn))
er=<參數(shù)>
錯(cuò)誤恢復(fù):
0: 禁用
1: 小心 (用于損壞的編碼器)
2: 正常 (默認(rèn)) (用于正常的編碼器)
3: 擴(kuò)張性的 (更多檢查但可能即使對(duì)有效比特流也導(dǎo)致問(wèn)題)
4: 非常擴(kuò)張性的
bug=<參數(shù)>
手工繞過(guò)編碼器bug:
0: 無(wú)
1: 自動(dòng)檢測(cè)bugs (默認(rèn))
2 (msmpeg4v3): 由老式lavc生成的msmpeg4v3文件(不自動(dòng)檢測(cè))
4 (mpeg4): xvid交錯(cuò)bug(如果fourcc==XVIX會(huì)自動(dòng)檢測(cè))
8 (mpeg4): UMP4(如果fourcc==UMP4會(huì)自動(dòng)檢測(cè))
16 (mpeg4): padding bug(自動(dòng)檢測(cè))
32 (mpeg4): 非法vlc bug(每個(gè)fourcc都自動(dòng)檢測(cè))
64 (mpeg4): XVID和DIVX qpel的bug(每個(gè)fourcc/版本都自動(dòng)檢測(cè))
128 (mpeg4): 老的標(biāo)準(zhǔn)的qpel(每個(gè)fourcc/版本都自動(dòng)檢測(cè))
256 (mpeg4): 另一個(gè)qpel的bug(每個(gè)fourcc/版本都自動(dòng)檢測(cè))
512 (mpeg4): direct-qpel-blocksize的bug(每個(gè)fourcc/ 版本都自動(dòng)檢測(cè))
1024 (mpeg4): edge padding的bug(每個(gè)fourcc/版本都自動(dòng)檢測(cè))
idct=<0?99>
(參見(jiàn)lavcopts) 想要最好的解碼質(zhì)量應(yīng)該在編碼和解碼時(shí)使用相同的idct算法. 不過(guò)這可能會(huì)犧牲一些精確性.
gray
只解碼灰度圖像(比彩色解碼快一點(diǎn))
?noaspect
禁用電影長(zhǎng)寬比自動(dòng)嘗試.
?nosound
不播放/編碼聲音.
?pp <質(zhì)量> (參見(jiàn)?vf pp選項(xiàng)!)
設(shè)置DLL的后期處理級(jí)別. 這個(gè)選項(xiàng)不能用于MPlayer的后期處理濾鏡, 但可以用于有內(nèi)部后期處理例程的Win32 DirectShow DLL.
?pp的參數(shù)范圍依編解碼器不同,大部分為0?6, 0=禁用 6=最慢/最好.
?pphelp (參見(jiàn)?vf pp選項(xiàng))
列出可用后期處理濾鏡和他們的使用方法簡(jiǎn)介.
?ssf <mode>
設(shè)置SwScaler參數(shù).
示例
?vf scale ?ssf lgb=3.0
lgb=<0?100>
高斯模糊濾鏡(亮度)
cgb=<0?100>
高斯模糊濾鏡(色度)
ls=<0?100>
銳化濾鏡(亮度)
cs=<0?100>
銳化濾鏡(色度)
chs=<h>
水平色度偏移
cvs=<v>
垂直色度偏移
?stereo <模式>
選擇MP2/MP3立體聲輸出模式.
0
立體聲
1
左聲道
2
右聲道
?sws <軟件縮放類型> (參見(jiàn)?vf scale選項(xiàng))
這個(gè)選項(xiàng)用來(lái)設(shè)置?zoom選項(xiàng)使用的軟件縮放的質(zhì)量(還有速度, 相 對(duì) 的). 用于x11或其它沒(méi)有硬件加速的視頻輸出. 可用選項(xiàng)有:
注意:
對(duì)于?sws 2和7, 可以用?vf scale的縮放參數(shù)(p)來(lái)設(shè)置銳化(0(柔化) ? 100(銳化)), 對(duì)于?sws 9, 這個(gè)參數(shù)設(shè)置濾鏡長(zhǎng)度參數(shù)(1 ? 10).
0
快速二次線性(默認(rèn))
1
二次線性
2
二次立方(質(zhì)量很好)
3
實(shí)驗(yàn)中
4
最短距離 (bad quality)
5
區(qū)域
6
亮度二次立方/色度二次線性
7
高斯
8
sincR
9
lanczos
10
雙三次樣條曲線
?vc <[-]編解碼器1,[-]編解碼器2,...[,]>
設(shè)置可用編解碼器的優(yōu)先級(jí)列表, 按照它們?cè)赾odecs.conf中的編解碼器名稱. 在名稱前加’-’表示忽略該編解碼器.
注意:
全部可用編解碼器的完整列表參見(jiàn)?vc help的輸出.
如果列表結(jié)尾有一個(gè)’,’ 將可以使用沒(méi)有列出的編解碼器作為后備.
示例:
?vc divx
指定使用Win32/VFW DivX編解碼器, 沒(méi)有后備
?vc divx4,
先嘗試divx4linux編解碼器, 然后使用后備
?vc -divxds,-divx,
嘗試除了Win32 DivX編解碼器之外的編解碼器
?vc ffmpeg12,mpeg12,
嘗試libavcodec的MPEG1/2編解碼器, 然后嘗試libmpeg2, 然后其它
?vf <...,濾鏡3[=選項(xiàng)],濾鏡2,濾鏡1>
激活一個(gè)反序排列的逗號(hào)分隔的視頻插件和它們的參數(shù)的列表.
注意:
參數(shù)是可選的, 當(dāng)被省略時(shí), 有些會(huì)設(shè)為默認(rèn)值. 使用’-1’保持默認(rèn)值. 參數(shù)w:h標(biāo)識(shí)寬度x高度, 以點(diǎn)為單位, x:y表示相當(dāng)圖像左上角x;y 的位置.
全部可用插件的完整列表參見(jiàn)?vf help的輸出.
可用插件有:
crop[=w:h:y]
切割圖像的指定部分其余丟棄. 用于去掉寬銀幕電影的黑邊.
w,h: 切割部分的寬和高, 默認(rèn)值為原始的寬度和高度.
x,y: 切割部分的位置, 默認(rèn)值是中央.
cropdetect[=0?255]
計(jì)算必要的切割參數(shù)并把推薦值顯示在標(biāo)準(zhǔn)輸出上. 極限值 的 設(shè)置可以從無(wú)(0)到所有(255).(默認(rèn)值: 24)
rectangle[=w:h:y]
在圖像的指定坐標(biāo)出繪制一個(gè)指定寬度和高度的矩形(用來(lái)實(shí) 驗(yàn)crop的參數(shù)).
w,h: 寬度和高度(默認(rèn)值: -1, 保證邊界仍然可見(jiàn)的最大可能 寬度).
x,y: 左上角坐標(biāo)(默認(rèn)值: -1, 最左最上)
這個(gè)插件會(huì)響應(yīng)input.conf中的’change_rectangle’指令, 需 要兩個(gè)參數(shù). 第一個(gè)參數(shù)可以是0表示w, 1表示h, 2表示x或者3 表示y. 第二個(gè)參數(shù)標(biāo)識(shí)每次改變目標(biāo)矩形邊界的點(diǎn)數(shù).
expand[=w:h:y]
把電影的分辨率擴(kuò)展(不縮放)到指定的值并把原始圖像放在坐標(biāo)x, y處. 可以用獲得的黑帶顯示字幕/OSD.
w,h: 擴(kuò)展后的寬度, 高度(默認(rèn)值: 原始的寬度, 高度)
x,y: 擴(kuò)展后的圖像中原始圖像的位置(默認(rèn)值: 中央)
o: OSD/字幕渲染 0: 禁用(默認(rèn)值) 1: 啟用
w和h的負(fù)參數(shù)視為相對(duì)原始尺寸的偏移, 例 如expand=0:-50:0:0在圖像底部增加50個(gè)像素的邊界.
flip
上下翻轉(zhuǎn)圖像. 參見(jiàn)?flip選項(xiàng).
mirror
沿Y軸鏡像圖像.
rotate[=<0-7>]
+/? 90度的旋轉(zhuǎn)并翻轉(zhuǎn)(可選)圖像. 參數(shù)為4-7之間的旋轉(zhuǎn)只有 當(dāng)電影的形狀是縱向而不是橫向時(shí).
scale[=w:h[:c[:p]]]
使用軟件縮放(很慢)來(lái)縮放圖像并進(jìn)行YUV<?>RGB色彩空間轉(zhuǎn)換( 參見(jiàn)?sws參數(shù)).
w,h: 縮放后的新寬度/高度(默認(rèn)值: 原始的寬度, 高度) 注意: 如果使用了?zoom, 而后繼的濾鏡(包括libvo)不支持縮放, 那么它的默認(rèn)值為d_width/d_height!-1: 原始的width/height 0: 縮放后的d_width/d_height-2: 用另外尺度和預(yù)放大的長(zhǎng)寬比計(jì)算w/h. -3: 用另外尺度和原始的長(zhǎng)寬比計(jì)算w/h.
c: 色度抽樣 0: 使用所有可用的輸入行的色度 1: 使用每2個(gè)輸入行的色度 2: 使用每4個(gè)輸入行的色度 3: 使用每8個(gè)輸入行的色度
p: 縮放參數(shù)(取決于所用的縮放模式) 對(duì)于-sws 2(二次立方)這表示銳化(0 (柔化) - 100 ( 銳 化)) 對(duì)于-sws 7(線性)這表示銳化(0(柔化) - 100(銳化)) 對(duì)于-sws 9(lanczos)這表示濾鏡長(zhǎng)度(1 - 10) 0表示(按長(zhǎng)寬比)縮放的目標(biāo)w/h. (默認(rèn)值: 原始w/h, 與?zoom同時(shí) 使 用表示目標(biāo)w/h), 可選用色度采樣(c從0到3)和設(shè)置縮放參數(shù). (細(xì)節(jié)參見(jiàn)?sws選項(xiàng))
yuy2
指定使用YV12/I420或422P到Y(jié)UY2的軟件轉(zhuǎn)換. 用于當(dāng)顯卡/ 驅(qū) 動(dòng)顯示YV12速度慢而YUY2速度快的情況.
yvu9
指定使用YVU9到Y(jié)V12的軟件轉(zhuǎn)換. 不管軟件縮放的設(shè)置.
rgb2bgr[=swap]
RGB 24/32 <?> BGR 24/32色彩空間轉(zhuǎn)換.
swap: 同時(shí)進(jìn)行R<?> B互換.
palette
使用調(diào)色板進(jìn)行RGB/BGR 8 ?> 15/16/24/32bpp色彩空間轉(zhuǎn)換.
format[=fourcc]
限制下一個(gè)插件使用的色彩空間而不進(jìn)行任何轉(zhuǎn)換. 與scale插件一起用于一次真實(shí)轉(zhuǎn)換.
fourcc: 類似rgb15,bgr24, yv12等等的格式(默認(rèn)值: yuy2)
pp[=濾鏡1[:選項(xiàng)1[:選項(xiàng)2...]]/[-]濾鏡...]
這個(gè)選項(xiàng)開(kāi)啟MPlayer的內(nèi)部后期處理濾鏡的使用, 同時(shí)提供一個(gè)你可以向有名字的濾鏡傳送選項(xiàng)的接口. 可用濾鏡的列表 參 見(jiàn)?pphelp的輸出.
注意每一個(gè)子濾鏡都必須用一個(gè)/記號(hào)分隔.
所有濾鏡默認(rèn)作用于’c’(色度).
在選項(xiàng)后面可以加上一個(gè)’:’和一個(gè)字母表示它的作用范圍:
a: 如果CPU太慢則自動(dòng)關(guān)閉濾鏡.
c: 同時(shí)進(jìn)行色度處理.
y: 不進(jìn)行色度處理(只進(jìn)行亮度處理).
示例:
?vf pp=hb/vb/dr/al/lb
?vf pp=hb/vb/dr/al
使用除了亮度/對(duì)比度修正之外的默認(rèn)濾鏡:
?vf pp=de/?al
使用默認(rèn)濾鏡和時(shí)間噪音消除:
?vf pp=de/tn:1:2:3
僅對(duì)亮度柔化馬賽克并根據(jù)CPU可用時(shí)間打開(kāi)或關(guān)閉垂直柔化 馬賽克:
?vf pp=hb:y/vb:a ?autoq 6
test
產(chǎn)生各種設(shè)置樣式.
lavc[=quality:fps]
用于DVB/DXR3的通過(guò)libavcodec進(jìn)行YV12到MPEG1的快速轉(zhuǎn)換. 比?vf=fame速度更快質(zhì)量更好.
quality: 1 ? 31 固定qscale 32 ?固定比特率, 以kBits為單位
fps: 指定輸出幀速率(浮點(diǎn)數(shù)) (默認(rèn)值: 0, 基于高度的自動(dòng)檢測(cè))
fame
用于DVB/DXR3的YV12到MPEG1的快速轉(zhuǎn)換.
dvbscale[=aspect]
使用DVB卡的最佳縮放, X軸以硬件縮放而Y軸用軟件縮放以保 持 長(zhǎng)寬比.
aspect: 控制長(zhǎng)寬比, 按DVB_HEIGHT*ASPECTRATIO計(jì)算(默認(rèn)值: 576*4/3=768), 對(duì) 于16:9 的電視把它設(shè)置為576*(16/9)=1024.
只應(yīng)該與expand+scale 一 起 使 用: ?vflavc,expand=-1:576:-1:-1:1,scale=-1:0,dvbscale
noise[=亮度[u][t|a][h][p]:色度[u][t|a][h][p]]
增加噪音.
<0?100>: 亮度噪音
<0?100>: 色度噪音
u: 均衡噪音 (否則使用高斯算法)
t: 時(shí)間噪音 (噪音樣式隨幀改變)
a: 平均隨機(jī)噪音 (更平滑, 有點(diǎn)慢)
h: 高質(zhì)量 (看起來(lái)稍為好些, 有點(diǎn)慢)
p: 在一個(gè)(半)規(guī)則樣式中混入隨機(jī)噪音
denoise3d[=亮度:色度:時(shí)間]
這個(gè)濾鏡的目標(biāo)是降低圖像噪音生成平滑圖像并讓靜止圖像真正靜止, (這有利于壓縮). 它可以加0到3個(gè)參數(shù). 如果你省略一 個(gè)參數(shù), 將猜測(cè)一個(gè)合理的值.
亮度:
空間亮度濃度 (默認(rèn)值 = 4)
chroma:
空間色度濃度 (默認(rèn)值 = 3)
time:
時(shí)間強(qiáng)度 (默認(rèn)值 = 6)
hqdn3d[=luma:chroma:time]
高精度/質(zhì)量的denoise3d濾鏡. 參數(shù)和使用方法相同.
eq[=亮度:對(duì)比度]
像硬件均衡器一樣可以交互控制的軟件均衡器, 用于不支持硬件 亮度對(duì)比度控制的顯卡/驅(qū)動(dòng). 也可以用于MEncoder, 修復(fù)捕捉質(zhì)量差的電影, 或者略微降低對(duì)比度來(lái)掩蓋加工痕跡或獲得較低 的比特率. 初始值可以由命令行給出, 范圍在-100 ? 100之間.
eq2[=gamma:對(duì)比度:亮度:色相:rg:gg:bg]
另一個(gè)使用查表的軟件均衡器(非常慢), 在簡(jiǎn)單的亮度, 對(duì)比度 和色相調(diào)整之外還支持gamma修正. 注意當(dāng)所有g(shù)amma值都為1.0 時(shí), 它使用與?vf eq一樣的MMX優(yōu)化代碼. 參數(shù)以浮點(diǎn)值給 定. 參數(shù)rg, gg, bg 是紅, 綠, 蘭組份的獨(dú)立gamma值. 默認(rèn)值 為1.0, 亮度=0.0. gamma的取值范圍是0.1?10,對(duì)比度是-2?2( 負(fù)數(shù)產(chǎn)生負(fù)片效果), 亮度是-1?1而色度為0?3.
halfpack[=f]
把 4:2:0的planar YUV轉(zhuǎn)換為4:2:2高度減半的packed格式, 降低 亮度采樣率但保持所有色度樣本. 用于輸出到硬件縮放質(zhì)量 差或不可用的低分辨率顯示設(shè)備. 也可以作為一個(gè)cpu消耗很低的簡(jiǎn)單的僅用于亮度的交錯(cuò)/逐行掃描轉(zhuǎn)換器. 默認(rèn)情況下, halfpack在降低采樣率的時(shí)候去兩行的平均值. 可選的參數(shù)f可 以是0表示只使用偶數(shù)行, 或者1表示只使用奇數(shù)行.
dint[=sense:level]
檢測(cè)并丟棄視頻流中的隔行掃描的幀. 參數(shù)取 值 范 圍 從0.0 到1.0 - 第一個(gè)(默認(rèn)值 0.1)表示相鄰點(diǎn)的相對(duì)差別, 第二個(gè)( 默認(rèn)值 0.15)表示檢測(cè)圖像的哪一部分來(lái)決定是否把幀作為隔行掃描丟棄.
lavcdeint
使用libavcodec的隔行/逐行掃描轉(zhuǎn)換濾鏡.
unsharp=l|cWxH:amount[:l|cWxH:amount]
反銳化掩飾/高斯模糊.
l: 應(yīng)用到亮度組份.
c: 應(yīng)用到色度組份.
WxH: 矩 陣的寬度和高度, 兩個(gè)方向都必須是奇數(shù) (最小 = 3x3, 最大 = 13x11或者11x13, 一般在3x3到7x7之間)
amount: 加到圖像上的銳化/模糊的相對(duì)量 (正常范 圍 應(yīng) 該 是-1.5 ? 1.5).<0: 模糊 >0: 銳化
swapuv
交換U & V平面.
il=[d|i][s][:[d|i][s]]
交錯(cuò)/逐行轉(zhuǎn)換. 這個(gè)濾鏡的目標(biāo)是分區(qū)處理交錯(cuò)圖像而不進(jìn)行逐行轉(zhuǎn)換. 你可以用它處理你的交錯(cuò)圖像的DVD, 不必交錯(cuò)圖像就可以在電視上播放它. 當(dāng)逐行處理(用后期處理濾鏡)會(huì)永久 破壞交錯(cuò)圖像(用平滑, 平均等等), 逐行處理會(huì)把幀分成兩塊( 成 為半圖像), 所以你需要分別進(jìn)行(處理)他們?nèi)缓蟀阉鼈冎匦陆诲e(cuò).
d: 逐行
i: 隔行
s: 交換域(交換偶數(shù)&奇數(shù)行)
field[=n]
使用步進(jìn)算法解壓交錯(cuò)圖像中的單獨(dú)域從而避免浪費(fèi)CPU 時(shí) 間. 可選參數(shù)n設(shè)置解壓偶數(shù)域還是奇數(shù)域(取決于n是偶數(shù)還是奇 數(shù)).
detc[=變量1=參數(shù)1:變量2=參數(shù)2:...]
嘗試反轉(zhuǎn)"telecine"過(guò)程生成一個(gè)電影幀速率的干凈的非交錯(cuò)的 視頻流. 這個(gè)濾鏡還在試驗(yàn)階段但似乎可用. 你必須明白如果你看電影的時(shí)候沒(méi)有交錯(cuò)現(xiàn)象, 這個(gè)濾鏡絕對(duì)沒(méi)有用. 下面的參數(shù)(參考上面的語(yǔ)法)可以用來(lái)控制它的行為:
dr: 設(shè)置掉幀模式. 0(默認(rèn))表示不掉幀以保持固定的輸出幀 速率. 1表示總是如果前5幀沒(méi)有掉幀或telecine合并 就 掉1 幀. 2 表 示總是保持準(zhǔn)確的5:4的輸入輸出幀比率. (注意: MEncoder使用1!)
am: 分析模式. 可用參數(shù)有0(使用fr=#設(shè)置的初始幀數(shù)的固定樣式), 和1(擴(kuò)張性搜索telecine樣式).默認(rèn)值為1.
fr: 設(shè)置初始幀數(shù)序列. 0-2是三個(gè)干凈的漸進(jìn)幀; 3和4是兩個(gè)交錯(cuò)幀. 默認(rèn)值, -1, 表示"不在telecine序列中". 這 里 設(shè)置的數(shù)字是假想的電影開(kāi)始前的幀數(shù).
tr0, tr1, tr2, tr3: 特定模式的初始值.
telecine[=開(kāi)始]
使用3:2的"telecine"過(guò)程增加幀速率20%. mplayer的這個(gè)功能 應(yīng)該不能正常工作, 不過(guò)它可以 用 于’mencoder-fps 29.97 -ofps 29.97 -vf telecine’. 兩個(gè)fps選項(xiàng)都是必需的! (如 果錯(cuò)誤將導(dǎo)致A/V不同步). 可選的開(kāi)始參數(shù)告訴濾鏡telecine格式從哪里開(kāi)始(0-3).
tfields[=模式]
臨時(shí)域分離 -- 把域分成幀, 輸出幀速率加倍. 0模式時(shí), 濾鏡保持域不變, 輸出結(jié)果高度減半. 1模式時(shí), 圖像的交錯(cuò)部分將 被 改 寫(xiě) 重 新 構(gòu) 成 完 整高度的幀. 跟telecine濾鏡一樣,"tfields"只有用mencoder, 并且只有-fps和-ofps都設(shè)置成需要的(加倍)的幀速率時(shí)才能正常工作!
boxblur=半徑:強(qiáng)度[:半徑:強(qiáng)度]
盒子模糊
半徑: 濾鏡大小
強(qiáng)度: 濾鏡應(yīng)用的強(qiáng)度
sab=半徑:強(qiáng)度:色差[:半徑:強(qiáng)度:色差]
外形識(shí)別模糊
半徑: 模糊濾鏡強(qiáng)度(~0.1?4.0)(越大越慢)
強(qiáng)度: 預(yù)過(guò)濾強(qiáng)度(~0.1?2.0)
色差: 可以容忍的像素差別.(~0.1-100.0)
smartblur=半徑:強(qiáng)度:閥值[:半徑:強(qiáng)度:閥值]
只能模糊
半徑: 模糊濾鏡強(qiáng)度(~0.1?5.0)(越大越慢)
強(qiáng)度: 模糊(0.0?1.0)或銳化(-1.0?0.0)
閥值: 過(guò)濾全部(0), 過(guò)濾單調(diào)區(qū)域(0?30)或過(guò)濾邊界(-30?0)
perspective=x0:y0:x1:y1:x2:y2:x3:y3:t
形狀修正
x0,y0,...: 左上, 右上, 左下, 右下坐標(biāo)
t: 線性(0)或立方(1)重新采樣
2xsai
使用雙倍放大插入算符放大并平滑圖像.
1bpp
1bpp位圖到Y(jié)UV/BGR8/15/16/32轉(zhuǎn)換
down3dright[=行數(shù)]
重新配置縮放立體圖像. 解壓兩個(gè)立體域并把它們放在 一起, 重新縮放以維持原始電影長(zhǎng)寬比.
行數(shù): 從圖像中部選擇的行數(shù)(默認(rèn)值: 12)
bmovl=隱藏:不透明:<命名管道>
從一個(gè)命名管道讀取位圖并把它們顯示在窗口中.
隱藏: 設(shè)置’隱藏’標(biāo)記的默認(rèn)值(布爾值)
不透明: 切換alphablended(透明)和不透明(快速)模式標(biāo)記
命名管道: 命名管道的路徑/文件名(連接mplayer -vf bmovl 和控制程序的命名管道)
命名管道命令有:
RGBA32 width height xpos ypos alpha clear
接受width*height*4字節(jié)的原始RGBA32數(shù)據(jù)
ABGR32 width height xpos ypos alpha clear
接受width*height*4字節(jié)的原始ABGR32data.
RGB24 width height xpos ypos alpha clear
接受width*height*3字節(jié)的原始RGB32data.
BGR24 width height xpos ypos alpha clear
接受width*height*3字節(jié)的原始BGR32data.
ALPHA width height xpos ypos alpha
改變區(qū)域的alpha值
CLEAR width height xpos ypos
清除數(shù)據(jù)
OPAQUE
禁用所有alpha透明發(fā)送"ALPHA 0 0 00 0"可以重新打開(kāi) 它.
HIDE
隱藏位圖
SHOW
顯示位圖
參數(shù)有:
width, height: 圖像/區(qū)域尺寸
xpos, ypos: 位圖傳送的X/Y位置
alpha: 設(shè)置alpha差別. 0標(biāo)識(shí)原始值, 255使所有都不透明, -255使所有都透明. 如果你把它設(shè)為-255, 你可以隨后發(fā) 送 一 個(gè)ALPHA命令序列吧區(qū)域設(shè)置為-225, -200, -175等等來(lái)獲 得一個(gè)漂亮的淡入效果!
clear: 傳送前清楚幀緩沖. 1表示清除, 如果是0, 圖像會(huì)被傳送到老圖像上, 所以你不需要每次為屏幕小部分的變化都發(fā) 送1,8MB的RGBA32數(shù)據(jù).
?vfm <驅(qū)動(dòng)1,驅(qū)動(dòng)2,...>
設(shè)置可用的視頻驅(qū)動(dòng)優(yōu)先級(jí)列表, 按照它們?cè)赾odecs.conf中的驅(qū)動(dòng)名稱. 當(dāng)都不可用是使用默認(rèn)后備驅(qū)動(dòng).
注意:
如果編譯了libdivxdecore支持,則odivx和divx4會(huì)包含同一個(gè)DivX4編解 碼器, 但用不同的API調(diào)用它. 他們的區(qū)別和什么情況下應(yīng)該使用哪一個(gè), 參考文檔的DivX4部分.
全部可用編解碼器的完整列表參見(jiàn)?vfm help的輸出.
示例:
?vfm ffmpeg,dshow,vfw
先嘗試libavcodec, 然后是Directshow,然后是VFW, 如果都不 行就使用其它后備編解碼器.
?vfm xanim
先嘗試XAnim編解碼器
?x <x> (僅用于MPLAYER)
把圖像縮放到寬度x(如果軟件/硬件縮放可用). 禁用長(zhǎng)寬比計(jì)算.
?xvidopts <選項(xiàng)1:選項(xiàng)2:...>
設(shè)置使用XviD解碼時(shí)的附加參數(shù).
dr2
激活直接渲染模式2.
nodr2
關(guān)閉直接渲染模式2.
?xy <x>
x<=8
按因子<x>縮放圖像.
x>8
把圖像寬度設(shè)為<x>并計(jì)算圖像高度以保持長(zhǎng)寬比.
?y <y> (僅用于MPLAYER)
把圖像縮放到高度y(如果軟件/硬件縮放可用). 禁用長(zhǎng)寬比 計(jì) 算..TP ?zoom 在可能的情況下使用軟件縮放. 可以用來(lái)指定?vf scale進(jìn)行縮放.
注意:
如果沒(méi)有?zoom選項(xiàng)?vf scale將忽略?x / ?y / ?xy / ?fs / ?aspect等 選項(xiàng).
編碼選項(xiàng) ( 僅用于 MENCODER)
?audio-density <1?50>
每秒的音頻塊數(shù)(默認(rèn)是兩個(gè)0.5秒的長(zhǎng)音頻塊).
注意:
僅用于CBR, VBR將忽略它因?yàn)樗衙總€(gè)包放在一個(gè)新塊中.
?audio-delay <0.0?...>
設(shè)置文件頭中的音頻延遲域. 默認(rèn)值為0.0, 負(fù)數(shù)不能正常工作. 這不 是在編碼的時(shí)候延遲音頻, 而是播放器會(huì)把它作為默認(rèn)的音頻延遲, 你 可以不必用?delay選項(xiàng).
?audio-preload <0.0?2.0>
設(shè)置音頻緩沖間隔(默認(rèn)值: 0.5秒).
?divx4opts <選項(xiàng)1:選項(xiàng)2:...>
當(dāng)用DivX4編碼時(shí), 你可以由此設(shè)置參數(shù).
可用選項(xiàng)有:
help
獲得幫助
br=<參數(shù)>
設(shè)置比特率以
kbit<4?16000>或者
bit<16001?24000000>為單位
key=<參數(shù)>
最大關(guān)鍵幀間隔(以幀為單位)
deinterlace
啟用逐行掃描(別用它, DivX4很buggy)
q=<1?5>
質(zhì)量(1?最快, 5?最好)
min_quant=<1?31>
最小量化值
max_quant=<1?31>
最大量化值
rc_period=<參數(shù)>
速率控制周期
rc_reaction_period=<參數(shù)>
速率控制反應(yīng)周期
rc_reaction_ratio=<參數(shù)>
速率控制反應(yīng)率
crispness=<0?100>
設(shè)置生硬/平滑
pass=<1?2>
用這個(gè)選項(xiàng)你可以編碼2 pass的DivX4文件. 先用pass=1編碼, 然后以同樣的參數(shù), 用pass=2編碼.
vbrpass=<0?2>
代替pass參數(shù)并使用XviD VBR代替DivX4 VBR. 可用選.
?
?
使用GPU加速H.264編碼分析
繼前面的“GPGPU”和“CUDA和OpenCL”的簡(jiǎn)介后,接下來(lái)分析一個(gè)具體的使用案例:是否可以用GPU搭建一個(gè)高性能的H.264編解碼服務(wù)器?
設(shè)想一個(gè)簡(jiǎn)單的需求:
?
ffmpeg完成此項(xiàng)工作的大概過(guò)程是:
“過(guò)程1”應(yīng)該是一個(gè)輕量操作,且對(duì)于現(xiàn)有視頻格式速度應(yīng)該很快(播放器看片的時(shí)候不可能先等上幾秒分析一把格式再開(kāi)始播放吧?)。
“過(guò)程2”需要把原有的視頻編碼解碼并轉(zhuǎn)為ffmpeg內(nèi)部使用的格式,速度會(huì)比上第一步慢不少,但是應(yīng)該也是可以接受的。當(dāng)然在碼率比較高的情況下也會(huì)非常緩慢(在Pentium4時(shí)代的機(jī)器上看1080p的高清視頻很卡)。
“過(guò)程3”是需要對(duì)每一幀進(jìn)行處理,那么這步是可高度并行化的應(yīng)該可以放到GPU進(jìn)行。
“過(guò)程4”一定是最慢的一個(gè)環(huán)節(jié):H.264需要將圖像分割成很多個(gè)宏塊, 然后利用視頻幀圖像的幀內(nèi)和幀間的相關(guān)性, 采用幀內(nèi)預(yù)測(cè)或幀間預(yù)測(cè)的編碼模式, 對(duì)各個(gè)宏塊進(jìn)行壓縮。然后形成幀,組成為碼流。整個(gè)過(guò)程復(fù)雜,但宏塊兒的處理是可以高度并行化的操作,應(yīng)該可以放到GPU進(jìn)行。
“過(guò)程5”和“過(guò)程1”類似。
所以如果想用GPU加速以上的過(guò)程,那么把“過(guò)程4”和“過(guò)程2”的密集計(jì)算從CPU上轉(zhuǎn)到GPU上,應(yīng)該是可能的發(fā)力點(diǎn)。
如果要設(shè)計(jì)這個(gè)系統(tǒng),軟件自底層到上層有幾點(diǎn)需要考慮:
關(guān)鍵在于在程序里如何更好的調(diào)用CUDA:
- 每個(gè)線程進(jìn)行一個(gè)視頻的轉(zhuǎn)換,每個(gè)線程在其線程內(nèi)部直接使用CUDA;
- 有單獨(dú)的CUDA線程,其他線程當(dāng)需要時(shí)通知此線程進(jìn)行運(yùn)算;
- 每個(gè)進(jìn)程進(jìn)行一個(gè)視頻的轉(zhuǎn)換,在其進(jìn)程內(nèi)部各自獨(dú)立的使用CUDA;
- 有單獨(dú)的GPU進(jìn)程,其他進(jìn)程當(dāng)需要進(jìn)行GPU運(yùn)算的時(shí)IPC通知此進(jìn)程進(jìn)行;
在我看來(lái),2-1的方式是最簡(jiǎn)單直接的,可以直接基于ffmpeg來(lái)實(shí)現(xiàn),只需單把可并行化的部分從CPU移到GPU。但是CUDA 4.0是否支持這樣做?這樣做效率是否最高?
硬件配置上也有以下的問(wèn)題:
最后這件事情最難的一點(diǎn)在于:需要對(duì)CUDA、ffmpeg、H.264、硬件都有相當(dāng)深入的了解才能做好這樣的一個(gè)系統(tǒng)。
分析H.264在ADSP-BF561上的實(shí)現(xiàn)及優(yōu)化
隨著互聯(lián)網(wǎng)在全球范圍逐漸普及,移動(dòng)通信飛速發(fā)展,網(wǎng)絡(luò)傳輸以及各種各樣的多媒體業(yè)務(wù)的出現(xiàn),對(duì)視頻編解碼技術(shù)更是提出了許多新的要求。如何提供更加優(yōu)秀的視頻傳輸成為信息科學(xué)與技術(shù)的研究熱點(diǎn)。
H.264/AVC是由國(guó)際電信聯(lián)"A盟(ITU—rn的視頻編碼專家組ⅣCEG)與國(guó)際標(biāo)準(zhǔn)化組織(ISO/IEC)的運(yùn)動(dòng)圖像專家組(MPEG)聯(lián)合提出的最新一代的視頻編碼標(biāo)準(zhǔn)。是目前圖像通信研究領(lǐng)域的熱點(diǎn)技術(shù)之一。其主要思想仍是采用基于塊的混合編碼方法,在同等壓縮質(zhì)量情況下,編碼效率大約為MPEG-4標(biāo)準(zhǔn)的二倍。它提供了移動(dòng)環(huán)境中包丟失和比特誤碼的恢復(fù)工具,視頻編碼層和網(wǎng)絡(luò)適配層的分層結(jié)構(gòu)提高了網(wǎng)絡(luò)友好性。但是 H.264運(yùn)算復(fù)雜度很高,在實(shí)時(shí)視頻編解碼實(shí)現(xiàn)中面臨著巨大的挑戰(zhàn)。ADSP—BF561是ADI公司推出的高性能多媒體處理器,它具有兩個(gè)處理核心,最高時(shí)鐘頻率達(dá)到600MHz,其內(nèi)部采用哈佛總線結(jié)構(gòu),存儲(chǔ)模型層次化,可以滿足實(shí)時(shí)編解碼算法的需求。本文提出了一套采用ADSP-BF561芯片實(shí)現(xiàn)H.264視頻壓縮算法的設(shè)計(jì)方案,結(jié)合該DSP平臺(tái)對(duì)算法進(jìn)行了針對(duì)性的優(yōu)化,充分發(fā)揮了ADSP-BF561強(qiáng)大的處理能力。
1 算法介紹
1.1 H.264編碼模型框架
H.264以其高壓縮比、高圖像質(zhì)量和良好的網(wǎng)絡(luò)親和性廣受業(yè)界歡迎。在同等質(zhì)量條件下,H.264的數(shù)據(jù)壓縮比比MPEG-2高2~3倍,比MPEG-4高1.5~2倍。其需要的帶寬只有MPEG-4的50%, MPEG-2的12.5%。
H.264標(biāo)準(zhǔn)采用分層體系結(jié)構(gòu),系統(tǒng)分為:視頻編碼層VCL(VideoCoding Layer),負(fù)責(zé)高效的數(shù)字視頻壓縮;網(wǎng)絡(luò)抽象層NAL(Network Abstraction Layer),負(fù)責(zé)對(duì)數(shù)據(jù)進(jìn)行打包和傳送。H.264編碼圖像通常分為三種類型:I幀、P幀、B幀。I幀為幀內(nèi)編碼幀,其編碼不依賴于已編碼的圖像數(shù)據(jù)。 P幀為前向預(yù)測(cè)幀,B幀為雙向預(yù)測(cè)幀,編碼時(shí)都需要根據(jù)參考幀進(jìn)行運(yùn)動(dòng)估計(jì)。同時(shí),H.264在提高圖像傳輸容錯(cuò)性方面做了大量工作,重新定義了適于圖像的結(jié)構(gòu)劃分。在編碼時(shí),圖像幀各部分被劃分到多個(gè)Slice結(jié)構(gòu)中,每個(gè)Slice都可以被獨(dú)立編碼,不受其他部分影響。Slice由圖像最基本的結(jié)構(gòu) ——宏塊組成,每個(gè)宏塊包含一個(gè)16×16的亮度塊和兩個(gè)8×8的色度塊。H.264標(biāo)準(zhǔn)的整體編碼框圖如圖1所示。編碼過(guò)程中,原始數(shù)據(jù)進(jìn)入編碼器后, 當(dāng)采用幀內(nèi)編碼時(shí),首先選擇相應(yīng)的幀內(nèi)預(yù)測(cè)模式進(jìn)行幀內(nèi)預(yù)測(cè),隨后對(duì)實(shí)際值和預(yù)測(cè)值之間的差值進(jìn)行變換、量化和嫡編碼,同時(shí)編碼后的碼流經(jīng)過(guò)反量化和反變換之后重構(gòu)預(yù)測(cè)殘差圖像,再與預(yù)測(cè)值相加得出重構(gòu)幀,得出的結(jié)果經(jīng)過(guò)去塊濾波器平滑后送入幀存儲(chǔ)器。采用幀間編碼時(shí),輸入的圖像塊首先在參考幀中進(jìn)行運(yùn)動(dòng)估計(jì),得到運(yùn)動(dòng)矢量。運(yùn)動(dòng)估計(jì)后的殘差圖像經(jīng)整數(shù)變換、量化和嫡編碼后與運(yùn)動(dòng)矢量一起送入信道傳輸。同時(shí)另一路碼流以相同的方式重構(gòu)后,經(jīng)去塊濾波后送入幀存儲(chǔ)器作為下一幀編碼的參考圖像。
1.2H.264關(guān)鍵技術(shù)
1.2.1 幀內(nèi)預(yù)測(cè)
H.264引入了幀內(nèi)預(yù)測(cè)以提高壓縮效率。幀內(nèi)預(yù)測(cè)編碼就是利用周?chē)徑南袼刂祦?lái)預(yù)測(cè)當(dāng)前的像素值,然后對(duì)預(yù)測(cè)誤差進(jìn)行編碼。這種預(yù)測(cè)是基于塊的。對(duì)于亮度分量,塊的大小可以在16×16和4×4之間選擇,16×16有4種預(yù)測(cè)模式,4×4有9種預(yù)測(cè)模式;對(duì)于色度分量,預(yù)測(cè)是對(duì)整個(gè)8×8塊 進(jìn)行的,有4種預(yù)測(cè)模式。
1.2.2幀間預(yù)測(cè)
幀間預(yù)測(cè)時(shí)所用塊的大小可變。假設(shè)基于塊的運(yùn)動(dòng)模型,其塊內(nèi)的所有像素都做了相同的平移,在運(yùn)動(dòng)比較劇烈或者運(yùn)動(dòng)物體的邊緣外,這一假設(shè)會(huì)與實(shí) 際出入較大,從而導(dǎo)致較大的預(yù)測(cè)誤差,這時(shí)減小塊的大小可以使假設(shè)在小塊中依然成立。另外小塊所造成的塊效應(yīng)相對(duì)也小,因此,小塊可以提高預(yù)測(cè)的效果。 H.264一共采用了7種方式對(duì)一個(gè)宏塊進(jìn)行分割,每種方式下塊的大小和形狀都不相同,編碼器可以根據(jù)圖像的內(nèi)容選擇最好的預(yù)測(cè)模式。與僅使用16x16 塊進(jìn)行預(yù)測(cè)相比,使用不同大小和形狀的塊可以使碼率節(jié)約15%以上。
同時(shí),幀內(nèi)預(yù)測(cè)采用了更精細(xì)的預(yù)測(cè)精度,H.264中亮度分量的運(yùn)動(dòng)矢量使用1/4像素精度。色度分量的運(yùn)動(dòng)矢量使用1/8像素精度。
1.2.3多幀參考
H.264支持多幀參考預(yù)測(cè),最多可以有5個(gè)在當(dāng)前幀之前的解碼幀作為參考幀產(chǎn)生對(duì)當(dāng)前幀的預(yù)測(cè),提高H.264解碼器的錯(cuò)誤恢復(fù)能力。
1.2.4整數(shù)變換
H.264對(duì)殘差圖像的4×4整數(shù)變換技術(shù),采用定點(diǎn)運(yùn)算來(lái)代替以往DCT變換中的浮點(diǎn)運(yùn)算。以降低編碼時(shí)間,同時(shí)也更適合硬件平臺(tái)的移植。
1.2.5熵編碼
H.264支持兩種熵編碼方法,即CAVLC(基于上下文的自適應(yīng)可變長(zhǎng)編碼)和CABAC(基于上下文的自適應(yīng)算術(shù)編碼)。其中CAVLC的抗差錯(cuò)能力比較高,但編碼效率比CABAC低;而CABAC的編碼效率強(qiáng),但需要的計(jì)算量和存儲(chǔ)容量更大。
1.2.6去方塊濾波
去方塊濾波的作用是消除經(jīng)反量化和反變換后重建圖像中由于預(yù)測(cè)誤差產(chǎn)生的塊效應(yīng),從而改善圖像的主觀質(zhì)量和預(yù)測(cè)誤差。經(jīng)過(guò)濾波后的圖像將根據(jù)需 要放在緩存中用于幀間預(yù)測(cè),而不是僅僅用來(lái)改善主觀質(zhì)量,因此該濾波器位于解碼環(huán)中。對(duì)于幀內(nèi)預(yù)測(cè),使用的是未經(jīng)過(guò)濾波的重建圖像。
2 算法實(shí)現(xiàn)
2.1 平臺(tái)選擇
2.1.1 ADSP-BF561芯片介紹
ADSP-BF561是Blackfin系列中的一款高性能定點(diǎn)DSP視頻處理芯片。其主頻最高可達(dá)750 MHz,內(nèi)核包含2個(gè)16位乘法器MAC、2個(gè)40位累加器ALU、4個(gè)8位視頻ALU,以及1個(gè)40位移位器。該芯片中的兩套數(shù)據(jù)地址產(chǎn)生器(DAG) 可為同時(shí)從存儲(chǔ)器存取雙操作數(shù)提供地址,每秒可處理1 200兆次乘加運(yùn)算。芯片帶有專用的視頻信號(hào)處理指令以及100KB的片內(nèi)L1存儲(chǔ)器(16 KB的指令Cache,16 KB的指令SRAM,64 KB的數(shù)據(jù)Cache/SRAM,4KB的臨時(shí)數(shù)據(jù)SRAM)、128 KB的片內(nèi)L2存儲(chǔ)器SRAM,同時(shí)具有動(dòng)態(tài)電源管理功能。此外,Blackfin處理器還包括豐富的外設(shè)接口,包括EBIU接口(4個(gè)128 MB SDRAM接口,4個(gè)1 MB異步存儲(chǔ)器接口)、3個(gè)定時(shí)/計(jì)數(shù)器、1個(gè)UART、1個(gè)SPI接口、2個(gè)同步串行接口和1路并行外設(shè)接口(支持ITU-656數(shù)據(jù)格式)等。Blackfin處理器在結(jié)構(gòu)上充分體現(xiàn)了對(duì)媒體應(yīng)用(特別是視頻應(yīng)用)算法的支持。
2.1.2 ADSP-561 EZkite
ADSP-BF561視頻編碼器平臺(tái)采用ADI公司的ADSP-BF561 EZ-kit Lite評(píng)估板。此評(píng)估板包括1塊ADSP-BF561處理器、32MB SDRAM和4 MBFlash,板中的AD-V1836音頻編解碼器可外接4輸入/6輸出音頻接口;而ADV7183視頻解碼器和ADV7171視頻編碼器則可外接3輸入/3輸出視頻接口。此外,該評(píng)估板還包括1個(gè)UART接口、1個(gè)USB調(diào)試接口和1個(gè)JTAG調(diào)試接口。攝像頭輸入的模擬視頻信號(hào)經(jīng)視頻芯片ADV7183A轉(zhuǎn)化為數(shù)字信號(hào),此信號(hào)從ADSP-BF561的PPI1(并行外部接口)進(jìn)入ADSP-BF561芯片進(jìn)行壓縮,壓縮后的碼流則經(jīng)ADV7179轉(zhuǎn)換后從ADSP-BF561的PPI2口輸出。此系統(tǒng)可通過(guò)FLASH加載程序,并支持串口及網(wǎng)絡(luò)傳輸。編碼過(guò)程中的原始圖像、參考幀等數(shù)據(jù)可存儲(chǔ)在SDRAM中。
2.2 算法選取與優(yōu)化方案
2.2.1 算法選取
H.264實(shí)現(xiàn)的源代碼不止一種,其中最常見(jiàn)的有JM、X264和T264。對(duì)比這三種實(shí)現(xiàn)源代碼,X264比T264具有更高的效率。而且相比廣泛采用的JM編碼模型,X264在兼顧編碼質(zhì)量的同時(shí)大幅度地提升了編碼速度,所以選取X264作為算法原型。
2.2.2 優(yōu)化方案
該優(yōu)化方案從三個(gè)層次對(duì)算法進(jìn)行優(yōu)化:算法層次、代碼層次、平臺(tái)層次。下面介紹具體優(yōu)化方法。
2.2.2.1編碼器具體參數(shù)的選擇
該編碼器使用main檔次,I、B、P幀量化值分別為26、31、29,流控參數(shù)選為CBR。IDR幀間隔設(shè)為50,B幀間隔為2幀。這樣的選擇是為了在速度和運(yùn)算量上取折中。選用B幀并將其量化值加大,可比baseline檔次、IPPP結(jié)構(gòu)提高約10%的壓縮率。而B(niǎo)幀的計(jì)算量,因其不用做參考幀,故無(wú)需進(jìn)行去塊濾波和插值計(jì)算,在31的qp下,很多塊會(huì)被判做skip模式編碼,因而多數(shù)時(shí)B幀總運(yùn)算量候反而較P幀低。
2.2.2.2 算法層次的優(yōu)化
算法層次的優(yōu)化主要是指在參數(shù)選定的情況下,對(duì)部分算法所作的替換或優(yōu)化。和參數(shù)的選擇一樣,算法層次優(yōu)化也主要受優(yōu)化策略的指導(dǎo)。如運(yùn)動(dòng)匹配 準(zhǔn)則是選用SSD、SAD或SATD。如果只看中準(zhǔn)確程度,則選擇SSD最佳;如果只看中運(yùn)行速度,則選擇SAD最佳;如果要兼顧二者,則選用SATD是 比較好的一個(gè)方案。在進(jìn)行算法優(yōu)化時(shí)還應(yīng)該注意一個(gè)問(wèn)題,即要考慮實(shí)際運(yùn)行平臺(tái)的支持情況。如在追求速度的策略下,匹配準(zhǔn)則選用SAD,如果只計(jì)算一半的 點(diǎn)則會(huì)大大降低運(yùn)算速度。但是如果考慮ADSP-BF561匯編指令的設(shè)計(jì)情況,就會(huì)發(fā)現(xiàn)這樣做反而會(huì)增加指令數(shù),會(huì)使速度更低。算法層次優(yōu)化包括如下幾個(gè)部分:
(1)除法求余。改進(jìn)策略是浮點(diǎn)型算法盡量改為整型,64位盡量改為32位,32位盡量改為16位。而對(duì)于某些計(jì)算比較多的,則改為查表計(jì)算。在ADSP-BF561平臺(tái)上,一次32位整形除法需耗時(shí)300個(gè)CYCLE,而查表僅需幾個(gè)CYCLE,這樣的改進(jìn)能顯著提高速度。
(2)飽和函數(shù)。在視頻的計(jì)算中,幾乎每次像素的計(jì)算都會(huì)調(diào)用飽和函數(shù),X264代碼的實(shí)現(xiàn)中已將這部分代碼改為查表函數(shù),在其他的編解碼器實(shí) 現(xiàn)中也有將這部分改為一個(gè)判斷和幾個(gè)邏輯運(yùn)算的形式。對(duì)大部分DSP平臺(tái),采用判斷跳轉(zhuǎn)會(huì)打斷流水線,即使平臺(tái)有比較好的跳轉(zhuǎn)預(yù)測(cè)功能,打斷流水仍然會(huì)造 成stall。所以查表方法是一種高效方法。而在ADSP-BF561匯編指令中,可以通過(guò)設(shè)置指令后綴或使用某些特殊指令來(lái)進(jìn)行飽和工作。甚至不用查表,在不同的場(chǎng)合使用不同的飽和算法能大大提高代碼的執(zhí)行效率。
(3)MC部分函數(shù)。實(shí)測(cè)中發(fā)現(xiàn)MC部分函數(shù)運(yùn)行效率不如ffmpeg解碼器中MC部分效率高,所以將這部分代碼用ffmpeg中的相應(yīng)部分替換。此外qpel16_hv函數(shù)中計(jì)算有冗余,減少這些冗余能提高代碼運(yùn)行效率。
(4)算法替代和改進(jìn)。幀間預(yù)測(cè)的改進(jìn):關(guān)于算法的改進(jìn)主要集中在對(duì)me(motion estimation)的改進(jìn)上,流程如圖2所示。 costmin1=min(cost16,cost8,cost16×8,cost8×16),costmin2=min(costmin1,costsub), 依次在16×16、8×8、16×8和8×16大小宏塊的整像素位置做預(yù)測(cè),再做次像素估計(jì)和幀內(nèi)預(yù)測(cè),選用匹配準(zhǔn)則函數(shù)(采用sad作為匹配準(zhǔn)則函數(shù)) 取得最小值的模式進(jìn)行編碼。每計(jì)算一種模式,都將sad值與一個(gè)經(jīng)驗(yàn)閥值做比較。當(dāng)sad值小于這個(gè)閥值時(shí),立即結(jié)束運(yùn)動(dòng)估計(jì),從而減少運(yùn)算量。
幀內(nèi)預(yù)測(cè)的改進(jìn):H.264標(biāo)準(zhǔn)所采用的幀內(nèi)預(yù)測(cè)模式除了DC模式都具有方向性,相鄰4×4塊都具有相關(guān)性。根據(jù)這樣的相關(guān)性,只將當(dāng)前4×4 塊上邊和左邊選用預(yù)測(cè)模式及其相鄰的兩種預(yù)測(cè)模式作為當(dāng)前4×4塊的預(yù)測(cè)模式,當(dāng)其閥值都大于一個(gè)經(jīng)驗(yàn)閥值時(shí),才采用DC模式。這樣的方案不用一一計(jì)算9 種預(yù)測(cè)模式,在復(fù)雜度、編碼效率、質(zhì)量和速度上取了一個(gè)折中。流程如圖3所示。
2.2.2.3代碼層次優(yōu)化
針對(duì)ADSP-BF561平臺(tái),代碼層次的優(yōu)化工作包括以下幾個(gè)方面:
(1)內(nèi)聯(lián)函數(shù)。將經(jīng)常調(diào)用的函數(shù)體較小的函數(shù)改為內(nèi)聯(lián)。編譯條件中有關(guān)于內(nèi)聯(lián)函數(shù)優(yōu)化的選項(xiàng)。內(nèi)聯(lián)函數(shù)的使用是將代碼的大小和運(yùn)行效率取一個(gè)折中。根據(jù)實(shí)際情況,代碼的大小并非限制條件,所以應(yīng)盡可能多地使用內(nèi)聯(lián)函數(shù)。在項(xiàng)目配置中選中when declaredinline選項(xiàng)。
(2)跳轉(zhuǎn)預(yù)測(cè)。ADSP-BF561采用了靜態(tài)預(yù)測(cè)的方式來(lái)預(yù)測(cè)有條件判斷情況,預(yù)測(cè)不成功會(huì)造成4~8個(gè)內(nèi)核時(shí)鐘(CCLK)的延誤。如果事先知道某些跳轉(zhuǎn)的概率,將可能性最大的分支放在最前面,可以從概率上降低預(yù)測(cè)不成功而造成的stall。
(3)使用硬件支持循環(huán)。對(duì)于大部分平臺(tái),將一些循環(huán)體小的循環(huán)展開(kāi)也能提高效率。ADSP-BF561有兩組硬件計(jì)數(shù)器用以支持循環(huán)。所以除非是展開(kāi)三層以上的循環(huán),否則,展開(kāi)循環(huán)體不能提高效率。
(4)內(nèi)存。嵌入式系統(tǒng)的內(nèi)存是非常寶貴的資源。避免頻繁的動(dòng)態(tài)申請(qǐng)和釋放內(nèi)存,能減少碎片產(chǎn)生,提高內(nèi)存的利用率。X264工程也不會(huì)頻繁地申請(qǐng)釋放內(nèi)存。在項(xiàng)目中,具體做法是編寫(xiě)平臺(tái)相關(guān)的malloc和free函數(shù)。將經(jīng)常使用的中間數(shù)據(jù)在L1數(shù)據(jù)空間中分配。
(5)注釋不需要代碼。去掉代碼中不需要的部分,主要會(huì)去掉CAVLC以及部分碼率控制、csp、cpu、信息統(tǒng)計(jì)、調(diào)試和psnr計(jì)算等部分代碼,這樣做的目的是為了減小文件大小和去除代碼中的一些跳轉(zhuǎn)。不建議刪除代碼,可以使用注釋符或用宏切換的方式,以防止以后參數(shù)改變時(shí)需要使用未使用過(guò) 的代碼。
2.2.2.4平臺(tái)層次優(yōu)化
ADSP-BF561相應(yīng)的編程參考和硬件參考對(duì)其平臺(tái)特性有詳細(xì)介紹。一些平臺(tái)自帶的優(yōu)化功能,如CACHE的開(kāi)啟和配置等不專門(mén)在此討論。
(1)匯編代碼編寫(xiě)
使用匯編優(yōu)化有兩個(gè)方法:對(duì)于LEAF函數(shù)(函數(shù)體中不再調(diào)用其余函數(shù)),采用整個(gè)函數(shù)完全用匯編指令重寫(xiě)的方式;而對(duì)于NONLEAF函數(shù)則 可使用asm關(guān)鍵字,在C代碼中嵌入?yún)R編代碼。在匯編代碼的編寫(xiě)過(guò)程中一些情況會(huì)造成流水線stall,在編寫(xiě)匯編代碼時(shí)要特別注意避免這些情況。IDE 集成了PIPLELINE VIEWER工具,如圖4所示。在編寫(xiě)完成匯編代碼后,可使用該工具觀察運(yùn)行時(shí)流水線的情況。如果有stall等出現(xiàn),會(huì)給出原因,優(yōu)化人員根據(jù)工具分析結(jié)果重新更改代碼,提高執(zhí)行效率。
ADI公司提供的IDE具有非常靈活的設(shè)置,能根據(jù)用戶的需要生成針對(duì)不同限制的代碼。如內(nèi)存有限,用戶可以設(shè)置生成文件更小的代碼;如果用戶更注重運(yùn)行速度,則設(shè)置編譯器生成運(yùn)行速度更快的代碼,或是在其間取一個(gè)折中。
ADSP-BF561有專門(mén)用于處理視頻相關(guān)的一些專用DSP指令(videopixel operations、vector operations等),這些專用指令通過(guò)SIMD技術(shù)或者操作專門(mén)硬件支持某些特殊運(yùn)算(累加、多參數(shù)取均值,同時(shí)完成加減法等),以提高運(yùn)行速度。 如前文求SAD情況,匯編指令中有指令專門(mén)計(jì)算連續(xù)4個(gè)像素與另外連續(xù)4個(gè)像素之差的絕對(duì)值之和,結(jié)果與累加器的值相加。如果要隔點(diǎn)算(即取一半的點(diǎn)計(jì) 算),反而需要增加指令后對(duì)數(shù)據(jù)進(jìn)行下采樣,既耗時(shí)而且不準(zhǔn)確。所以采用計(jì)算一半像素點(diǎn)的策略并不適用于ADSP-BF561。編譯器自動(dòng)生成的代碼中不 會(huì)使用到這些專用指令。所以只能根據(jù)對(duì)算法的理解和對(duì)平臺(tái)的熟悉程度來(lái)對(duì)算法進(jìn)行匯編優(yōu)化。
在編寫(xiě)匯編代碼時(shí)還需注意部分寄存器的使用,如I0、I1,其值不僅用做地址索引,還會(huì)影響許多指令的計(jì)算結(jié)果。在使用這些寄存器時(shí),一定要注意將其壓棧或置為適當(dāng)?shù)闹怠4送?#xff0c;關(guān)于數(shù)據(jù)的載入,一般應(yīng)遵循對(duì)齊原則,但在做運(yùn)動(dòng)估計(jì)計(jì)算匹配準(zhǔn)則函數(shù)時(shí),這樣的要求往往達(dá)不到。故如能將兩者分開(kāi)來(lái)計(jì) 算,將更能提高效率。
此外,應(yīng)盡量合理地使用寄存器,多使用并行指令也能提高代碼的執(zhí)行效率。
(2)分級(jí)存儲(chǔ)器結(jié)構(gòu)
ADSP-BF561處理器采用改進(jìn)的哈佛結(jié)構(gòu)和分級(jí)的存儲(chǔ)器結(jié)構(gòu)。Level1(L1)存儲(chǔ)器以全速運(yùn)行,只有很少的延遲。在L1級(jí),指令存儲(chǔ)器存放指令。兩個(gè)數(shù)據(jù)存儲(chǔ)器存放數(shù)據(jù),一個(gè)專用的臨時(shí)數(shù)據(jù)存儲(chǔ)器存放堆棧和局部變量信息。由多個(gè)L1 存儲(chǔ)器組成的模塊,可進(jìn)行SRAM和CACHE 的混合配置。存儲(chǔ)器管理單元(MMU)提供存儲(chǔ)器保護(hù)功能,對(duì)運(yùn)行于內(nèi)核上的獨(dú)立任務(wù),可保護(hù)系統(tǒng)寄存器免于意外的存取。L1 存儲(chǔ)器是ADSP-BF561處理器內(nèi)核中性能最高、最重要的存儲(chǔ)器。通過(guò)外部總線接口單元(EBIU),片外存儲(chǔ)器可以由SDRAM、FLASH和SRAM 進(jìn)行擴(kuò)展,可以訪問(wèn)多達(dá)132 MB的物理存儲(chǔ)器。根據(jù)這樣的特點(diǎn),將執(zhí)行率更高的代碼放入L1指令緩存中,能使代碼更快地運(yùn)行。IDE提供了Profile工具,能在運(yùn)行時(shí)統(tǒng)計(jì)各個(gè)函 數(shù)所占的CYCLE數(shù)和占總CYCLE數(shù)的百分比。通過(guò)將X264中比較耗時(shí)的部分算法代碼,如模式選擇部分代碼放入L1指令空間,能進(jìn)一步提升運(yùn)行效 率。Profile工具統(tǒng)計(jì)結(jié)果同樣也是選擇需要使用匯編優(yōu)化函數(shù)的依據(jù),IDE可根據(jù)Profile結(jié)果對(duì)代碼進(jìn)行優(yōu)化。X264代碼Profile統(tǒng) 計(jì)結(jié)果與測(cè)試數(shù)據(jù)有很大關(guān)系,選用更類似以后應(yīng)用場(chǎng)所的數(shù)據(jù)作為測(cè)試數(shù)據(jù),能使統(tǒng)計(jì)結(jié)果更接近以后的應(yīng)用環(huán)境。為達(dá)到比較準(zhǔn)確的統(tǒng)計(jì)結(jié)果,最好在 Simulation階段進(jìn)行統(tǒng)計(jì)。雖然這樣非常耗時(shí),但為得到一個(gè)準(zhǔn)確的統(tǒng)計(jì)作為參考依據(jù)是值得的。此外CACHE VIEWER工具能提供運(yùn)行時(shí)CACHE的使用情況,使用它來(lái)分析CACHE的使用,對(duì)于提高代碼運(yùn)行效率很有用處。
3 實(shí)驗(yàn)結(jié)果評(píng)估
3.1 關(guān)鍵函數(shù)優(yōu)化測(cè)試結(jié)果
采用以上優(yōu)化方法對(duì)編碼關(guān)鍵函數(shù)進(jìn)行優(yōu)化,優(yōu)化前后函數(shù)耗時(shí)如表1所示。可見(jiàn),以上優(yōu)化方法能大幅度減少編碼時(shí)間。
3.2測(cè)試序列測(cè)試結(jié)果
對(duì)三種測(cè)試序列在總線頻率120MHz下進(jìn)行優(yōu)化前后幀率測(cè)試,結(jié)果如表2所示。從表2可以看出,采用以上優(yōu)化方法能顯著提高幀率。
3.3不同數(shù)據(jù)總線頻率下測(cè)試結(jié)果
對(duì)于不同的總線頻率,優(yōu)化后編碼幀率不同,結(jié)果如表3所示,采用的測(cè)試序列為foreman。
本文介紹了H.264標(biāo)準(zhǔn)的框架,研究了X264軟件的實(shí)現(xiàn)方案,對(duì)ADSP-BF561處理器體系結(jié)構(gòu)進(jìn)行分析,提出了一套X264優(yōu)化方 案,包括:算法替代和改進(jìn)、內(nèi)聯(lián)函數(shù)、匯編代碼編寫(xiě)、高速存儲(chǔ)器應(yīng)用等。測(cè)試結(jié)果表明,優(yōu)化后的算法編碼效率有顯著提高,具有很強(qiáng)的實(shí)用價(jià)值。但是,本文主要從編碼速度和效率兩方面對(duì)編碼器進(jìn)行優(yōu)化,在復(fù)雜度和編碼質(zhì)量上仍需不斷對(duì)關(guān)鍵算法進(jìn)行分析整合,提出新的優(yōu)化算法。同時(shí),編碼器的碼率控制尚未完 善,如何在降低計(jì)算復(fù)雜度的前提下有效進(jìn)行碼率控制,需進(jìn)一步研究。
x264 耗時(shí)分析范例
測(cè)試環(huán)境:Intel Pentium4 3.00GHz (雙核cpu),開(kāi)啟超線程
內(nèi)存: DDR 1.00G
操作系統(tǒng): Windows sever 2003 Enterprise Edition
分析軟件: Intel(R) VTune(TM) Performance Analyzer 8.0(評(píng)估版lic)
編譯軟件: VC71+nasm0.98
Bus Speed: 800MHz
測(cè)試程序: X264 20060506 編碼器
1. Debug版本
編碼參數(shù):
X264 -fps -o foreman.264 forman.cif 352x288
編碼400frames,編碼效率:23fps左右(libx264 debug版本),35fps(libx264 release版本),提高了10fps以上,比較可觀
2. 編碼參數(shù):
X264 -fps --no-asm -o foreman.264 forman.cif 352x288-no-asm,Disable all CPU optimizations即未使用mmx,mmxext,sse,sse2,3dNow,3dnow ext,altivec等匯編指令優(yōu)化。
編碼400frames,編碼效率2.67fps(libx264debug版本),12.67fps(libx264 release版本),提高了10fps
Clockticks per Instructions Retired (CPI)表示該程序段的平均執(zhí)行一條指令所需的時(shí)鐘周期數(shù),CPI越大表示該程序段調(diào)用的浮點(diǎn)數(shù)操作,乘法,除法,I/O處理,系統(tǒng)調(diào)用或文件訪問(wèn)等代價(jià)昂貴的操作較多。
Instructions Retired events, 表示執(zhí)行的指令數(shù),越大表示該模塊調(diào)用的較多。
Clockticks events 則表示該模塊所消耗的時(shí)鐘周期數(shù),一般Clockticks events = Instructions Retired events * Clockticks perInstructions Retired (CPI),越大表示該模塊消耗的時(shí)間越多,后面的Clockticks %則表示該模塊的在所有程序中的時(shí)耗百分比。
這里有一點(diǎn)需要注意:(還是舉例吧),例如要分析視頻編碼中去塊濾波器算法/程序的時(shí)耗,并不是一個(gè)x264_frame_deblocking_filter函數(shù)的時(shí)間消耗就是所有x264編解碼過(guò)程中的時(shí)間消耗,由于 x264_frame_deblocking_filter調(diào)用deblck_edge,x264_clip3(該函數(shù)也被其他函數(shù)所調(diào)用)函數(shù),而 deblock_edge下又調(diào)用x264_deblock_v8_luma_mmxext,x264_deblock_h_luma_mmxext,x_264_deblock_h_chroma_mmxext, deblock_luma_intra_c,x264_deblock_v_chroma_mmxext(這些函數(shù)通過(guò)指針重定義的方式以適應(yīng)于不同的硬件平臺(tái),比如Intel,AMD的CPU采用 不同的指令系統(tǒng),其實(shí)Mplayer,FFMPEG,T264等軟件都采用類似的重定義方式,已達(dá)到一個(gè)軟件使用與不同構(gòu)架/平臺(tái),如 arm,powerpc,x86等)等函數(shù)。那么這里如果統(tǒng)計(jì)去塊濾波器的算法的時(shí)間消耗百分比,就需要將該函數(shù)及其所有調(diào)用的子函數(shù)的時(shí)間消耗都計(jì)算在內(nèi),x264_deblock_****都是唯一被deblock_edge調(diào)用,但對(duì)于x264_clip3,并不僅僅是去塊濾波器部分調(diào)用,那么就只 能部分計(jì)算在去塊濾波器之內(nèi),至于部分是多少要根據(jù)個(gè)函數(shù)的調(diào)用次數(shù),這里不確定。
相關(guān)x264時(shí)耗分析數(shù)據(jù)后面的表格。deblock占4.3%左右,quant+dequant占3.3%左右,DCT+IDCT占1.1%左右,主要是運(yùn)動(dòng)估計(jì)和運(yùn)動(dòng)補(bǔ)償,ME中大量的sad/satd的計(jì)算,MC中的六階濾波器tap_filter是主要時(shí)耗,具體我沒(méi)有太細(xì)統(tǒng)計(jì)將近20% 左右,x264中由于采用了算法優(yōu)化,程序優(yōu)化及mmx,sse,sse2等指令優(yōu)化,將原本消耗較大的去塊濾波器等都有了較大程度地優(yōu)化。
這里再討論一下程序性能優(yōu)化技術(shù),程序性能優(yōu)化可以大致從3個(gè)部分考慮。
1. 算法結(jié)構(gòu)優(yōu)化,實(shí)現(xiàn)同樣的應(yīng)用功能可采用多種不同的算法和方 法,比如H.264種的運(yùn)動(dòng)估計(jì)全搜索和快速運(yùn)動(dòng)估計(jì)算法,實(shí)現(xiàn)的編碼效率基本一致,但是處理時(shí)間可以節(jié)省10~20倍,所以需要選擇高效的算法。還有遞 歸算法非遞歸化,遞歸算法使得程序結(jié)構(gòu)清晰,可讀性高,但卻需要執(zhí)行大量的過(guò)程調(diào)用,堆棧保存等,運(yùn)行效率低下。
2. 編譯優(yōu)化,現(xiàn)在很多編譯器都實(shí)現(xiàn)了較強(qiáng)的代碼優(yōu)化功能,多數(shù)編譯器都基于數(shù)據(jù)流分析以實(shí)現(xiàn)別名分析(通過(guò)變量重命名來(lái)消除數(shù)據(jù)相關(guān),提高流水線的執(zhí)行效率),常數(shù)折疊,公共子表達(dá)式消除、冗余代碼刪除,循環(huán)逆轉(zhuǎn)和循環(huán)展開(kāi)等與體系結(jié)構(gòu)無(wú)關(guān)的優(yōu)化,例如GNU gcc就是個(gè)很好的編譯工具。還有借用并行程序設(shè)計(jì)技術(shù),進(jìn)行相關(guān)性分析,并通過(guò)相應(yīng)技術(shù)是程序具有更好的局部性以提高Cashe命中率。對(duì)于GCC中采 用-O-O2 -O3 -O4等選項(xiàng)選擇針對(duì)速度/面積等性能優(yōu)化,另外debug版本由于程序中加入較多的debug參數(shù),影響程序效率,上面x264的debug和 release運(yùn)行效率的對(duì)比可見(jiàn)一斑.編譯優(yōu)化屬于靜態(tài)優(yōu)化,由編譯器自動(dòng)完成,但是編譯器很難得到程序的語(yǔ)義信息,算法流程等信息。所以需要我們手工 編程優(yōu)化以最大程度提高程序運(yùn)行效率
3. 程序優(yōu)化,包括a)使用inline函數(shù),很多編譯器支持inline關(guān)鍵字,減少函數(shù)調(diào)用開(kāi)銷(xiāo)卻增加了代碼量。b)針對(duì)程序運(yùn)行平臺(tái),如 x86(Intel),Xscale,ARM,DSP等不同構(gòu)架,可采用相應(yīng)的匯編優(yōu)化,將主要時(shí)耗部分/循環(huán)調(diào)用等,進(jìn)行匯編指令優(yōu)化 MMX,SSE,WiMMX,ARM/Thumb指令,DSP匯編等,或者采用專用的庫(kù)函數(shù),如針對(duì)Intel CPU/Xscale構(gòu)架的嵌入式系統(tǒng)(PXA255,PXA270等)可使用IPP/GPP庫(kù),提高程序效率。c)對(duì)于DSP系統(tǒng),由于有多個(gè)并行處理單元,編譯器會(huì)并行優(yōu)化,所以需要盡量減少頻繁小循環(huán)跳轉(zhuǎn),將循環(huán)展開(kāi),同時(shí)減少循環(huán)或內(nèi)層循環(huán)也可以提高CPU的流線效率,盡量不斷流。d)在 Switch語(yǔ)句中根據(jù)發(fā)生頻率排序case語(yǔ)句,編譯器對(duì)于switch語(yǔ)句將生成if-else-if的嵌套代碼,按概率排序可提高效率 (FPGA/CPLD等邏輯器件中,采用VHDL語(yǔ)言描述的switch是生成多個(gè)邏輯器件,并且完全并行的)。e)減少函數(shù)調(diào)用參數(shù). f)減少耗時(shí)的浮點(diǎn)數(shù)操作,除法操作等降低CPI。
X264使用介紹
x264是一個(gè)開(kāi)源的H.264視頻編碼函數(shù)庫(kù)。是最好的有損視頻編碼器。
主頁(yè): http://www.videolan.org/developers/x264.html
x264.nl當(dāng)前版本信息:x264 x86 8bit-depthr2145, x64 8bit-depth r2145. Checked 2012-01-16 10:00 GMT
目錄[隱藏]
|
H.264和x264
H.264是ITU(International Telecommunication Unite 國(guó)際通信聯(lián)盟)和MPEG(MotionPicture Experts Group 運(yùn)動(dòng)圖像專家組)聯(lián)合制定的視頻編碼標(biāo)準(zhǔn)。從1999年開(kāi)始,到2003年形成草案,最后在2007年定稿有待核實(shí)。在ITU的標(biāo)準(zhǔn)里稱為H.264,在MPEG的標(biāo)準(zhǔn)里是MPEG-4的一個(gè)組成部分--MPEG-4Part 10,又叫Advanced Video Codec,因此常常稱為MPEG-4 AVC或直接叫AVC。
H.264編碼能實(shí)現(xiàn)非常好的壓縮比,有廣泛的適用碼率(適于從超低碼率低延遲的電話會(huì)議到高碼率的BluRay光盤(pán)和HDTV碼流),良好的硬件支持(以PSP、iPod和顯卡DXVA為代表)和眾多強(qiáng)大的廠商作后盾。
x264始于2003年,從當(dāng)開(kāi)源社區(qū)的MPEG4-ASP編碼器Xvid小有所成時(shí)開(kāi)始的,經(jīng)過(guò)幾年的開(kāi)發(fā),特別是Dark Shikari加入開(kāi)發(fā)后,x264逐漸成為了最好的視頻編碼器。
獲取x264
x264的主頁(yè)上只用git提供源代碼。雖然官方網(wǎng)站不提供編譯好的版本,但是有很多人在編譯x264,特別是Win32平臺(tái)的編譯版。
- http://x264.nl 的編譯版沒(méi)有任何patch,即所謂純凈版。
- jeeb編譯版
- komisar編譯版
- rack編譯版,關(guān)注Current Patches, Where to get them, How they affect speed/output的新帖
- VFR Maniac編譯版
- xvidvideo.ru編譯版
- MythCreator的編譯版
- roozhou的支持DirectShow輸入的版本。
- 還有doom9上的Current Patches, Where to get them, How they affect speed/output和doom10上的Getting the latest x264,都會(huì)有最新的編譯版
我們一般選擇32位的最新版。
此外,可以關(guān)注由@dgwxx維護(hù)的twitter機(jī)器人@264bot,它每半小時(shí)檢查一次x264.nl更新,報(bào)告32bit和64bit版本的更新。
命令行界面的x264
我們下載到的x264.exe是一個(gè)命令行工具,不需要安裝,隨便放在哪里都能運(yùn)行。雙擊x264.exe只能看到打開(kāi)了一個(gè)黑色的窗口里在刷著什么,然后就沒(méi)了。x264.exe需要在命令行里輸入命令,沒(méi)有GUI。
不可否認(rèn)有GUI的工具用來(lái)很方便,更容易上手,比如用的最廣泛的[http://MeGUI],此外還有ripbot、staxrip等GUI。doom9上有[1]都是各種GUI,一一試過(guò)來(lái)看看自己喜歡什么。MeGUI可以自動(dòng)更新編碼常用的軟件,作為自動(dòng)下載的工具倒是不錯(cuò)。本篇教程主要講解命令行參數(shù),GUI也是調(diào)用同一個(gè)x264,因此都用對(duì)應(yīng)的選項(xiàng)。
命令行的操作
按Win+R鍵調(diào)出運(yùn)行,輸入cmd,回車(chē),出現(xiàn)黑底白字的窗口和幾行字,其中有 “C:\Document and Settings\User\>”表示當(dāng)前所在的目錄,后面閃的光標(biāo)代表等待輸入內(nèi)容。
圖
假設(shè)x264.exe在E:\Encoder\文件夾,輸入
>cd /D E:\Encoder回車(chē)
圖
改變當(dāng)前目錄到E:\Encoder了。接下來(lái),輸入
>x264回車(chē)
圖
接下來(lái),不用截圖說(shuō)明會(huì)返回的信息了,而直接粘貼cmd里返回的字符。輸入命令會(huì)以“>”提示,看到“>”就代表此行是輸入命令并回車(chē)。
我們看到,如果只運(yùn)行x264,什么都不提供給他,x264會(huì)返回一個(gè)錯(cuò)誤。他告訴我們?nèi)鄙佥斎胛募?#xff0c;并提示我門(mén)輸入“x264 --help”會(huì)列出選項(xiàng)。照他說(shuō)的,加--help試試。
>x264 --help返回
x264 core:104 r1688M 0b36c6d Syntax: x264 [options] -o outfile infile ? Infile can be raw (in which case resolution is required), ? or YUV4MPEG (*.y4m), ? or Avisynth if compiled with support (no). ? or libav* formats if compiled with lavf support (no) or ffms support (yes). Outfile type is selected by filename: .264 -> Raw bytestream .mkv -> Matroska .flv -> Flash Video .mp4 -> MP4 Output bit depth: 8 (configured at compile time) ? Options: ? ? -h, --help????????????????? List basic options ????? --longhelp????????????? List more options ????? --fullhelp????????????? List all options ? Example usage: ? ????? Constant quality mode: ??????????? x264 --crf 24 -o <output> <input> ? 中間略... ? Input/Output: ? ? -o, --output??????????????? Specify output file ????? --sar width:height????? Specify Sample Aspect Ratio ????? --fps <float|rational>? Specify framerate ????? --seek <integer>??????? First frame to encode ????? --frames <integer>????? Maximum number of frames to encode ????? --level <string>??????? Specify level (as defined by Annex A) ????? --quiet???????????????? Quiet Mode ? Filtering: ? ????? Filter options may be specified in the name=value format --vf, --video-filter <filter0>/<filter1>/... Apply video filtering to the input file ????? Available filters: ????? crop:left,top,right,bottom ????? resize:[width,height][,sar][,fittobox][,csp][,method] ????? select_every:step,offset1[,...]
這下返回了不少字符。x264先告訴我們他的版本號(hào),再告訴我們他的基本用法是“x264 [options] -o outfile infile”。還提示我們可以輸入“--longhelp”或“--fullhelp”查看詳細(xì)選項(xiàng)或所有的選項(xiàng)。
接著輸入
>x264 --fullhelp列出了所有選項(xiàng)。
x264.exe的用法是,在命令行里輸入形如
>x264 [--參數(shù)名 參數(shù)值 ...] --output 輸出文件 輸入文件其中方括號(hào)里是可輸入可不輸入的,“...”是可以輸很多個(gè)的意思。觀察這個(gè)形式,每個(gè)參數(shù)名之前要加“--”,空格后跟此參數(shù)名的參數(shù)值;一定要有“--output”并指定輸出文件;一定要指定輸入文件,但前面沒(méi)有“--”之類的提示符號(hào)。
此外,還有短參數(shù)模式。這是為了簡(jiǎn)化某些常用參數(shù)名設(shè)計(jì)的。一個(gè)“-”加一個(gè)字母構(gòu)成一個(gè)短參數(shù)名,和與之對(duì)應(yīng)的普通參數(shù)名效果一樣。注意此時(shí)這個(gè)字母區(qū)分大小寫(xiě)。在--fullhelp列表里,有短參數(shù)的參數(shù)的短參數(shù)都列在此參數(shù)的前面。
實(shí)際命令實(shí)例:
>x264 --crf 22 --profile main --tune animation --preset medium --b-pyramid none -o psp.mp4 ep01.avs調(diào)用x264編碼當(dāng)前目錄下的"ep01.avs"文件,輸入"psp.264"。
>"D:\encoder tools\x264.exe" --crf 18 --tune touhou --preset slower -I 24 -o "D:\touhou\out.mkv" "D:\touhou\th9\rec.avi"這個(gè)例子中,x264.exe、和輸入文件都不在當(dāng)前目錄下,也不輸出到當(dāng)前路徑,就要寫(xiě)完整的路徑,如果有空格就需要在完整的路徑左右加上引號(hào)。
在Windows XP和Windows 7中,把文件拖拽到cmd里,cmd會(huì)自動(dòng)把文件的完整路徑寫(xiě)在命令行上的。
x264的輸入輸出文件類型
在加入了ffms/lavf后,x264可以直接輸入幾乎所有類型的片子,而不是像原來(lái)一樣必須借助于avs。下面所講的是輸入輸出的片子類型,除此之外的輸入輸出還有多pass中的stats文件、qp file、量化矩陣和tc file。
- 輸入:
x264支持輸入的文件類型有raw yuv、y4m、avs和任何可以由ffms或lavf打開(kāi)的文件。raw yuv會(huì)用在64位的x264里。有ffms/lavf打開(kāi)的片子會(huì)自動(dòng)正確的處理vfr問(wèn)題。avs和ffms/lavf輸入不需要指定片子的分辨率。
- 輸出:
x264可以輸出沒(méi)有封裝的H.264視頻流,擴(kuò)展名是.264;matroska視頻,擴(kuò)展名是.mkv;flash視頻,擴(kuò)展名是.flv;mp4視頻,擴(kuò)展名是.mp4。mkv、mp4和flv可以是vfr的。
x264通過(guò)輸出文件的擴(kuò)展名判斷輸出文件類型。
x264的preset和tune系統(tǒng)
x264的參數(shù)繁多,開(kāi)發(fā)者為了方便使用者、簡(jiǎn)化輸入和提出編碼建議,設(shè)計(jì)了一套快速調(diào)用參數(shù)的系統(tǒng)。如果沒(méi)有特別的需要,請(qǐng)盡量使用preset和tune系統(tǒng)。這套開(kāi)發(fā)者推薦的參數(shù)比各種道聽(tīng)途說(shuō)的參數(shù)更合理。
在使用了preset和tune以后,依然可以指定里面已經(jīng)有的參數(shù)。手動(dòng)指定的參數(shù)會(huì)覆蓋preset和tune里的參數(shù)。
--preset
通過(guò)--preset的參數(shù)調(diào)節(jié)編碼速度和質(zhì)量的平衡。
--preset的值有ultrafast、superfast、veryfast、faster、fast、medium、slow、slower、veryslow、placebo。從快到慢,參數(shù)越來(lái)越EP。默認(rèn)是medium。
--tune
通過(guò)--tune的參數(shù)值指定片子的類型,是和視覺(jué)優(yōu)化的參數(shù),或有特別的情況。
--tune的值有
- film:電影、真人類型;
- animation:動(dòng)畫(huà);
- grain:需要保留大量的grain時(shí)用;
- stillimage:靜態(tài)圖像編碼時(shí)使用;
- psnr:為提高psnr做了優(yōu)化的參數(shù);
- ssim:為提高ssim做了優(yōu)化的參數(shù);
- fastdecode:可以快速解碼的參數(shù);
- zerolatency:零延遲,用在需要非常低的延遲的情況下,比如電視電話會(huì)議的編碼。
碼率控制
視頻的碼率直接影響到了片子的編碼質(zhì)量。要想效果好,碼率足夠是最重要的必要條件之一。但是想實(shí)現(xiàn)更好的效果和控制文件的體積(碼率)之間始終是一對(duì)矛盾。這就需要我們通過(guò)實(shí)踐,在強(qiáng)大的編碼器的幫助下總結(jié)出合適的碼率,實(shí)現(xiàn)盡量好的效果。
x264有4種碼率控制方式,分別是1pass bitrate、crf、qp和2pass bitrate。其中2pass bitrate包含pass bitrate。
1pass bitrate和qp(恒定量化值)一般不推薦使用。
crf
--crf 23 (默認(rèn))
一種根據(jù)片子質(zhì)量自動(dòng)分配碼率的vbr碼率控制方式。一遍編碼,如果對(duì)碼率沒(méi)要求請(qǐng)盡量使用crf模式。
可用的值從1到51,越小編碼質(zhì)量越好,碼率越高。一般使用16到24,可以為浮點(diǎn)。
crf并不是恒定質(zhì)量的方式,同一片子同一crf值,其他參數(shù)不同可能碼率和質(zhì)量能差比較大,不同的片子之間就更沒(méi)有可比性了。
2passbitrate
這種方式可以精確的得到想要的平均碼率,2pass代表需要做2次編碼,第一遍編碼x264先分析全片,得到一個(gè)stats文件和一個(gè)mbtree 文件(默認(rèn)使用mbtree)。第二遍編碼以這兩個(gè)文件作參考分配合理的碼率。需要特定的碼率(或文件大小)一定要用2pass(或多pass)編碼。
除了2pass,還有多pass模式,在之前分析的基礎(chǔ)上再繼續(xù)分析,理論上會(huì)使碼率分配更加合理,但實(shí)際上2pass已經(jīng)足夠了。
--bitrate 1000 (以1000kbps碼率為例)
>x264 --bitrate 1000 --pass 1 --tune animation --preset slower --stats "1pass.stats" -o NUL input.avs >x264 --bitrate 1000 --pass 2 --tune animation --preset slower --stats "1pass.stats" -o output.264 input.avs先輸入第一行,等1pass跑完之后再輸入第二行跑2pass。1pass主要為了得到1pass.stats和1pass.stats.mbtree兩個(gè)文件,2pass需要這兩個(gè)文件已完成最后的編碼,最后輸出文件。
默認(rèn)情況下,1pass是以“快速”參數(shù)跑的,而不是以指定的參數(shù)跑。因此一般1pass會(huì)比2pass的速度快上很多。而這里1pass指定輸出的文件名是NUL,在Windows里,這個(gè)文件名是保留的,因此不會(huì)有任何輸出的已編碼的文件。
盡量讓1pass和2pass的視頻一致,如果改變了視頻,分析的結(jié)果就會(huì)變得比較不準(zhǔn)確。
此外,1pass可以用crf方式跑,而且可以輸出編碼的結(jié)果,也就是說(shuō)先跑個(gè)1pass看看,如果大小和預(yù)想的偏差太多,就再跑個(gè)2pass。但 由于1pass默認(rèn)用“快速”參數(shù)跑,因此這里的1pass需要加上--slow-firstpass強(qiáng)制x264用我們給的參數(shù)跑。
>x264 --crf 20 --pass 1 --slow-firstpass --tune animation --preset slower --stats "1pass.stats" -o output1pass.264 input.avs >x264 --bitrate 1000 --pass 2 --tune animation --preset slower --stats "1pass.stats" -o output2pass.264 input.avs1pass會(huì)輸出3個(gè)文件:1pass.stats、1pass.stats.mbtree和output1pass.264。前兩個(gè)是分析文件,后一個(gè)是編碼的結(jié)果。如果對(duì)編碼結(jié)果不滿意,則繼續(xù)用分析的結(jié)果跑2pass。
2pass必須用bitrate模式跑,不能用crf跑。
64bit的x264
如果用了64位的Windows Vista或Windows 7,就可以用64位的x264。64位的x264大約能比32位的x264快上10%左右,能節(jié)省的時(shí)間還是比較可觀的。但是用AviSynth輸入 時(shí),64位的x264只接受64位的AviSynth輸入,32位的x264只接受32位的AviSynth。雖然現(xiàn)在有64位的AviSynth和不少 常用的濾鏡,但是大多數(shù)人還是愿意用32位的AviSynth。那么如何用讓64位的x264配合32位的AviSynth呢?
方法是用pipe。用命令行工具(如ffmpeg、mencoder或avs2yuv)打開(kāi)avs,讓輸出的raw yuv畫(huà)面直接輸入給x264,期間不產(chǎn)生中間文件。這個(gè)操作也是在命令行里實(shí)現(xiàn)的。
用ffmpeg輸入
先下載ffmpeg的Windows編譯版,可以用static link版本。目前ffmpeg在Windows只有32位的編譯版。和x264一樣,ffmpeg放在任何目錄里都能運(yùn)行,假設(shè)和x264、要進(jìn)行編碼的input.avs放在一個(gè)目錄里。
>ffmpeg -i input.avs -f yuv4mpegpipe -an -v 0 - | x264 [options] --demuxer y4m -o output.264 -先用ffmpeg打開(kāi)input.avs,并不指定輸出的文件,而是以“-”代替輸出的文件。后面寫(xiě)“|”,再寫(xiě)x264,x264的選項(xiàng)和輸出文件寫(xiě)法不變,但是輸入文件寫(xiě)“-”。
用mencoder輸入
mencoder有很多有價(jià)值的濾鏡,用起來(lái)也很方便。libx264可以編譯進(jìn)mencoder本身,和單獨(dú)的x264效果一樣。mencoder也可以打開(kāi)avs文件,pipe給64位的x264。mplayer-ww的命令行版里就帶有mencoder。
同樣假設(shè)mencoder、x264和要編碼的的input.avs(1280x720)在一個(gè)目錄里。
>mencoder input.avs -vf format=yv12 -of rawvideo -ovc raw -nosound -o - | x264 [options] --input-res 1280x720 --input-csp yv12 -o output.264 -mencoder部分不同,x264部分和用ffmpeg時(shí)一樣。
用avs2yuv輸入
avs2yuv本來(lái)是為了給linux上wine來(lái)用的,因?yàn)锳viSynth是運(yùn)行在Windows的,在linux里必須wineavs2yuv來(lái)打開(kāi)avs,再pipe給x264。當(dāng)然也可以用來(lái)pipe給64位的x264。
同樣假設(shè)avs2yuv、x264和要編碼的的input.avs在一個(gè)目錄里。
>avs2yuv input.avs - | x264 [options] --demuxer y4m -o output.264 -avs2yuv的輸出格式默認(rèn)是yuv4mpeg,x264用y4m格式解碼即可從中讀取分辨率,所以無(wú)須再用--input-res指定分辨率。
以上介紹了3種方法,個(gè)人比較傾向于用ffmpeg。2pass的編碼也是像上面所講的方法一樣。
x264壓制的自動(dòng)化
雖然MeGUI等程序?qū)崿F(xiàn)了x264壓制的批量化,但并無(wú)法實(shí)現(xiàn)crf 1st pass + bitrate 2nd pass的自動(dòng)2pass,也無(wú)法實(shí)現(xiàn)1st pass和2nd pass使用不同avs腳本。
為此SAPikachu編寫(xiě)了Python腳本encx264,實(shí)現(xiàn)了以下功能:
- 支持1Pass crf + 2Pass bitrate模式,自動(dòng)獲取crf出來(lái)的碼率作為2pass參數(shù)。也可設(shè)定2pass碼率的比例,自動(dòng)計(jì)算2nd pass碼率功能。
- 自動(dòng)記錄壓制log。
- 可自定義多套預(yù)置參數(shù)。
- 可分別使用不同腳本跑1st和2nd pass。如1st pass使用較快的濾鏡,2nd pass再使用速度慢效果好的濾鏡,犧牲一定精度來(lái)提高速度。
- 支持腳本自動(dòng)升級(jí)最新版。
下載、討論、反饋請(qǐng)前往論壇討論發(fā)布專用貼。
DXVA
參考主條目: DXVA和psp
DXVA(DirectX Video Accelaration)通常被稱為硬解,是在Windows上用顯卡解碼H.264等編碼視頻的方式。AMD的顯卡方面,HD2xxx以上的系列都可 以DXVA;nVidia的顯卡方面,GeForce8000以上的系列都可以DXVA。
符合一定條件的H.264編碼的片子才能正常的DXVA。由于H.264的復(fù)雜性,用比較老的CPU解碼720p和1080p通常比較吃 力,因此720p和1080p的片子能否DXVA常常成為矛盾的焦點(diǎn)。為了讓大多數(shù)人都能正常的看到片子,建議盡量使用能夠DXVA的參數(shù)壓制。
RTP 協(xié)議
概述:
實(shí)時(shí)傳送協(xié)議(Real-time Transport Protocol或簡(jiǎn)寫(xiě)RTP,也可以寫(xiě)成RTTP)是一個(gè)網(wǎng)絡(luò)傳輸協(xié)議,它是由IETF的多媒體傳輸工作小組1996年在RFC 1889中公布的。
RTP協(xié)議詳細(xì)說(shuō)明了在互聯(lián)網(wǎng)上傳遞音頻和視頻的標(biāo)準(zhǔn)數(shù)據(jù)包格式。它一開(kāi)始被設(shè)計(jì)為一個(gè)多播協(xié)議,但后來(lái)被用在很多單播應(yīng)用中。RTP協(xié)議常用于流媒體系統(tǒng)(配合RTCP協(xié)議或者RTSP協(xié)議)。因?yàn)镽TP自身具有Time stamp所以在ffmpeg中被用做一種formate.
RTP協(xié)議格式:
??? 0?????????????????? 1?????????????????? 2?????????????????? 3 ??? 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ?? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ?? |V=2|P|X|? CC?? |M|???? PT????? |?????? sequence number???????? | ?? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ?? |?????????????????????????? timestamp?????????????????????????? | ?? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ?? |?????????? synchronization source (SSRC) identifier??????????? | ?? +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+ ?? |??????????? contributing source (CSRC) identifiers???????????? | ?? |???????????????????????????? ....????????????????????????????? | ?? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ 上圖引自rfc3550,由上圖中可知道RTP報(bào)文由兩個(gè)部分構(gòu)成--RTP報(bào)頭和RTP的負(fù)載:RTP報(bào)文由兩部分組成:報(bào)頭和有效載荷。RTP報(bào)頭格式如圖6.7所示,其中:
1.V:RTP協(xié)議的版本號(hào),占2位,當(dāng)前協(xié)議版本號(hào)為2。
2. P:填充標(biāo)志,占1位,如果P=1,則在該報(bào)文的尾部填充一個(gè)或多個(gè)額外的八位組,它們不是有效載荷的一部分。
3. X:擴(kuò)展標(biāo)志,占1位,如果X=1,則在RTP報(bào)頭后跟有一個(gè)擴(kuò)展報(bào)頭。
4.? CC:CSRC計(jì)數(shù)器,占4位,指示CSRC 標(biāo)識(shí)符的個(gè)數(shù)。
5. M: 標(biāo)記,占1位,不同的有效載荷有不同的含義,對(duì)于視頻,標(biāo)記一幀的結(jié)束;對(duì)于音頻,標(biāo)記會(huì)話的開(kāi)始。
6. PT: 有效載荷類型,占7位,用于說(shuō)明RTP報(bào)文中有效載荷的類型,如GSM音頻、JPEM圖像等,在流媒體中大部分是用來(lái)區(qū)分音頻流和視頻流的,這樣便于客戶端進(jìn)行解析。
7. 序列號(hào):占16位,用于標(biāo)識(shí)發(fā)送者所發(fā)送的RTP報(bào)文的序列號(hào),每發(fā)送一個(gè)報(bào)文,序列號(hào)增1。這個(gè)字段當(dāng)下層的承載協(xié)議用UDP的時(shí)候,網(wǎng)絡(luò)狀況不好的時(shí) 候可以用來(lái)檢查丟包。同時(shí)出現(xiàn)網(wǎng)絡(luò)抖動(dòng)的情況可以用來(lái)對(duì)數(shù)據(jù)進(jìn)行重新排序,在helix服務(wù)器中這個(gè)字段是從0開(kāi)始的,同時(shí)音頻包和視頻包的 sequence是分別記數(shù)的。
8. 時(shí)戳(Timestamp):占32位,時(shí)戳反映了該RTP報(bào)文的第一個(gè)八位組的采樣時(shí)刻。接收者使用時(shí)戳來(lái)計(jì)算延遲和延遲抖動(dòng),并進(jìn)行同步控制。
9. 同步信源(SSRC)標(biāo)識(shí)符:占32位,用于標(biāo)識(shí)同步信源。該標(biāo)識(shí)符是隨機(jī)選擇的,參加同一視頻會(huì)議的兩個(gè)同步信源不能有相同的SSRC。
10. 特約信源(CSRC)標(biāo)識(shí)符:每個(gè)CSRC標(biāo)識(shí)符占32位,可以有0~15個(gè)。每個(gè)CSRC標(biāo)識(shí)了包含在該RTP報(bào)文有效載荷中的所有特約信源。
如果擴(kuò)展標(biāo)志被置位則說(shuō)明緊跟在報(bào)頭后面是一個(gè)頭擴(kuò)展,其格式如下:
??? 0?????????????????? 1?????????????????? 2?????????????????? 3 ??? 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 ?? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ?? |????? defined by profile?????? |?????????? length????????????? | ?? +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ ?? |??? ????????????????????header extension?????????????????????? | ?? |???????????????????????????? ....????????????????????????????? |RTP協(xié)議的用途:
概述中已經(jīng)基本闡述了RTP協(xié)議的用途了,其主要用于在互聯(lián)網(wǎng)上傳遞音頻和視頻的標(biāo)準(zhǔn)數(shù)據(jù)包。在當(dāng)前三網(wǎng)融合中RTP可以用來(lái)承載TS流,進(jìn)行電視 媒體數(shù)據(jù)的傳播。RTP可以用來(lái)傳送像TS流這種自身已經(jīng)具有formate的媒體流,同時(shí)也可以用來(lái)承載AVC,AAC等去除了fromate的媒體 流,這時(shí)rtp協(xié)議可被看做為一種formate,這種形式最少常見(jiàn)于helix 流媒體服務(wù)器的rtp流。其控制流由RTSP協(xié)議來(lái)提供。
RTP協(xié)議的使用:
RTP的使用實(shí)例之一如上圖:
上面是某省IPTV2.0早期的一個(gè)數(shù)據(jù)包的情況。從包中可以看出RTP是怎么和RTSP配合一起使用的。從包402到411為RTSP的協(xié)商過(guò)程,RTSP在PLAYer命令后數(shù)據(jù)包就到來(lái)。緊跟其后412包就是一個(gè)mpeg 的PES包,它是有由rtp來(lái)承載的TS來(lái)形成。從在420包中就可以更加清析的看出這個(gè)RTP流的情況。其PT即payloadtype為mpeg2 transport streams 也就是ts流,其SSRC為:0x65737D6c,其Seq號(hào)為15764,從中也可以看出對(duì)于一個(gè)RTP流其SEQ號(hào)可以開(kāi)始于一個(gè)隨機(jī)的數(shù)值,但是 肯定是逐包遞增的。下圖為420包的展開(kāi)圖:
從中可以看出承載RTP的為UDP的數(shù)據(jù)流這個(gè)包中有x標(biāo)志位為1則說(shuō)明其有 headerextensions.其header extensions為最下面。extension 的 profile為23128,長(zhǎng)度為:2內(nèi)容如上圖最后兩部分。
媒體格式分析之flv -- 基于FFMPEG
本來(lái)是應(yīng)該先寫(xiě)一個(gè)媒體文件格式的簡(jiǎn)單講解的,還沒(méi)來(lái)得及寫(xiě),以后再寫(xiě)。今天就先根據(jù)ffmpeg的flv.c的flv_demux這個(gè)結(jié)構(gòu)體來(lái)講解一下當(dāng)前比較流行的媒體格式flv.
FLV 是FLASH VIDEO的簡(jiǎn)稱,FLV流媒體格式是隨著Flash MX的推出發(fā)展而來(lái)的視頻格式。由于它形成的文件極小、加載速度極快,使得網(wǎng)絡(luò)觀看視頻文件成為可能.當(dāng)前主流的媒體網(wǎng)站像國(guó)內(nèi)的優(yōu)酷、國(guó)外youtube其標(biāo)清格式的文件均采用flv的格式。
FLV文件結(jié)構(gòu)解析
FLV是一個(gè)二進(jìn)制文件,其文件格式如下圖 ,由文件頭(FLVheader)和很多tag組成。tag又可以分成三類:audio,video,script,分別代表音頻流,視頻流,腳本流(關(guān)鍵字或者文件信息之類)。
FLV Header
FLV的Header信息一般比較簡(jiǎn)單,包括文件類型之類的全局信息。如下圖中解析:
?
文件類型3bytes 總是FLV(0x46 0x4C 0x56),否則就不是在ffmpeg中在沒(méi)有指定文件格式的情況下,也是通過(guò)這個(gè)字段來(lái)探測(cè)文件是否屬于FLV格式的。
版本1byte 一般是0x01,表示FLV version 1
流信息1byte 倒數(shù)第一bit是1表示有視頻,倒數(shù)第三bit是1表示有音頻,其他都應(yīng)該是0(有些軟件如flvtool2可能造成倒數(shù)第四bit是1,不過(guò)也沒(méi)發(fā)現(xiàn)有什么不對(duì))
header長(zhǎng)度4bytes 整個(gè)文件頭的長(zhǎng)度,一般是9(3+1+1+4),當(dāng)然頭部字段也有可能包含其它信息這個(gè)時(shí)間其長(zhǎng)度就不是9了。
FLV Body
FLV body就是由很多tag組成的,一個(gè)tag包括下列信息:
????? previoustagsize 4bytes 前一個(gè)tag的長(zhǎng)度,第一個(gè)tag就是0
tag類型1byte 共分為三類:
* 8 -- 音頻tag
* 9 -- 視頻tag
* 18 -- 腳本tag
數(shù)據(jù)區(qū)長(zhǎng)度3bytes 時(shí)間戳3bytes 單位毫秒同時(shí)還有1bytes的擴(kuò)展時(shí)間戳,放在最高位,大部分時(shí)間時(shí)間戳為媒體的dts信息,如果是腳本tag就是0
streamsID 3bytes 總是0(不知道干啥用)
數(shù)據(jù)區(qū):根據(jù)不同的tag類型就有不同的數(shù)據(jù)區(qū)
腳本tag :
腳本tag一般是用文本方式表示,如下圖flv的metadata信息:
從中可以看出是通過(guò)文本的方式來(lái)標(biāo)記的,其解析后其header信息為:
從中可以看出其type為18。time stamp為0.data size為33638.
metadata tag data信息解析后為:
其中有一些媒體信息:
例如視頻的:高和寬它的codec id。幀率。音頻的信息例如:音頻的samplerate,codec id,sample size及是否立體聲。還有整個(gè)文件的大小等等。
音頻的tag信息:
音頻的tag信息如下圖:
其中time stamp 為0是因?yàn)槠錇榈谝粋€(gè)音頻tag.
視頻tag
這是文件中的第6個(gè)tag所以其time stamp不為0。因?yàn)槠錇橐曨ltag所以其type為9。
ffmpeg中的flv文件格式解析的實(shí)現(xiàn):
其中flv_read_header主要是從文件中讀取一些頭信息,同時(shí)作一些初始化化的工作
static int flv_read_header(AVFormatContext*s,AVFormatParameters *ap)
{
???????? ……
??? url_fskip(s->pb, 4); //將flv的頭去掉。
??? flags = get_byte(s->pb);//讀出flv的video和audio flag信息。
???????? ……?
??????? if(flags &FLV_HEADER_FLAG_HASVIDEO){
??????? if(!create_stream(s, 0))? //創(chuàng)建視頻流
??????????? returnAVERROR(ENOMEM);
??? }
??? if(flags & FLV_HEADER_FLAG_HASAUDIO){
??????? if(!create_stream(s, 1)) //創(chuàng)建音頻流
??????????? returnAVERROR(ENOMEM);
??? }
??? offset = get_be32(s->pb); //獲取文件頭長(zhǎng)度
??????? ……
}
其它tag的讀取:
static int flv_read_packet(AVFormatContext *s, AVPacket*pkt)
{
???? ……
for(;;url_fskip(s->pb, 4)){ /* pkt size is repeated at end. skip it */
??? pos = url_ftell(s->pb);
??? type = get_byte(s->pb); //獲取tag的類型,前面已經(jīng)提到flv的tag大概有以下三種 :FLV_TAG_TYPE_AUDIO = 0x08,FLV_TAG_TYPE_VIDEO =0x09,FLV_TAG_TYPE_META? = 0x12,
??? size = get_be24(s->pb);//獲取tag的長(zhǎng)度
??? dts = get_be24(s->pb);
??? dts |= get_byte(s->pb) << 24; //計(jì)算tag的timestamp也就是dts信息
??? ……
??? if (type == FLV_TAG_TYPE_AUDIO) { //判斷是否為audio tag
?????? ……
???????? } else if (type ==FLV_TAG_TYPE_VIDEO) {//判斷是否為video tag
?????? ……
??????????????if ((flags & 0xf0) == 0x50) /* video info / command frame */
??????????? goto skip;
??? } else {
??????? if (type == FLV_TAG_TYPE_META&& size > 13+1+4)//判斷是否為meta tag,如果是meta信息則會(huì)將信息存放在一個(gè)map表中。
???????? ……
}
版權(quán)所有:博水。轉(zhuǎn)載請(qǐng)注明出處:http://www.cnblogs.com/qingquan/
SDP 協(xié)議分析
一、SDP協(xié)議介紹
SDP 完全是一種會(huì)話描述格式 ― 它不屬于傳輸協(xié)議 ― 它只使用不同的適當(dāng)?shù)膫鬏攨f(xié)議,包括會(huì)話通知協(xié)議(SAP)、會(huì)話初始協(xié)議(SIP)、實(shí)時(shí)流協(xié)議(RTSP)、MIME 擴(kuò)展協(xié)議的電子郵件以及超文本傳輸協(xié)議(HTTP)。SDP協(xié)議是也是基于文本的協(xié)議,這樣就能保證協(xié)議的可擴(kuò)展性比較強(qiáng),這樣就使其具有廣泛的應(yīng)用范圍。SDP 不支持會(huì)話內(nèi)容或媒體編碼的協(xié)商,所以在流媒體中只用來(lái)描述媒體信息。媒體協(xié)商這一塊要用RTSP來(lái)實(shí)現(xiàn).
二、SDP協(xié)議格式
SDP描述由許多文本行組成,文本行的格式為<類型>=<值>,<類型>是一個(gè)字母,<值>是結(jié)構(gòu)化的文本串,其格式依<類型>而定。
<type>=<value>[CRLF]
常見(jiàn)的fields有:
三、SDP協(xié)議例子:
下面是一個(gè)helix 流媒體服務(wù)器的RTSP協(xié)議中的SDP協(xié)議:
v=0 //SDP version
// o field定義的源的一些信息。其格式為:o=<username><sess-id> <sess-version> <nettype> <addrtype><unicast-address>
o=- 1271659412 1271659412 IN IP4 10.56.136.37 s=<Notitle>
i=<No author> <No copyright>? //session的信息
c=IN IP4 0.0.0.0 //connect 的信息,分別描述了:網(wǎng)絡(luò)協(xié)議,地址的類型,連接地址。
c=IN IP4 0.0.0.0
t=0 0 //時(shí)間信息,分別表示開(kāi)始的時(shí)間和結(jié)束的時(shí)間,一般在流媒體的直播的時(shí)移中見(jiàn)的比較多。
a=SdpplinVersion:1610641560 //描述性的信息
a=StreamCount:integer;2 //用來(lái)描述媒體流的信息,表示有兩個(gè)媒體流。integer表示信息的格式為整數(shù)。
a=control:*
a=DefaultLicenseValue:integer;0 //License信息
a=FileType:string;"MPEG4" 用來(lái)描述媒體流的信息說(shuō)明當(dāng)前協(xié)商的文件是mpeg4格式的文件
a=LicenseKey:string;"license.Summary.Datatypes.RealMPEG4.Enabled"
a=range:npt=0-72.080000? //用來(lái)表示媒體流的長(zhǎng)度
m=audio 0 RTP/AVP 96 //做為媒體描述信息的重要組成部分描述了媒體信息的詳細(xì)內(nèi)容:表示session的audio是通過(guò)RTP來(lái)格式傳送的,其payload值為96傳送的端口還沒(méi)有定。
b=as:24 //audio 的bitrate
b=RR:1800
b=RS:600
a=control:streamid=1? //通過(guò)媒體流1來(lái)發(fā)送音頻
a=range:npt=0-72.080000 //說(shuō)明媒體流的長(zhǎng)度。
a=length:npt=72.080000
a=rtpmap:96 MPEG4-GENERIC/32000/2 //rtpmap的信息,表示音頻為AAC的其sample為32000
a=fmtp:96profile-level-id=15;mode=AAC-hbr;sizelength=13;indexlength=3;indexdeltalength=3;config=1210//config為AAC的詳細(xì)格式信息
a=mimetype:string;"audio/MPEG4-GENERIC"
a=Helix-Adaptation-Support:1
a=AvgBitRate:integer;48000
a=HasOutOfOrderTS:integer;1
a=MaxBitRate:integer;48000
a=Preroll:integer;1000
a=OpaqueData:buffer;"A4CAgCIAAAAEgICAFEAVABgAAAC7gAAAu4AFgICAAhKIBoCAgAEC"
a=StreamName:string;"Audio Track"
下面是video的信息基本和audio的信息相對(duì)稱,這里就不再說(shuō)了。
m=video 0 RTP/AVP 97
b=as:150
b=RR:11250
b=RS:3750
a=control:streamid=2
a=range:npt=0-72.080000
a=length:npt=72.080000
a=rtpmap:97 MP4V-ES/2500
a=fmtp:97 profile-level-id=1;
a=mimetype:string;"video/MP4V-ES"
a=Helix-Adaptation-Support:1
a=AvgBitRate:integer;300000
a=HasOutOfOrderTS:integer;1
a=Height:integer;240 //影片的長(zhǎng)度
a=MaxBitRate:integer;300000
a=MaxPacketSize:integer;1400
a=Preroll:integer;1000
a=Width:integer;320? //影片的寬度
a=OpaqueData:buffer;"AzcAAB8ELyARAbd0AAST4AAEk+AFIAAAAbDzAAABtQ7gQMDPAAABAAAAASAAhED6KFAg8KIfBgEC"
a=StreamName:string;"Video Track"
I,P,B幀和PTS,DTS的關(guān)系
基本概念:
I frame :幀內(nèi)編碼幀 又稱intra picture,I 幀通常是每個(gè) GOP(MPEG 所使用的一種視頻壓縮技術(shù))的第一個(gè)幀,經(jīng)過(guò)適度地壓縮,做為隨機(jī)訪問(wèn)的參考點(diǎn),可以當(dāng)成圖象。I幀可以看成是一個(gè)圖像經(jīng)過(guò)壓縮后的產(chǎn)物。
P frame: 前向預(yù)測(cè)編碼幀 又稱predictive-frame,通過(guò)充分將低于圖像序列中前面已編碼幀的時(shí)間冗余信息來(lái)壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫預(yù)測(cè)幀;
B frame: 雙向預(yù)測(cè)內(nèi)插編碼幀 又稱bi-directionalinterpolated prediction frame,既考慮與源圖像序列前面已編碼幀,也顧及源圖像序列后面已編碼幀之間的時(shí)間冗余信息來(lái)壓縮傳輸數(shù)據(jù)量的編碼圖像,也叫雙向預(yù)測(cè)幀;
PTS:Presentation Time Stamp。PTS主要用于度量解碼后的視頻幀什么時(shí)候被顯示出來(lái)
DTS:Decode Time Stamp。DTS主要是標(biāo)識(shí)讀入內(nèi)存中的bit流在什么時(shí)候開(kāi)始送入解碼器中進(jìn)行解碼。
在沒(méi)有B幀存在的情況下DTS的順序和PTS的順序應(yīng)該是一樣的。
IPB幀的不同:
I frame:自身可以通過(guò)視頻解壓算法解壓成一張單獨(dú)的完整的圖片。
P frame:需要參考其前面的一個(gè)I frame 或者B frame來(lái)生成一張完整的圖片。
B frame:則要參考其前一個(gè)I或者P幀及其后面的一個(gè)P幀來(lái)生成一張完整的圖片。
兩個(gè)I frame之間形成一個(gè)GOP,在x264中同時(shí)可以通過(guò)參數(shù)來(lái)設(shè)定bf的大小,即:I 和p或者兩個(gè)P之間B的數(shù)量。
通過(guò)上述基本可以說(shuō)明如果有B frame 存在的情況下一個(gè)GOP的最后一個(gè)frame一定是P.
DTS和PTS的不同:
DTS主要用于視頻的解碼,在解碼階段使用.PTS主要用于視頻的同步和輸出.在display的時(shí)候使用.在沒(méi)有B frame的情況下.DTS和PTS的輸出順序是一樣的.
例子:
下面給出一個(gè)GOP為15的例子,其解碼的參照f(shuō)rame及其解碼的順序都在里面:
如上圖:I frame 的解碼不依賴于任何的其它的幀.而p frame的解碼則依賴于其前面的I frame或者P frame.B frame的解碼則依賴于其前的最近的一個(gè)I frame或者P frame 及其后的最近的一個(gè)P frame.
RTSP 協(xié)議分析 (一)
RTSP 協(xié)議分析
1.概述:
?RTSP(Real Time Streaming Protocol),實(shí)時(shí)流傳輸協(xié)議,是TCP/IP協(xié)議體系中的一個(gè)應(yīng)用層協(xié)議,由哥倫比亞大學(xué)、網(wǎng)景和RealNetworks公司提交的IETF RFC標(biāo)準(zhǔn)。該協(xié)議定義了一對(duì)多應(yīng)用程序如何有效地通過(guò)IP網(wǎng)絡(luò)傳送多媒體數(shù)據(jù)。類似HTTP協(xié)議的流控制協(xié)議。它們都使用純文本來(lái)發(fā)送信息,而且 rtsp協(xié)議的語(yǔ)法也和HTTP類似,和HTTP協(xié)議相比RTSP協(xié)議所不同的地方是,RTSP協(xié)議是有狀態(tài)的協(xié)議,而HTTP是無(wú)狀態(tài)的協(xié)議。RTSP 通過(guò)維護(hù)一個(gè)session來(lái)維護(hù)其狀態(tài)的轉(zhuǎn)換。RTSP協(xié)議的默認(rèn)端口是554,默認(rèn)的承載協(xié)議為T(mén)CP。
2.RTSP的特性:
(1).流控分離:從控制邏輯上來(lái)說(shuō)RTSP和FTP相似,控制流和數(shù)據(jù)流是分開(kāi)的。
(2).可擴(kuò)展性:因?yàn)镽TSP協(xié)議是基于文本的協(xié)議所以其具有較強(qiáng)的可擴(kuò)展性。
(3).安全:RTSP使用網(wǎng)頁(yè)安全機(jī)制。
3.RTSP 協(xié)議格式:
請(qǐng)求命令的格式為:
METHOD URL CR LF
Field1:value CR LF
Field2:value CR LF
......
Fieldn:value CR LF
CR LF
應(yīng)答的格式為:
RTSP/major_version.minor_version status CR LF
Field1:value CR LF
Field2:value CR LF
......
Fieldn:value CR LF
CR LF
4.RTSP的主要命令:
5.RTSP命令的狀態(tài)轉(zhuǎn)換表
6.RTSP狀態(tài)碼
Status-Code = "100" ;Continue
| "200" ; OK
| "201" ; Created
| "250" ; Low onStorage Space
| "300" ; MultipleChoices
| "301" ; MovedPermanently
| "302" ; MovedTemporarily
| "303" ; See Other
| "304" ; NotModified
| "305" ; Use Proxy
| "400" ; Bad Request
| "401" ;Unauthorized
| "402" ; PaymentRequired
| "403" ; Forbidden
| "404" ; Not Found
| "405" ; Method NotAllowed
| "406" ; NotAcceptable
| "407" ; ProxyAuthentication Required
| "408" ; RequestTime-out
| "410" ; Gone
| "411" ; LengthRequired
| "412" ;Precondition Failed
| "413" ; RequestEntity Too Large
| "414" ; Request-URIToo Large
| "415" ; UnsupportedMedia Type
| "451" ; ParameterNot Understood
| "452" ; ConferenceNot Found
| "453" ; Not EnoughBandwidth
| "454" ; Session NotFound
| "455" ; Method NotValid in This State
| "456" ; HeaderField Not Valid for Resource
| "457" ; InvalidRange
| "458" ; ParameterIs Read-Only
| "459" ; Aggregateoperation not allowed
| "460" ; Onlyaggregate operation allowed
| "461" ; Unsupportedtransport
| "462" ; Destinationunreachable
| "500" ; InternalServer Error
| "501" ; NotImplemented
| "502" ; Bad Gateway
| "503" ; ServiceUnavailable
| "504" ; GatewayTime-out
| "505" ; RTSPVersion not supported
| "551" ; Option notsupported
| extension-code
extension-code = 3DIGIT
Reason-Phrase = *<TEXT,excluding CR, LF
<下一篇將給出RTSP協(xié)議的實(shí)例分析>
RTSP協(xié)議分析(二)
以下是某省IPTV的RTSP協(xié)商過(guò)程:
DESCRIBErtsp://118.122.89.27:554/live/ch10083121594790060557.sdp?playtype=1&boid=001&backupagent=118.122.89.27:554&clienttype=1&time=20100929182111+08&life=172800&ifpricereqsnd=1&vcdnid=001&userid=123&mediaid=ch10083121594790060557&ctype=2&TSTVTimeLife=1800&contname=&authid=0&UserLiveType=1&nodelevel=3RTSP/1.0
/媒體URL
Accept: application/sdp
//協(xié)商用于描述媒體信息協(xié)議
CSeq: 1
User-Agent:ZTE Ltd.co RTSP protocal verion 1.0guid-2.1.1.100/B519D290-C0EC-EE35-7368-893BE4C0B347
//User Agnet信息,顯示是中興的服務(wù)器,1.0的版本。如果是Helix服務(wù)器的話會(huì)有Helix 服務(wù)器的標(biāo)識(shí)。
x-NAT:2.1.1.100:20081
//主要用于NAT穿透
x-zmssRtxSdp: yes
RTSP/1.0 200 OK
//應(yīng)答編號(hào)
Server: ZXUSS100 1.0
Cache-Control: no-cache
Content-Base:rtsp://118.122.89.27:554/live/ch10083121594790060557.sdp/
Content-Length: 320
//內(nèi)容長(zhǎng)度信息
Content-Type: application/sdp
//描述內(nèi)容信息所用的協(xié)議
CSeq: 1
Date: Wed, 29 Sep 2010 10:20:38 GMT
Expires: Wed, 29 Sep 2010 10:20:38 GMT
// SDP 描述信息
v=0
o=- 296874273 1 IN IP4 118.122.89.27
s=envivio
c=IN IP4 0.0.0.0
b=AS:1500
t=0 0
a=range:clock=20100929T095038.00Z-20100929T102038.00Z
m=video 5140 RTP/AVPF 33 96
a=control:trackID=2
a=rtpmap:33 MP2T/90000
a=3GPP-Adaptation-Support:5
a=rtcp-fb:33 nack
a=rtpmap:96 rtx/90000
a=fmtp:96 apt=33;rtx-time=0
SETUPrtsp://118.122.89.27:554/live/ch10083121594790060557.sdp/trackID=2 RTSP/1.0
//用于建立RTSP連接,協(xié)商傳輸用的協(xié)議。
CSeq: 2
3GPP-Adaptation:url=rtsp://118.122.89.27:554/live/ch10083121594790060557.sdp/trackID=2;size=1061400;target-time=2200
Transport:MP2T/RTP/UDP;unicast;destination=2.1.1.100;client_port=8360-8361,MP2T/RTP/TCP;unicast;destination=2.1.1.100;interleaved=0-1,MP2T/UDP;unicast;destination=2.1.1.100;client_port=8360-8361,MP2T/TCP;unicast;destination=2.1.1.100;interleaved=0-1
// MP2T/RTP/UDP表示是TS流用于RTP打包,基于UDP傳輸。MP2T/RTP/TCP表示是TS流用于RTP打包,基于TCP。
User-Agent:ZTE Ltd.co RTSP protocal verion 1.0guid-2.1.1.100/B519D290-C0EC-EE35-7368-893BE4C0B347
RTSP/1.0 200 OK
Server: ZXUSS100 1.0
CSeq: 2
Date: Wed, 29 Sep 2010 10:20:38 GMT
Expires: Wed, 29 Sep 2010 10:20:38 GMT
Session: 65565885
Transport:MP2T/RTP/UDP;unicast;destination=2.1.1.100;client_port=8360-8361;server_port=13306-13307;source=118.122.89.29
// 通過(guò)協(xié)商MP2T/RTP/UDP表示是TS流用于RTP打包,基于UDP傳輸。server端端口:13306-13307。client端端口:8360-8361
3GPP-Adaptation:url=rtsp://118.122.89.27:554/live/ch10083121594790060557.sdp/trackID=2;size=1061400;target-time=2200
PLAYrtsp://118.122.89.27:554/live/ch10083121594790060557.sdp?playtype=1&boid=001&backupagent=118.122.89.27:554&clienttype=1&time=20100929182111+08&life=172800&ifpricereqsnd=1&vcdnid=001&userid=123&mediaid=ch10083121594790060557&ctype=2&TSTVTimeLife=1800&contname=&authid=0&UserLiveType=1&nodelevel=3RTSP/1.0
//播放視頻。對(duì)于有些視頻可能會(huì)分別要對(duì)音頻視頻進(jìn)行play。
CSeq: 3
Session: 65565885
User-Agent:ZTE Ltd.co RTSP protocal verion 1.0guid-2.1.1.100/B519D290-C0EC-EE35-7368-893BE4C0B347
Scale: 1.0
Range: npt=end-
//npt=end-在IPTV2.0里面有其自身的定義(可參看上海電信IPTV2.0標(biāo)準(zhǔn))
RTSP/1.0 200 OK
Server: ZXUSS100 1.0
CSeq: 3
Range: npt=end-
Scale: 1.0
Session: 65565885
RTP-Info: url=rtsp://118.122.89.29:13306/live/ch10083121594790060557.sdp/trackID=2
......
PLAYrtsp://118.122.89.27:554/live/ch10083121594790060557.sdp?playtype=1&boid=001&backupagent=118.122.89.27:554&clienttype=1&time=20100929182111+08&life=172800&ifpricereqsnd=1&vcdnid=001&userid=123&mediaid=ch10083121594790060557&ctype=2&TSTVTimeLife=1800&contname=&authid=0&UserLiveType=1&nodelevel=3RTSP/1.0
//play的另外一種用法。用于快進(jìn)和快退。
CSeq: 43
Session: 65565885
User-Agent:ZTE Ltd.co RTSP protocal verion 1.0guid-2.1.1.100/B519D290-C0EC-EE35-7368-893BE4C0B347
Scale: -32.0
//Scale: -32.0,表示以32倍速快退。Scale:32.0,表示以32倍速快進(jìn)。
Range: npt=now-
RTSP/1.0 200 OK
Server: ZXUSS100 1.0
CSeq: 43
Range: clock=20100929T102609.02Z-20100929T095637.75Z
Scale: -32.0
Session: 65565885
RTP-Info:url=rtsp://118.122.89.36:10084/live/ch10083121594790060557.sdp/trackID=2;seq=22277;rtptime=1792329138
GET_PARAMETERrtsp://118.122.89.27:554/live/ch10083121594790060557.sdp?playtype=1&boid=001&backupagent=118.122.89.27:554&clienttype=1&time=20100929182111+08&life=172800&ifpricereqsnd=1&vcdnid=001&userid=123&mediaid=ch10083121594790060557&ctype=2&TSTVTimeLife=1800&contname=&authid=0&UserLiveType=1&nodelevel=3RTSP/1.0
//獲取當(dāng)前的一些播放參數(shù)。
CSeq: 44
Session: 65565885
User-Agent:ZTE Ltd.co RTSP protocal verion 1.0guid-2.1.1.100/B519D290-C0EC-EE35-7368-893BE4C0B347
x-Timeshift_Range
//請(qǐng)求時(shí)移的范圍
x-Timeshift_Current
//獲取當(dāng)前的時(shí)間點(diǎn)
RTSP/1.0 200 OK
//返回當(dāng)前的媒體信息。
Server: ZXUSS100 1.0
CSeq: 44
Session: 65565885
x-Timeshift_Range: clock=20100929T095638.83Z-20100929T102638.83Z
x-Timeshift_Current:clock=20100929T102530.20Z;rtptime=1788844914
中間省去了45,46,47三個(gè)包。通過(guò)CSeq: 48字段可以看出來(lái)
PLAYrtsp://118.122.89.27:554/live/ch10083121594790060557.sdp?playtype=1&boid=001&backupagent=118.122.89.27:554&clienttype=1&time=20100929182111+08&life=172800&ifpricereqsnd=1&vcdnid=001&userid=123&mediaid=ch10083121594790060557&ctype=2&TSTVTimeLife=1800&contname=&authid=0&UserLiveType=1&nodelevel=3RTSP/1.0
用于恢復(fù)正常的播放速度。
CSeq: 48
Session: 65565885
User-Agent:ZTE Ltd.co RTSP protocal verion 1.0 guid-2.1.1.100/B519D290-C0EC-EE35-7368-893BE4C0B347
Scale: 1.0
Range: npt=beginning-
RTSP/1.0 200 OK
Server: ZXUSS100 1.0
CSeq: 48
Range: clock=20100929T095730.00Z-20100929T102730.61Z
//可以時(shí)移的范圍。
Scale: 1.0
Session: 65565885
RTP-Info: url=rtsp://118.122.89.36:10084/live/ch10083121594790060557.sdp/trackID=2;seq=39900;rtptime=1637595010
<中間在Descript應(yīng)答中所用的SDP協(xié)議將會(huì)在以后中描述>
ffmpeg/ffplay vc6 源碼剖析
ffmpeg/ffplay是當(dāng)今多媒體領(lǐng)域的王者,很多很多的人想研究學(xué)習(xí) ffmpeg/ffplay,但苦于ffmpeg/ffplay龐大的代碼量,令人望而生畏。為幫助更多的人研習(xí)ffmpeg/ffplay,在保持 ffmpeg/ffplay體系架構(gòu)的完整性的前提下,把ffmpeg/ffplay大規(guī)模的瘦身后,研習(xí)門(mén)檻一下子降低了n多個(gè)數(shù)量級(jí)。附件一個(gè)是對(duì)瘦身后的ffmpeg/ffplay的代碼完整的剖析pdf文檔,另一個(gè)是瘦身后的ffmpeg/ffplay的完整源代碼,最大化幫助各位網(wǎng)友研究學(xué)習(xí)ffmpeg/ffplay。
?
特別注意:
1:如果VC6 debug模式跑出錯(cuò)誤了,就用VS2005跑。
2:重新上傳了ffsrc.7z,修正了一個(gè)內(nèi)存泄露,改正了黑屏的問(wèn)題(不好意思,以前上傳的時(shí)候不小心,傳的是debug的版本)。
?
pdf檔下載地址:http://files.cnblogs.com/mcodec/ffdoc.7z
源代碼下載地址:http://files.cnblogs.com/mcodec/ffsrc.7z
代碼糟糕之路(一)--- 破窗理論
版權(quán)保留,轉(zhuǎn)載請(qǐng)注明出處:http://www.cnblogs.com/qingquan
這一段想總結(jié)一下之前的東西,因?yàn)橹白隽艘粋€(gè)比較快的項(xiàng)目,項(xiàng)目不大,但人員流動(dòng)性比較大出現(xiàn)了一些比較典型的現(xiàn)象,在此將這些現(xiàn)象記錄下來(lái),以備以后查看同時(shí)也和大家一起討論一下。
破窗理論:一個(gè)房子如果窗戶破了,沒(méi)有人去修補(bǔ),隔不久,其它的窗戶也會(huì)莫名其妙地被人打破;一面墻,如果出現(xiàn)一些涂鴉沒(méi)有被清洗掉,很快的,墻上就布滿了亂七八糟、不堪入目的東西;一個(gè)很干凈的地方,人們不好意思丟垃圾,但是一旦地上有垃圾出現(xiàn)之后,人就會(huì)毫不猶疑地拋,絲毫不覺(jué)羞愧。
在日常的代碼工作中,尤其在對(duì)新加入公司的員工,因?yàn)樗麄儗?duì)當(dāng)前公司的代碼規(guī)范不是很熟悉。在代碼編碼過(guò)程中可能有意無(wú)意的帶來(lái)了他前一個(gè)公司的一 些編碼習(xí)慣,但這些編碼習(xí)慣可能和當(dāng)前公司的編碼習(xí)慣不是很一樣。例如:當(dāng)前A公司的C語(yǔ)言編碼規(guī)范是采用把起始大括號(hào)放在行尾,而把結(jié)束大括號(hào)放在行 首。縮進(jìn)采用4個(gè)空格的方法。但是新來(lái)的一個(gè)員工,因?yàn)闆](méi)有很好的遵守規(guī)范帶來(lái)了之前編碼習(xí)慣,這時(shí)他有可能在更改一段之前代碼的時(shí)候:
if (x is true) {
?? we do y
}
將這段這段代碼改為:
if (x is true) {
??? do
??? {
??????? body of do-loop
??? } while (condition);
}
這樣整個(gè)代碼風(fēng)格就開(kāi)始發(fā)生變化,之后由于一不小心將4個(gè)空格按成一個(gè)tab鍵,這樣整個(gè)代碼風(fēng)格就開(kāi)始面目全非。
之后又有一次因?yàn)榫o急情況,因?yàn)楣ぷ鲿r(shí)間緊急抽調(diào)一個(gè)新人對(duì)上面的代碼進(jìn)行修改。因?yàn)樾氯丝赡芤矝](méi)有考慮整個(gè)代碼的風(fēng)格,對(duì)命名規(guī)范吃的不是很準(zhǔn) 確,如果他在他的編輯器里面把tab鍵的長(zhǎng)度設(shè)置為8個(gè)空格這樣看起來(lái)整個(gè)代碼已經(jīng)是混亂一片。這時(shí)如果再有第三個(gè)人更改這段代碼的時(shí)候,公司的代碼規(guī)范的約束力已經(jīng)無(wú)形中被削弱了很多。這樣代碼混亂的情況就會(huì)從代碼格式進(jìn)而擴(kuò)展的命名規(guī)則,代碼注釋等方面。這樣這段代碼再經(jīng)過(guò)幾個(gè)人的更改而沒(méi)有整理和重 構(gòu)的情況下將很快會(huì)變的異常混亂。這段代碼就會(huì)像一個(gè)破了一塊玻璃的房子一樣,很快變的面目全非。
下一篇可能著重從高人員流動(dòng)情況下對(duì)代碼的影響。
QtModel/View 概論(-)
Model-View-Controller(MVC), 是從Smalltalk發(fā)展而來(lái)的一種設(shè)計(jì)模式,常被用于構(gòu)建用戶界面。它強(qiáng)制性的使應(yīng)用程序的輸入、處理和輸出分開(kāi)。
在Qt中引入了一個(gè)MVC的變體---model/view結(jié)構(gòu)。這個(gè)結(jié)構(gòu)依然是把數(shù)據(jù)存儲(chǔ)與數(shù)據(jù)表示進(jìn)行了分離,它與MVC都基于同樣的思想,但它更簡(jiǎn)單一些。這種分離使得在幾個(gè)不同的view上顯示同一個(gè)數(shù)據(jù)成為可能,也可以重新實(shí)現(xiàn)新的view,而不必改變底層的數(shù)據(jù)結(jié)構(gòu)。為了更靈活的對(duì)用戶 輸入進(jìn)行處理,引入了delegate這個(gè)概念。它的好處是,數(shù)據(jù)項(xiàng)的渲染與編程可以進(jìn)行定制。其具體工作機(jī)制如下圖:
從上圖可看出,Model直接讀取數(shù)據(jù),View可以直接顯示數(shù)據(jù),也可以顯示經(jīng)過(guò)Delegate處理后的數(shù)據(jù)。同時(shí)用戶可以直接通過(guò) Delegate直接編輯數(shù)據(jù)通過(guò)model存入數(shù)據(jù)文件中。models,views,delegates之間通過(guò)信號(hào),槽機(jī)制來(lái)進(jìn)行通訊。
工作機(jī)制:
傳統(tǒng)中View只用來(lái)負(fù)責(zé)數(shù)據(jù)顯示,因此在view創(chuàng)建時(shí)并不需要model只有當(dāng)其顯示信息的時(shí)候才會(huì)用到model。model通過(guò)QAbstractItemMode提供統(tǒng)一的接口,view會(huì)調(diào)用model的index來(lái)獲得一個(gè)indexmodel,然后再通過(guò)indexmodel來(lái)獲得想要得到的data.
model負(fù)責(zé)從數(shù)據(jù)集里面選取合適的數(shù)據(jù)提供給View因此model可以充當(dāng)數(shù)據(jù)的選擇和過(guò)濾器,另一方面可以接收Delegate發(fā)回的信息更新數(shù)據(jù)集中的數(shù)據(jù)信息。
Deletegate是由View層通過(guò)各種signal或者event事件引發(fā),實(shí)現(xiàn)數(shù)據(jù)的更改并通過(guò)Model寫(xiě)入數(shù)據(jù)集中。
?
?
?
?
CodeReview(-)
Code Review
做軟件開(kāi)發(fā)的時(shí)間轉(zhuǎn)眼也有三年有余,所在的團(tuán)隊(duì)也使用了各種各樣的代碼質(zhì)量控制方法,個(gè)人覺(jué)得Code Review是一個(gè)最有效的方法,同時(shí)也是“性價(jià)比”最高的代碼質(zhì)量控制方法。現(xiàn)將個(gè)人的一些觀點(diǎn)和看法總結(jié)一下
什么是Code Review
Code Review 中文的翻譯方式有很多種“代碼審查”,“代碼評(píng)審”,“代碼走查”等,個(gè)人更喜歡“代碼走查”這種翻譯。代碼走查是一個(gè)流程,從開(kāi)發(fā)人員在一個(gè)開(kāi)發(fā)階段寫(xiě)好代碼后開(kāi)始,之后需要?jiǎng)e人以發(fā)現(xiàn)bug和技術(shù)交流為目的review一下他的代碼。它是集代碼審查,找出問(wèn)題,改進(jìn)代碼和改后督查為一體的完整的流程。代碼走查一般在代碼剛剛出爐為最好,因?yàn)樵谶@個(gè)時(shí)候也是代碼重構(gòu)和調(diào)整的最佳時(shí)候。
Code Review的目的及內(nèi)容
功能性Review:
通 過(guò)Review檢查當(dāng)前代碼是否全部實(shí)現(xiàn)了需求里面全部的功能點(diǎn),且功能正確。找出代碼中的bug,每個(gè)人在寫(xiě)和讀代碼的時(shí)候都有固有的習(xí)慣,這樣的一些 習(xí)慣往往會(huì)影響代碼的質(zhì)量。比如:我們?cè)诖a編寫(xiě)過(guò)程中都出現(xiàn)過(guò)類似的問(wèn)題,自己代碼中的問(wèn)題自己無(wú)論看了多少遍都發(fā)現(xiàn)不了,但別人一眼就能發(fā)現(xiàn)問(wèn)題。出現(xiàn)這樣的情況并不是說(shuō)寫(xiě)代碼的人水平不高而是個(gè)人編程中的“無(wú)意識(shí)”錯(cuò)誤。當(dāng)然這也就是結(jié)隊(duì)編程的妙處。
可讀性Review:
代碼做為軟件開(kāi)發(fā)過(guò)程中最實(shí)時(shí)的文檔,同時(shí)為了以后維護(hù)方便一定要有高度的可讀性。可讀性檢查主要檢查代碼風(fēng)格是否嚴(yán)格按照系統(tǒng)代碼風(fēng)格規(guī)定,代碼中是否經(jīng)過(guò)充分的重構(gòu)消除了其中冗余重復(fù)的代碼。代碼結(jié)構(gòu)是否合理。
分享技術(shù)知識(shí):
“三 人行必有我?guī)煛泵總€(gè)人的代碼都有值得別人學(xué)習(xí)的地方,而且團(tuán)隊(duì)中各個(gè)成員水平高低不一,通過(guò)代碼Review使水平高的人的技術(shù)逐漸流向水平低的人培養(yǎng)了 新人。同時(shí)代碼編寫(xiě)者向團(tuán)隊(duì)中的其他人介紹自己所用的技術(shù)和方法,這樣一方面使各種技術(shù)在團(tuán)隊(duì)中得到共享。筆者在當(dāng)前的公司里面遇到這樣一個(gè)案例:
團(tuán) 隊(duì)1在之前的項(xiàng)目開(kāi)發(fā)中用到freetype做中文排版,但是當(dāng)時(shí)沒(méi)有做代碼review。之后團(tuán)隊(duì)2也用到了freetype方面的知識(shí)但因?yàn)椴恢缊F(tuán)隊(duì)1有freetype方面的知識(shí),結(jié)果團(tuán)隊(duì)2又花費(fèi)了大量的時(shí)間和精力去重新研究和學(xué)習(xí)freetype。這樣大大延緩了項(xiàng)目的時(shí)間進(jìn)度。
互為backup:
通過(guò)代碼Review使更多的人了解當(dāng)前模塊的功能,這樣減少了因人員流失而導(dǎo)致對(duì)項(xiàng)目產(chǎn)生的沖擊。
待續(xù)......
?
CodeReview(二)
態(tài)度決定一切:
Code Review 做為軟件開(kāi)發(fā)中的一個(gè)重要環(huán)節(jié),也是人參與和交互度比較高的一個(gè)環(huán)節(jié),參與者對(duì)CodeReview的態(tài)度將會(huì)很大程度上影響Code Review的效果。而程序員又是一群不善于同別人交流的一個(gè)群體,這樣在Code Review的過(guò)程中可能因?yàn)閷?duì)這件事的認(rèn)識(shí)程度和態(tài)度的不同而會(huì)產(chǎn)生很大差距:
對(duì)于代碼的講解者來(lái)說(shuō),一些很有經(jīng)驗(yàn)的程序員往往因?yàn)閷?duì)Code Review的目的等方面認(rèn)識(shí)不足容易犯這樣一種錯(cuò)誤,認(rèn)為自己的代碼不會(huì)有問(wèn)題,這次Code Review就是給別人傳道授業(yè)解惑的。這樣會(huì)出現(xiàn)整個(gè)Code Review的過(guò)程基本拋棄了Code完全只講他實(shí)現(xiàn)的思路和方法,完全成為了一個(gè)知識(shí)講座,但要知道整體設(shè)計(jì)和具體實(shí)現(xiàn)還有很大不同。你的宏觀思路很正 確并不代表你的代碼就沒(méi)有一點(diǎn)問(wèn)題。對(duì)于一些初來(lái)乍到的年輕人則會(huì)走向另一個(gè)極端,一說(shuō)Code Review就像讓他去刑場(chǎng)一樣。就是為了去接受審判而去Code Review,完全依賴于自己的代碼,沒(méi)有把自己在這個(gè)過(guò)程中所學(xué)到的東西全部講出來(lái),這樣也不利于整個(gè)團(tuán)隊(duì)的相互學(xué)習(xí)和提高。
Reviewer的態(tài)度:它們對(duì)Code Review的態(tài)度很大程度上決定了Code Review的效果。常見(jiàn)以下幾種情況:
漠不關(guān)心:這種態(tài)度的來(lái)源主要是覺(jué)得代碼不是自己寫(xiě)的,也不用負(fù)什么責(zé)任,對(duì)代碼走查的實(shí)際含義理解不清。想糊弄過(guò)去湊個(gè)人數(shù)結(jié)束。
藐視別人的代碼:這種心態(tài)長(zhǎng)見(jiàn)于團(tuán)隊(duì)中技術(shù)水平較高的成員中,在別人講解代碼的時(shí)候總覺(jué)得這個(gè)功能很容易實(shí)現(xiàn),自己知道不用聽(tīng)別人講了。這種人缺乏對(duì)團(tuán)隊(duì)的責(zé)任感,和對(duì)團(tuán)隊(duì)成員成果的尊重。
批評(píng)者:這類人對(duì)Code Review的目的是什么認(rèn)識(shí)不清,總以為代碼走查就是找別人的錯(cuò),吊難別人。這種容易忽視別人代碼設(shè)計(jì)中的優(yōu)點(diǎn)。做為程序員每個(gè)人都有自負(fù)的一面,這樣在Code Review時(shí)常常會(huì)出現(xiàn)Code Review就是找別人錯(cuò)誤的錯(cuò)誤認(rèn)識(shí)。
Code Review 的形式:
Code Review做為當(dāng)前常見(jiàn)的一種代碼質(zhì)量和團(tuán)隊(duì)技術(shù)交流的手段常見(jiàn)以下幾種形式:
Peer Review:這種形式是從結(jié)對(duì)編程中抽象出來(lái)的簡(jiǎn)化版。主要由兩個(gè)人完成代碼走查工作,一個(gè)是代碼的編寫(xiě)者,一個(gè)是對(duì)代碼的查看者。先由代碼編寫(xiě)者向代碼走查者對(duì)代碼進(jìn)行簡(jiǎn)單的講解,然后由代碼查看者提出代碼需要改進(jìn)的地方。之后由編寫(xiě)者修改代碼。
Peers Review:這種形式是上面Peer Review的一個(gè)進(jìn)化版增加了代碼查看者的數(shù)量,通過(guò)引入更多的眼睛來(lái)更有效的發(fā)現(xiàn)代碼存在的問(wèn)題,同時(shí)使更多的人了解某一功能的解決方法,也擴(kuò)大了對(duì)該功能的解決方法的討論的范圍。
分角色的多對(duì)一Code Review:和Peers Review不同的地方在于對(duì)Peers進(jìn)行了簡(jiǎn)單的分工,一般分為這樣幾個(gè)角色:Author,moderator,Recorder,Other reviewers。由Author準(zhǔn)備Code Review時(shí)所需的材料并對(duì)材料進(jìn)行簡(jiǎn)單的講解,同時(shí)由moderator檢查所要Code Review的材料是否有效,同時(shí)決定代碼走查時(shí)的一個(gè)整體的走勢(shì)例如不能讓會(huì)議陷入漫無(wú)目的的討論中去,同時(shí)在代碼走查后負(fù)責(zé)檢查對(duì)代碼走查成果的修改工作是否到位。Recorder記錄代碼走查過(guò)程中發(fā)現(xiàn)的問(wèn)題
以上三種形式,其中前兩種形式由于查看者的角色沒(méi)有細(xì)分,在Code Review的時(shí)候容易流于形式,從而使Code Review的效果大大折扣,但上面的形式也有好處,它們都更開(kāi)發(fā)更利于交流。第三種形式是個(gè)人最好的一種形式,將在一下篇文章中詳細(xì)介紹這一形式。
?
CodeReview(3) --- 責(zé)任制
許多年前農(nóng)村土地承包責(zé)任制的出現(xiàn),使之大農(nóng)民的角色發(fā)生了根本性的改變,從而迎來(lái)了糧食產(chǎn)量和農(nóng)民很生活的巨大改善。同時(shí)在CodeRivew 這一個(gè)群體活動(dòng)中,讓其有效運(yùn)行起來(lái)一個(gè)最有效的方法就是分角色同時(shí)對(duì)某一角色賦予一定的責(zé)任。下面就對(duì)在我們團(tuán)體中分角色的Code Review及其流程進(jìn)行一個(gè)簡(jiǎn)單的講解,同時(shí)也想和廣大軟件同仁們一起交流一下關(guān)于CodeReview的一些觀點(diǎn)和看法。因?yàn)槭潜竟镜姆椒ㄋ砸矔?huì) 有不足之處,歡迎討論。
一、Code Review 角色分類
??? 1.Author:被Review對(duì)象的作者。
??? 2.moderator:一般由團(tuán)隊(duì)中開(kāi)發(fā)經(jīng)驗(yàn)豐富的人擔(dān)任。
??? 3.Recorder:主要用于記錄在整個(gè)代碼Review中情況。
??? 4.Reader (may be the same person as Author or leader)
??? 5.Other reviewers:團(tuán)隊(duì)中的其它成員,但是一般不要人太多,因?yàn)閷?duì)于一個(gè)討論會(huì)議一來(lái)說(shuō)一般要將參加會(huì)議的人控制在7人以內(nèi)為最佳,這樣這個(gè)會(huì)議才是可控的。
??? 以上這些角色的職能會(huì)在Code Review中的不階段而發(fā)生變化。
?
二、Code Review的流程及其角色在不同階段的任務(wù)
上圖顯示了整個(gè)Code Review活動(dòng)流程情況,一般在一個(gè)CodeReview活動(dòng)會(huì)中Planning,Preparation,Meeting,Rework&Verfication是必須的,而 Overview階段會(huì)隨著Review對(duì)象的不同而不同,對(duì)于一些Review工作大量的活動(dòng)這個(gè)階段是必須的,下面將詳細(xì)描述每個(gè)階段的任務(wù),以及各 個(gè)角色在相對(duì)應(yīng)階段的責(zé)任。
1.Planning:
這個(gè)階段主要是對(duì)各個(gè)角色人員的確定以及確定所Review的對(duì)象是否已經(jīng)達(dá)到能夠被Review的階段,這樣以防止代碼在仍有很大 問(wèn)題的情況下進(jìn)行Review而導(dǎo)致Review的整體效率太低。還有對(duì)整個(gè)Review過(guò)程所以經(jīng)歷的時(shí)間段有一個(gè)大體的劃分。在這一階段首先由Author確定誰(shuí)來(lái)當(dāng)本次Review的moderator(一般moderator只能從團(tuán)隊(duì)中有限的幾個(gè)人內(nèi)挑選,并不是每個(gè)人都可以充當(dāng)這個(gè)角色的。)然后再邀請(qǐng)別人充當(dāng)本次Review的Recoder,Other reviewers;
這個(gè)階段各個(gè)角色的主要任務(wù)是:
Author:對(duì)整個(gè)Review過(guò)程制定計(jì)劃,確定參加這次Rewview人員,為這些成員分發(fā)要Review的材料。
moderator:對(duì)整個(gè)要Review的對(duì)象進(jìn)行分析查看是否達(dá)到能夠開(kāi)始Code Review的要求。
2.Overview:
對(duì)于大量的東西要Review的項(xiàng)目,或者大部分參與Review的人對(duì)要Review的東西都不是很熟悉的情況下。由Author開(kāi)招開(kāi)一個(gè)簡(jiǎn)短的站會(huì)整體解決一下所要Review的東西。
3.Preparation:
在這個(gè)階段,所有參與的reviewers對(duì)所以review的東西各自進(jìn)行走讀,然后記錄并提交發(fā)現(xiàn)的問(wèn)題,然后由Author和 moderator共同對(duì)reviewers所發(fā)現(xiàn)的問(wèn)題進(jìn)行匯總,分類,甄別。之后根據(jù)匯總上來(lái)的問(wèn)題來(lái)進(jìn)一步判斷是否適合招開(kāi)Review會(huì)議。如果 匯總上來(lái)的問(wèn)題比較多,比較嚴(yán)重則說(shuō)明所要Reivew的文件尚未真正達(dá)到要求,則取消本次活動(dòng)。由Author重新開(kāi)發(fā)。如果發(fā)現(xiàn)的問(wèn)題不是很多,則按 時(shí)招開(kāi)Review Meeting.
?
這個(gè)階段各個(gè)角色的主要任務(wù)是:
reviewers:對(duì)所要Review的對(duì)象各自先進(jìn)行走讀,然后提交各自發(fā)現(xiàn)的問(wèn)題。
moderator和Author:對(duì)reviewers提交上來(lái)的問(wèn)題進(jìn)行匯總總結(jié)查看是否符合Review的條件。
4.meeting:
meeting做為整個(gè)review的核心和關(guān)鍵環(huán)節(jié)其主要任務(wù)是首先由Author主持對(duì)匯總上來(lái)的問(wèn)題,逐個(gè)的分析然后給出自己的判斷,是接受reviewers還是不接受reviewers提出的問(wèn)題。對(duì)于有分歧的問(wèn)題進(jìn)行討論,如果還有分歧則由moderator決定這個(gè)問(wèn)題是否要改怎么 改。在將所有匯總上來(lái)的問(wèn)題分析完后,再由Author帶著所有reviewers對(duì)代碼進(jìn)行走讀。然后進(jìn)一步分析和討論代碼中的問(wèn)題。
?
這個(gè)階段各個(gè)角色的主要任務(wù)是:
Author:逐個(gè)分析匯總上來(lái)的問(wèn)題,并給出自己的分析。帶領(lǐng)所有reviewers對(duì)代碼進(jìn)行走讀;
moderator:分析判斷Author對(duì)問(wèn)題的分析判斷是否合理,在關(guān)鍵時(shí)刻給出分歧問(wèn)題的處理意見(jiàn);
reviewers:討論分析之前提出的問(wèn)題,對(duì)代碼進(jìn)行集體的重新走讀,以發(fā)現(xiàn)更多的問(wèn)題;
Recorder:對(duì)整個(gè)Code Review進(jìn)行記錄,包括發(fā)現(xiàn)的問(wèn)題以及問(wèn)題的整改意見(jiàn)。
?
5.Rework&Verification:
這個(gè)階段主要是Author對(duì)整個(gè)Review過(guò)程提出的問(wèn)題進(jìn)行整改,然后提交由moderator對(duì)整個(gè)整改的情況進(jìn)行評(píng)估。
總結(jié):
通過(guò)對(duì)Code Review中的成員進(jìn)行角色分工,從而賦予他們一定的職責(zé),這樣就能很好的提高他們的責(zé)任感從而大大提高代碼走查的效率。
Const 重載解析
書(shū)上和網(wǎng)上在很多地方都對(duì)const 的重載做了一些解釋,但感覺(jué)都不是很詳細(xì)。還有很多同學(xué)在不同的地方發(fā)問(wèn)關(guān)于const重載的問(wèn)題,這里我又重新看了一下,做了一個(gè)簡(jiǎn)單的分析也可能有不對(duì)的地方,歡迎討論。
所 謂重載,是指允許存在多個(gè)同名函數(shù),而這些函數(shù)的參數(shù)表不同,即函數(shù)名相同但函數(shù)的簽名不同。重載并不是面向?qū)ο缶幊痰奶赜袑傩?#xff0c;這是因?yàn)橹剌d是在編譯階段實(shí)現(xiàn)的,編譯器根據(jù)函數(shù)不同的參數(shù)表,對(duì)同名函數(shù)的名稱做修飾,然后這些同名函數(shù)就成了不同的函數(shù)(這一點(diǎn)稍后有例子)。了
?
?Const 參數(shù)重載解析:
?
關(guān)于const 重載幾乎在所有c++的書(shū)中者提到過(guò)但大部分只是一句話,例如在《C++ primer》一書(shū)中這樣描述:“可基于函數(shù)的引用形參是指向 const 對(duì)象還是指向非 const 對(duì)象,實(shí)現(xiàn)函數(shù)重載。將引用形參定義為 const 來(lái)重載函數(shù)是合法的,因?yàn)榫幾g器可以根據(jù)實(shí)參是否為 const 確定調(diào)用哪一個(gè)函數(shù)。”
但是這一段描述并沒(méi)有給出引用、指針和值傳遞前加const的實(shí)質(zhì)區(qū)別是什么。在用非const的指針,引用和值均可轉(zhuǎn)化為const的。這一點(diǎn)沒(méi)有太多可說(shuō)明的東東。
對(duì)于函數(shù)值傳遞的情況,因?yàn)閰?shù)傳遞是通過(guò)復(fù)制實(shí)參創(chuàng)建一個(gè)臨時(shí)變量傳遞進(jìn)函數(shù)的,函數(shù)內(nèi)只能改變臨時(shí)變量,但無(wú)法改變實(shí)參。則這個(gè)時(shí)候無(wú)論加不加 const對(duì)實(shí)參不會(huì)產(chǎn)生任何影響。但是在引用或指針傳遞函數(shù)調(diào)用中,因?yàn)閭鬟M(jìn)去的是一個(gè)引用或指針,這樣函數(shù)內(nèi)部可以改變引用或指針?biāo)赶虻淖兞?#xff0c;這時(shí) const 才是實(shí)實(shí)在在地保護(hù)了實(shí)參所指向的變量。因?yàn)樵诰幾g階段編譯器對(duì)調(diào)用函數(shù)的選擇是根據(jù)實(shí)參進(jìn)行的,所以,只有引用傳遞和指針傳遞可以用是否加const來(lái) 重載。
下面給出一個(gè)例子可能就更明白了:
?
C++ 代碼
?1 #include<iostream>
?2
?3?class A{
?4?public:
?5????A();
?6????int foo(int *test);
?7????int foo(const int *test);
?8};
?9A::A(){
10 }
11 ?int A::foo(int *test){
12 ????std::cout << *test << " A::foo(int *test)" <<std::endl;
13 ????return 1;
14 }
15 ?int A::foo(const int *test){
16 ????std::cout << *test << " A::foo(const int *test)" <<std::endl;
17 ????return 1;
18 }
19 ?int main()
20 {
21 ????const int b =5;
22 ????int c = 3;
23 ????A a;
24 ????a.foo(&b);
25 ????a.foo(&c);
26 ????return 1;
27 }
28 ?
復(fù)制代碼
?
?
輸出:
?
5 A::foo(const int *test)
3 A::foo(int *test)
?
?
那么編譯器又是怎樣工作的,通過(guò)g++ -S選項(xiàng)將匯編代碼生成出來(lái),通過(guò)AT&T匯編代碼可以看出一些端倪來(lái)(之所以用AT&T匯編是因?yàn)閂S生成的中間代碼實(shí)在是讓人頭暈):
?
代碼
? 1 .file??? "overload.cpp"
? 2????.section???.ctors,"aw",@progbits
? 3????.align 4
? 4????.long??? _GLOBAL__I__ZN1AC2Ev
? 5????.text
? 6????.align 2
? 7.globl _ZN1AC2Ev
? 8????.type??? _ZN1AC2Ev, @function
? 9?_ZN1AC2Ev:
?10.LFB1399:
?11????pushl??? %ebp
?12.LCFI0:
?13????movl??? %esp, %ebp
?14.LCFI1:
?15????popl??? %ebp
?16????ret
?17.LFE1399:
?18????.size??? _ZN1AC2Ev, .-_ZN1AC2Ev
?19.globl __gxx_personality_v0
?20????.align 2
?21.globl _ZN1AC1Ev
?22????.type??? _ZN1AC1Ev, @function
?23?_ZN1AC1Ev:
?24.LFB1400:
?25????pushl??? %ebp
?26.LCFI2:
?27????movl??? %esp, %ebp
?28.LCFI3:
?29????popl??? %ebp
?30????ret
?31.LFE1400:
?32????.size??? _ZN1AC1Ev, .-_ZN1AC1Ev
?33????.align 2
?34????.type??? _Z41__static_initialization_and_destruction_0ii,@function
?35?_Z41__static_initialization_and_destruction_0ii:
?36.LFB1411:
?37????pushl??? %ebp
?38.LCFI4:
?39????movl??? %esp, %ebp
?40.LCFI5:
?41????subl??? $24, %esp
?42.LCFI6:
?43????movl??? %eax, -4(%ebp)
?44????movl??? %edx, -8(%ebp)
?45????cmpl??? $1, -4(%ebp)
?46????jne??? .L9
?47????cmpl??? $65535, -8(%ebp)
?48????jne??? .L9
?49????movl??? $_ZSt8__ioinit, (%esp)
?50????call??? _ZNSt8ios_base4InitC1Ev
?51????movl??? $__dso_handle, 8(%esp)
?52????movl??? $0, 4(%esp)
?53????movl??? $__tcf_0, (%esp)
?54????call??? __cxa_atexit
?55.L9:
?56????leave
?57????ret
?58.LFE1411:
?59????.size???_Z41__static_initialization_and_destruction_0ii,.-_Z41__static_initialization_and_destruction_0ii
?60????.align 2
?61????.type??? _GLOBAL__I__ZN1AC2Ev, @function
?62?_GLOBAL__I__ZN1AC2Ev:
?63.LFB1413:
?64????pushl??? %ebp
?65.LCFI7:
?66????movl??? %esp, %ebp
?67.LCFI8:
?68????subl??? $8, %esp
?69.LCFI9:
?70????movl??? $65535, %edx
?71????movl??? $1, %eax
?72????call???_Z41__static_initialization_and_destruction_0ii
?73????leave
?74????ret
?75.LFE1413:
?76????.size??? _GLOBAL__I__ZN1AC2Ev,.-_GLOBAL__I__ZN1AC2Ev
?77????.align 2
?78????.type??? __tcf_0, @function
?79?__tcf_0:
?80.LFB1412:
?81????pushl??? %ebp
?82.LCFI10:
?83????movl??? %esp, %ebp
?84.LCFI11:
?85????subl??? $8, %esp
?86.LCFI12:
?87????movl??? $_ZSt8__ioinit, (%esp)
?88????call??? _ZNSt8ios_base4InitD1Ev
?89????leave
?90????ret
?91.LFE1412:
?92????.size??? __tcf_0, .-__tcf_0
?93????.section???.rodata
?94.LC0:
?95????.string???" A::foo(const int *test)"
?96????.text
?97????.align 2
?98.globl _ZN1A3fooEPKi
?99????.type??? _ZN1A3fooEPKi, @function
100 ?_ZN1A3fooEPKi:
101 .LFB1402:
102 ????pushl???%ebp
103 .LCFI13:
104 ????movl???%esp, %ebp
105 .LCFI14:
106 ????subl???$8,%esp
107 .LCFI15:
108 ????movl???12(%ebp),%eax
109 ????movl???(%eax), %eax
110 ????movl???%eax, 4(%esp)
111 ????movl???$_ZSt4cout, (%esp)
112 ????call??? _ZNSolsEi
113 ????movl???$.LC0, 4(%esp)
114 ????movl???%eax, (%esp)
115 ????call???_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
116 ????movl???$_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, 4(%esp)
117 ????movl???%eax, (%esp)
118 ????call? ??_ZNSolsEPFRSoS_E
119 ????movl???$1,%eax
120 ????leave
121 ????ret
122 .LFE1402:
123 ????.size???_ZN1A3fooEPKi, .-_ZN1A3fooEPKi
124 ????.section???.rodata
125 .LC1:
126 ????.string???" A::foo(int *test)"
127 ????.text
128 ????.align 2
129 .globl_ZN1A3fooEPi
130 ????.type???_ZN1A3fooEPi, @function
131 ?_ZN1A3fooEPi:
132 .LFB1401:
133 ????pushl???%ebp
134 .LCFI16:
135 ????movl???%esp, %ebp
136 .LCFI17:
137 ????subl???$8,%esp
138 .LCFI18:
139 ????movl???12(%ebp),%eax
140 ????movl???(%eax), %eax
141 ????movl???%eax, 4(%esp)
142 ????movl???$_ZSt4cout, (%esp)
143 ????call??? _ZNSolsEi
144 ????movl???$.LC1, 4(%esp)
145 ????movl???%eax, (%esp)
146 ????call???_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
147 ????movl???$_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, 4(%esp)
148 ????movl???%eax, (%esp)
149 ????call??? _ZNSolsEPFRSoS_E
150 ????movl???$1,%eax
151 ????leave
152 ????ret
153 .LFE1401:
154 ????.size???_ZN1A3fooEPi, .-_ZN1A3fooEPi
155 ????.align 2
156 .globlmain
157 ????.type???main, @function
158 ?main:
159 .LFB1403:
160 ????leal???4(%esp),%ecx
161 .LCFI19:
162 ????andl???$-16,%esp
163 ????pushl???-4(%ecx)
164 .LCFI20:
165 ????pushl???%ebp
166 .LCFI21:
167 ????movl???%esp, %ebp
168 .LCFI22:
169 ????pushl???%ecx
170 .LCFI23:
171 ????subl???$36,%esp
172 .LCFI24:
173 ????movl???$5, -8(%ebp)
174 ????movl???$3, -12(%ebp)
175 ????leal???-13(%ebp),%eax
176 ????movl???%eax, (%esp)
177 ????call??? _ZN1AC1Ev
178 ????leal???-8(%ebp),%eax
179 ????movl???%eax, 4(%esp)
180 ????leal???-13(%ebp),%eax
181 ????movl???%eax, (%esp)
182 ????call??? _ZN1A3fooEPKi
183 ????leal???-12(%ebp),%eax
184 ????movl???%eax, 4(%esp)
185 ????leal???-13(%ebp),%eax
186 ????movl???%eax, (%esp)
187 ????call??? _ZN1A3fooEPi
188 ????movl???$1,%eax
189 ????addl???$36,%esp
190 ????popl???%ecx
191 ????popl???%ebp
192 ????leal???-4(%ecx),%esp
193 ????ret
194 .LFE1403:
195 ????.size???main, .-main
196 ????.local???_ZSt8__ioinit
197 ????.comm???_ZSt8__ioinit,1,1
198 ????.weakref???_Z20__gthrw_pthread_oncePiPFvvE,pthread_once
199 ????.weakref???_Z27__gthrw_pthread_getspecificj,pthread_getspecific
200 ????.weakref???_Z27__gthrw_pthread_setspecificjPKv,pthread_setspecific
201 ????.weakref???_Z22__gthrw_pthread_createPmPK14pthread_attr_tPFPvS3_ES3_,pthread_create
202 ????.weakref???_Z22__gthrw_pthread_cancelm,pthread_cancel
203 ????.weakref???_Z26__gthrw_pthread_mutex_lockP15pthread_mutex_t,pthread_mutex_lock
204 ????.weakref???_Z29__gthrw_pthread_mutex_trylockP15pthread_mutex_t,pthread_mutex_trylock
205 ????.weakref???_Z28__gthrw_pthread_mutex_unlockP15pthread_mutex_t,pthread_mutex_unlock
206 ????.weakref???_Z26__gthrw_pthread_mutex_initP15pthread_mutex_tPK19pthread_mutexattr_t,pthread_mutex_init
207 ????.weakref???_Z26__gthrw_pthread_key_createPjPFvPvE,pthread_key_create
208 ????.weakref???_Z26__gthrw_pthread_key_deletej,pthread_key_delete
209 ????.weakref???_Z30__gthrw_pthread_mutexattr_initP19pthread_mutexattr_t,pthread_mutexattr_init
210 ????.weakref???_Z33__gthrw_pthread_mutexattr_settypeP19pthread_mutexattr_ti,pthread_mutexattr_settype
211 ????.weakref???_Z33__gthrw_pthread_mutexattr_destroyP19pthread_mutexattr_t,pthread_mutexattr_destroy
212 ????.section???.eh_frame,"a",@progbits
213 .Lframe1:
214 ????.long???.LECIE1-.LSCIE1
215 .LSCIE1:
216 ????.long???0x0
217 ????.byte???0x1
218 ????.string???"zP"
219 ????.uleb128 0x1
220 ????.sleb128 -4
221 ????.byte???0x8
222 ????.uleb128 0x5
223 ????.byte???0x0
224 ????.long???__gxx_personality_v0
225 ????.byte???0xc
226 ????.uleb128 0x4
227 ????.uleb128 0x4
228 ????.byte???0x88
229 ????.uleb128 0x1
230 ????.align 4
231 .LECIE1:
232 .LSFDE5:
233 ????.long???.LEFDE5-.LASFDE5
234 .LASFDE5:
235 ????.long???.LASFDE5-.Lframe1
236 ????.long???.LFB1411
237 ????.long???.LFE1411-.LFB1411
238 ????.uleb128 0x0
239 ????.byte???0x4
240 ????.long???.LCFI4-.LFB1411
241 ????.byte???0xe
242 ????.uleb128 0x8
243 ????.byte???0x85
244 ????.uleb128 0x2
245 ????.byte???0x4
246 ????.long???.LCFI5-.LCFI4
247 ????.byte???0xd
248 ????.uleb128 0x5
249 ????.align 4
250 .LEFDE5:
251 .LSFDE7:
252 ????.long???.LEFDE7-.LASFDE7
253 .LASFDE7:
254 ????.long???.LASFDE7-.Lframe1
255 ????.long???.LFB1413
256 ????.long???.LFE1413-.LFB1413
257 ????.uleb128 0x0
258 ????.byte???0x4
259 ????.long???.LCFI7-.LFB1413
260 ????.byte???0xe
261 ????.uleb128 0x8
262 ????.byte???0x85
263 ????.uleb128 0x2
264 ????.byte???0x4
265 ????.long???.LCFI8-.LCFI7
266 ????.byte???0xd
267 ????.uleb128 0x5
268 ????.align 4
269 .LEFDE7:
270 .LSFDE9:
271 ????.long???.LEFDE9-.LASFDE9
272 .LASFDE9:
273 ????.long???.LASFDE9-.Lframe1
274 ????.long???.LFB1412
275 ????.long???.LFE1412-.LFB1412
276 ????.uleb128 0x0
277 ????.byte???0x4
278 ????.long???.LCFI10-.LFB1412
279 ????.byte???0xe
280 ????.uleb128 0x8
281 ????.byte???0x85
282 ????.uleb128 0x2
283 ????.byte???0x4
284 ????.long???.LCFI11-.LCFI10
285 ????.byte???0xd
286 ????.uleb128 0x5
287 ????.align 4
288 .LEFDE9:
289 .LSFDE11:
290 ????.long???.LEFDE11-.LASFDE11
291 .LASFDE11:
292 ????.long???.LASFDE11-.Lframe1
293 ????.long???.LFB1402
294 ????.long???.LFE1402-.LFB1402
295 ????.uleb128 0x0
296 ????.byte???0x4
297 ????.long???.LCFI13-.LFB1402
298 ????.byte???0xe
299 ????.uleb128 0x8
300 ????.byte???0x85
301 ????.uleb128 0x2
302 ????.byte???0x4
303 ????.long???.LCFI14-.LCFI13
304 ????.byte???0xd
305 ????.uleb128 0x5
306 ????.align 4
307 .LEFDE11:
308 .LSFDE13:
309 ????.long???.LEFDE13-.LASFDE13
310 .LASFDE13:
311 ????.long???.LASFDE13-.Lframe1
312 ????.long???.LFB1401
313 ????.long???.LFE1401-.LFB1401
314 ????.uleb128 0x0
315 ????.byte???0x4
316 ????.long???.LCFI16-.LFB1401
317 ????.byte???0xe
318 ????.uleb128 0x8
319 ????.byte???0x85
320 ????.uleb128 0x2
321 ????.byte???0x4
322 ????.long???.LCFI17-.LCFI16
323 ????.byte ???0xd
324 ????.uleb128 0x5
325 ????.align 4
326 .LEFDE13:
327 .LSFDE15:
328 ????.long???.LEFDE15-.LASFDE15
329 .LASFDE15:
330 ????.long???.LASFDE15-.Lframe1
331 ????.long???.LFB1403
332 ????.long???.LFE1403-.LFB1403
333 ????.uleb128 0x0
334 ????.byte ???0x4
335 ????.long???.LCFI19-.LFB1403
336 ????.byte???0xc
337 ????.uleb128 0x1
338 ????.uleb128 0x0
339 ????.byte???0x9
340 ????.uleb128 0x4
341 ????.uleb128 0x1
342 ????.byte???0x4
343 ????.long???.LCFI20-.LCFI19
344 ????.byte???0xc
345 ????.uleb128 0x4
346 ????.uleb128 0x4
347 ????.byte???0x4
348 ????.long???.LCFI21-.LCFI20
349 ????.byte???0xe
350 ????.uleb128 0x8
351 ????.byte???0x85
352 ????.uleb128 0x2
353 ????.byte???0x4
354 ????.long???.LCFI22-.LCFI21
355 ????.byte???0xd
356 ????.uleb128 0x5
357 ????.byte???0x4
358 ????.long???.LCFI23-.LCFI22
359 ????.byte???0x84
360 ????.uleb128 0x3
361 ????.align 4
362 .LEFDE15:
363 ????.ident???"GCC: (GNU) 4.1.2 20070925 (RedHat 4.1.2-33)"
364 ????.section???.note.GNU-stack,"",@progbits
復(fù)制代碼
如上面的代碼函數(shù):
?
int foo(int *test);和int foo(constint *test);分別被編譯器生成名為:_ZN1A3fooEPKi和_ZN1A3fooEPi(這兩個(gè)名字會(huì)因?yàn)榫幾g器的不同而不同,名字只是一個(gè)區(qū)分的 符號(hào)而已不用深究,只用知道重載的函數(shù)經(jīng)過(guò)編譯器的處理函數(shù)名字已經(jīng)發(fā)生了變化。所以對(duì)于后面的匯編和鏈接工作就不存在重載的問(wèn)題了。)這里也同時(shí)說(shuō)明對(duì)重載來(lái)說(shuō)在編譯階段已經(jīng)完成。
對(duì)于a.foo(&b);因?yàn)樽兞縝有const修飾所以就調(diào)用了int foo(const int *test);對(duì)于a.foo(&c);調(diào)用int foo(int *test);因?yàn)檫@個(gè)是精確匹配的。但是如果沒(méi)有定義intfoo(const int *test);則在代碼24行會(huì)出現(xiàn)編譯錯(cuò)誤。反過(guò)來(lái)如果沒(méi)有定義函數(shù):int foo(int *test);如下:
?
代碼
?1 #include<iostream>
?2
?3?class A{
?4?public:
?5????A();
?6?//??? int foo(int *test);
?7???? int foo(const int *test);
?8};
?9A::A(){
10 }
11 ?/*int A::foo(int *test){
12 ????std::cout << *test << "A::foo(int *test)" <<std::endl;
13 ????return 1;
14 }
15 */
16 int A::foo(const int *test){
17 ????std::cout << *test << " A::foo(const int *test)" <<std::endl;
18 ????return 1;
19 }
20 int main()
21 {
22 ????const int b =5;
23 ????int c = 3;
24 ????A a;
25 ????a.foo(&b);
26 ????a.foo(&c);
27 ????return 1;
28 }
復(fù)制代碼
則輸出結(jié)果為:
?
?
1 5 A::foo(const int *test)
2 3 A::foo(const int *test)
?
原因c++ primer上講的很清楚:“We can use a nonconst object to initializer either a const or nonconst reference. However, initializing a const reference to anonconst object requires a conversion, whereas initializing a nonconst parameter is an exact match.”
?
?
const 成員函數(shù)重載的解析:
?
const 成員函數(shù)重載的解析和const參數(shù)重載解析的原理可以說(shuō)是一樣的。之所以這樣說(shuō)是因?yàn)閏onst成員函數(shù)的解析可被看做是對(duì)函數(shù)this參數(shù)用const來(lái)修飾的過(guò)程。例如下面代碼:
?
代碼
?1 #include<iostream>
?2
?3class A{
?4public:
?5????A();
?6????int foo(int *test); //可看做:int foo(A *this,int *test);
?7 ????int foo(int *test) const;//可看做:int foo(const A *this,int *test);
?8 };
?9A::A(){
10 }
11 int A::foo(int *test){
12 ????std::cout << *test << "foo"<<std::endl;
13 ????return 1;
14 }
15 int A::foo(int *test) const {
16 ????std::cout << *test << "foo const"<<std::endl;
17 ????return 1;
18 }
19 int main()
20 {
21 ????int b = 5;
22 ????const A a;
23 ????a.foo(&b);
24 ????return 1;
25 }
26
復(fù)制代碼
生成匯編為:
代碼
? 1 ????.file???"overload1.cpp"
? 2????.section???.ctors,"aw",@progbits
? 3????.align 4
? 4????.long??? _GLOBAL__I__ZN1AC2Ev
? 5????.text
? 6????.align 2
? 7.globl _ZN1AC2Ev
? 8????.type??? _ZN1AC2Ev, @function
? 9_ZN1AC2Ev:
?10.LFB1399:
?11????pushl??? %ebp
?12.LCFI0:
?13????movl??? %esp, %ebp
?14.LCFI1:
?15????popl??? %ebp
?16????ret
?17.LFE1399:
?18????.size??? _ZN1AC2Ev, .-_ZN1AC2Ev
?19.globl __gxx_personality_v0
?20????.align 2
?21.globl _ZN1AC1Ev
?22????.type??? _ZN1AC1Ev, @function
?23_ZN1AC1Ev:
?24.LFB1400:
?25????pushl??? %ebp
?26.LCFI2:
?27????movl??? %esp, %ebp
?28.LCFI3:
?29????popl??? %ebp
?30????ret
?31.LFE1400:
?32????.size??? _ZN1AC1Ev, .-_ZN1AC1Ev
?33????.align 2
?34????.type???_Z41__static_initialization_and_destruction_0ii, @function
?35_Z41__static_initialization_and_destruction_0ii:
?36.LFB1411:
?37????pushl??? %ebp
?38.LCFI4:
?39????movl ???%esp, %ebp
?40.LCFI5:
?41????subl??? $24, %esp
?42.LCFI6:
?43????movl??? %eax, -4(%ebp)
?44????movl??? %edx, -8(%ebp)
?45????cmpl??? $1, -4(%ebp)
?46????jne??? .L9
?47????cmpl??? $65535, -8(%ebp)
?48????jne??? .L9
?49????movl??? $_ZSt8__ioinit, (%esp)
?50????call??? _ZNSt8ios_base4InitC1Ev
?51????movl??? $__dso_handle, 8(%esp)
?52????movl??? $0, 4(%esp)
?53????movl??? $__tcf_0, (%esp)
?54????call??? __cxa_atexit
?55.L9:
?56????leave
?57????ret
?58.LFE1411:
?59????.size? ??_Z41__static_initialization_and_destruction_0ii,.-_Z41__static_initialization_and_destruction_0ii
?60????.align 2
?61????.type??? _GLOBAL__I__ZN1AC2Ev, @function
?62_GLOBAL__I__ZN1AC2Ev:
?63.LFB1413:
?64????pushl??? %ebp
?65.LCFI7:
?66????movl?? ?%esp,%ebp
?67.LCFI8:
?68????subl??? $8, %esp
?69.LCFI9:
?70????movl??? $65535, %edx
?71????movl??? $1, %eax
?72????call???_Z41__static_initialization_and_destruction_0ii
?73????leave
?74????ret
?75.LFE1413:
?76????.size??? _GLOBAL__I__ZN1AC2Ev,.-_GLOBAL__I__ZN1AC2Ev
?77????.align 2
?78????.type??? __tcf_0, @function
?79__tcf_0:
?80.LFB1412:
?81????pushl??? %ebp
?82.LCFI10:
?83????movl??? %esp, %ebp
?84.LCFI11:
?85????subl??? $8, %esp
?86.LCFI12:
?87????movl??? $_ZSt8__ioinit, (%esp)
?88????call??? _ZNSt8ios_base4InitD1Ev
?89????leave
?90????ret
?91.LFE1412:
?92????.size??? __tcf_0, .-__tcf_0
?93????.section???.rodata
?94.LC0:
?95????.string???"foo const"
?96????.text
?97????.align 2
?98.globl _ZNK1A3fooEPi
?99????.type??? _ZNK1A3fooEPi, @function
100 _ZNK1A3fooEPi:
101 .LFB1402:
102 ????pushl???%ebp
103 .LCFI13:
104 ????movl???%esp, %ebp
105 .LCFI14:
106 ????subl???$8,%esp
107 .LCFI15:
108 ????movl???12(%ebp),%eax
109 ????movl???(%eax), %eax
110 ????movl???%eax, 4(%esp)
111 ????movl???$_ZSt4cout, (%esp)
112 ????call??? _ZNSolsEi
113 ????movl???$.LC0, 4(%esp)
114 ????movl???%eax, (%esp)
115 ????call???_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
116 ????movl???$_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, 4(%esp)
117 ????movl???%eax, (%esp)
118 ????call??? _ZNSolsEPFRSoS_E
119 ????movl???$1,%eax
120 ????leave
121 ????ret
122 .LFE1402:
123 ????.size???_ZNK1A3fooEPi, .-_ZNK1A3fooEPi
124 ????.align 2
125 .globlmain
126 ????.type???main, @function
127 main:
128 .LFB1403:
129 ????leal???4(%esp),%ecx
130 .LCFI16:
131 ????andl???$-16,%esp
132 ????pushl???-4(%ecx)
133 .LCFI17:
134 ????pushl???%ebp
135 .LCFI18:
136 ????movl???%esp, %ebp
137 .LCFI19:
138 ????pushl???%ecx
139 .LCFI20:
140 ????subl???$36,%esp
141 .LCFI21:
142 ????movl???$5, -8(%ebp)
143 ????leal???-9(%ebp),%eax
144 ????movl???%eax, (%esp)
145 ????call??? _ZN1AC1Ev
146 ????leal???-8(%ebp),%eax
147 ????movl???%eax, 4(%esp)
148 ????leal???-9(%ebp),%eax
149 ????movl???%eax, (%esp)
150 ????call??? _ZNK1A3fooEPi
151 ????movl???$1,%eax
152 ????addl???$36,%esp
153 ????popl???%ecx
154 ????popl???%ebp
155 ????leal???-4(%ecx),%esp
156 ????ret
157 .LFE1403:
158 ????.size ???main, .-main
159 ????.section???.rodata
160 .LC1:
161 ????.string???"foo"
162 ????.text
163 ????.align 2
164 .globl_ZN1A3fooEPi
165 ????.type???_ZN1A3fooEPi, @function
166 _ZN1A3fooEPi:
167 .LFB1401:
168 ????pushl???%ebp
169 .LCFI22:
170 ????movl???%esp, %ebp
171 .LCFI23:
172 ????subl???$8,%esp
173 .LCFI24:
174 ????movl???12(%ebp),%eax
175 ????movl???(%eax), %eax
176 ????movl???%eax, 4(%esp)
177 ????movl???$_ZSt4cout, (%esp)
178 ????call??? _ZNSolsEi
179 ????movl???$.LC1, 4(%esp)
180 ????movl???%eax, (%esp)
181 ????call???_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
182 ????movl???$_ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_, 4(%esp)
183 ????movl???%eax, (%esp)
184 ????call??? _ZNSolsEPFRSoS_E
185 ????movl???$1,%eax
186 ????leave
187 ????ret
188 .LFE1401:
189 ????.size???_ZN1A3fooEPi, .-_ZN1A3fooEPi
190 ????.local???_ZSt8__ioinit
191 ????.comm???_ZSt8__ioinit,1,1
192 ????.weakref???_Z20__gthrw_pthread_oncePiPFvvE,pthread_once
193 ????.weakref???_Z27__gthrw_pthread_getspecificj,pthread_getspecific
194 ????.weakref???_Z27__gthrw_pthread_setspecificjPKv,pthread_setspecific
195 ????.weakref???_Z22__gthrw_pthread_createPmPK14pthread_attr_tPFPvS3_ES3_,pthread_create
196 ????.weakref???_Z22__gthrw_pthread_cancelm,pthread_cancel
197 ????.weakref???_Z26__gthrw_pthread_mutex_lockP15pthread_mutex_t,pthread_mutex_lock
198 ????.weakref???_Z29__gthrw_pthread_mutex_trylockP15pthread_mutex_t,pthread_mutex_trylock
199 ????.weakref???_Z28__gthrw_pthread_mutex_unlockP15pthread_mutex_t,pthread_mutex_unlock
200 ????.weakref???_Z26__gthrw_pthread_mutex_initP15pthread_mutex_tPK19pthread_mutexattr_t,pthread_mutex_init
201 ????.weakref???_Z26__gthrw_pthread_key_createPjPFvPvE,pthread_key_create
202 ????.weakref???_Z26__gthrw_pthread_key_deletej,pthread_key_delete
203 ????.weakref???_Z30__gthrw_pthread_mutexattr_initP19pthread_mutexattr_t,pthread_mutexattr_init
204 ????.weakref???_Z33__gthrw_pthread_mutexattr_settypeP19pthread_mutexattr_ti,pthread_mutexattr_settype
205 ????.weakref???_Z33__gthrw_pthread_mutexattr_destroyP19pthread_mutexattr_t,pthread_mutexattr_destroy
206 ????.section???.eh_frame,"a",@progbits
207 .Lframe1:
208 ????.long???.LECIE1-.LSCIE1
209 .LSCIE1:
210 ????.long???0x0
211 ????.byte???0x1
212 ????.string???"zP"
213 ????.uleb128 0x1
214 ????.sleb128 -4
215 ????.byte???0x8
216 ????.uleb128 0x5
217 ????.byte???0x0
218 ????.long???__gxx_personality_v0
219 ????.byte???0xc
220 ????.uleb128 0x4
221 ????.uleb128 0x4
222 ????.byte???0x88
223 ????.uleb128 0x1
224 ????.align 4
225 .LECIE1:
226 .LSFDE5:
227 ????.long???.LEFDE5-.LASFDE5
228 .LASFDE5:
229 ????.long???.LASFDE5-.Lframe1
230 ????.long???.LFB1411
231 ????.long???.LFE1411-.LFB1411
232 ????.uleb128 0x0
233 ????.byte???0x4
234 ????.long???.LCFI4-.LFB1411
235 ????.byte???0xe
236 ????.uleb128 0x8
237 ????.byte???0x85
238 ????.uleb128 0x2
239 ????.byte???0x4
240 ????.long???.LCFI5-.LCFI4
241 ????.byte???0xd
242 ????.uleb128 0x5
243 ????.align 4
244 .LEFDE5:
245 .LSFDE7:
246 ????.long???.LEFDE7-.LASFDE7
247 .LASFDE7:
248 ????.long???.LASFDE7-.Lframe1
249 ????.long???.LFB1413
250 ????.long???.LFE1413-.LFB1413
251 ????.uleb128 0x0
252 ????.byte???0x4
253 ????.long???.LCFI7-.LFB1413
254 ????.byte???0xe
255 ????.uleb128 0x8
256 ????.byte???0x85
257 ????.uleb128 0x2
258 ????.byte???0x4
259 ????.long???.LCFI8-.LCFI7
260 ????.byte???0xd
261 ????.uleb128 0x5
262 ????.align 4
263 .LEFDE7:
264 .LSFDE9:
265 ????.long???.LEFDE9-.LASFDE9
266 .LASFDE9:
267 ????.long???.LASFDE9-.Lframe1
268 ????.long???.LFB1412
269 ????.long???.LFE1412-.LFB1412
270 ????.uleb128 0x0
271 ????.byte???0x4
272 ????.long???.LCFI10-.LFB1412
273 ????.byte???0xe
274 ????.uleb128 0x8
275 ????.byte???0x85
276 ????.uleb128 0x2
277 ????.byte???0x4
278 ????.long???.LCFI11-.LCFI10
279 ????.byte???0xd
280 ????.uleb128 0x5
281 ????.align 4
282 .LEFDE9:
283 .LSFDE11:
284 ????.long???.LEFDE11-.LASFDE11
285 .LASFDE11:
286 ????.long???.LASFDE11-.Lframe1
287 ????.long???.LFB1402
288 ????.long???.LFE1402-.LFB1402
289 ????.uleb128 0x0
290 ????.byte???0x4
291 ????.long???.LCFI13-.LFB1402
292 ????.byte???0xe
293 ????.uleb128 0x8
294 ????.byte???0x85
295 ????.uleb128 0x2
296 ????.byte???0x4
297 ????.long???.LCFI14-.LCFI13
298 ????.byte???0xd
299 ????.uleb128 0x5
300 ????.align 4
301 .LEFDE11:
302 .LSFDE13:
303 ????.long???.LEFDE13-.LASFDE13
304 .LASFDE13:
305 ????.long???.LASFDE13-.Lframe1
306 ????.long???.LFB1403
307 ????.long???.LFE1403-.LFB1403
308 ????.uleb128 0x0
309 ????.byte???0x4
310 ????.long???.LCFI16-.LFB1403
311 ????.byte???0xc
312 ????.uleb128 0x1
313 ????.uleb128 0x0
314 ????.byte???0x9
315 ????.uleb128 0x4
316 ????.uleb128 0x1
317 ????.byte???0x4
318 ????.long???.LCFI17-.LCFI16
319 ????.byte???0xc
320 ????.uleb128 0x4
321 ????.uleb128 0x4
322 ????.byte???0x4
323 ????.long???.LCFI18-.LCFI17
324 ????.byte???0xe
325 ????.uleb128 0x8
326 ????.byte???0x85
327 ????.uleb128 0x2
328 ????.byte???0x4
329 ????.long???.LCFI19-.LCFI18
330 ????.byte???0xd
331 ????.uleb128 0x5
332 ????.byte???0x4
333 ????.long???.LCFI20-.LCFI19
334 ????.byte???0x84
335 ????.uleb128 0x3
336 ????.align 4
337 .LEFDE13:
338 .LSFDE15:
339 ????.long???.LEFDE15-.LASFDE15
340 .LASFDE15:
341 ????.long???.LASFDE15-.Lframe1
342 ????.long???.LFB1401
343 ????.long???.LFE1401-.LFB1401
344 ????.uleb128 0x0
345 ????.byte???0x4
346 ????.long???.LCFI22-.LFB1401
347 ????.byte???0xe
348 ????.uleb128 0x8
349 ????.byte???0x85
350 ????.uleb128 0x2
351 ????.byte???0x4
352 ????.long???.LCFI23-.LCFI22
353 ????.byte???0xd
354 ????.uleb128 0x5
355 ????.align 4
356 .LEFDE15:
357 ????.ident???"GCC: (GNU) 4.1.2 20070925 (RedHat 4.1.2-33)"
358 ????.section???.note.GNU-stack,"",@progbits
359
復(fù)制代碼
上面可以看到編譯階段的調(diào)用也是通過(guò)對(duì)重載函數(shù)的別名來(lái)實(shí)現(xiàn)的。
總結(jié):
1.const重載主要是通過(guò)能否對(duì)傳入的參數(shù)進(jìn)行修改為判斷的。
2.const參數(shù)重載和const函數(shù)重載機(jī)制都是一樣的,因?yàn)閷?duì)于const 函數(shù)重載可看做是對(duì)隱含的指針this的參數(shù)重載。
3.重載是在編譯階段已經(jīng)完成,對(duì)于匯編和鏈接來(lái)說(shuō)透明的。
?
分享到:
- 上一篇:H.264視頻編解碼的代碼移植和優(yōu)化
- 下一篇:v4l打開(kāi)video設(shè)備 ,執(zhí)行VIDIOC_DQBUF,出現(xiàn)Resource temporarily unavailable 問(wèn)題
總結(jié)
以上是生活随笔為你收集整理的x264 代码重点详解 详细分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 设置电子围栏 高德地图_地理围栏-API
- 下一篇: matlab 天线设计 泰勒加权_泰勒加