3atv精品不卡视频,97人人超碰国产精品最新,中文字幕av一区二区三区人妻少妇,久久久精品波多野结衣,日韩一区二区三区精品

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

x264 代码重点详解 详细分析

發(fā)布時(shí)間:2024/3/12 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 x264 代码重点详解 详细分析 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

eg mplayer x264 代碼重點(diǎn)詳解 詳細(xì)分析

分類: ffmpeg 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)單的需求:

  • 把其他編碼的視頻轉(zhuǎn)換為指定碼率的H.264;
  • 在轉(zhuǎn)換過(guò)程中做一些簡(jiǎn)單的處理(例如增刪水印、字幕的處理、聲音的處理等);
  • 需要封裝成指定的一種container格式,比如mp4或mkv。
  • ?

    ffmpeg完成此項(xiàng)工作的大概過(guò)程是:

  • 識(shí)別文件格式,打開(kāi)視頻文件容器,得到video_stream;
  • 使用libavcodec把video_stream解碼成原始的frame數(shù)據(jù);
  • 在frame的基礎(chǔ)上做“需求2”的處理;
  • 編碼成H.264格式;
  • 存放到指定格式的容器中(mp4或者mkv)。
  • “過(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)需要考慮:

  • 如果顯卡可以指定,應(yīng)該是Nvidia。在Linux下有完善的開(kāi)發(fā)運(yùn)行環(huán)境,且同時(shí)支持CUDA和OpenCL;
  • 如果選定Nvidia顯卡,那么根據(jù)前文的分析,使用CUDA是更好的GPU計(jì)算架構(gòu)。并且應(yīng)該使用最新的CUDA 4.0版本,因?yàn)樵诙郍PU上能更方便的開(kāi)發(fā),并且GPU直接訪問(wèn)內(nèi)存方面也做出了改進(jìn)(CUDA 4.0的新特性詳細(xì)見(jiàn)這里)。
  • 在決定了以上基礎(chǔ)設(shè)施后,為了提高單機(jī)的處理能力程序應(yīng)該用何種架構(gòu)來(lái)編寫(xiě)?單進(jìn)程多線程還是多進(jìn)程單線程?
  • 關(guān)鍵在于在程序里如何更好的調(diào)用CUDA:

  • 單進(jìn)程多線程方式
    • 每個(gè)線程進(jìn)行一個(gè)視頻的轉(zhuǎn)換,每個(gè)線程在其線程內(nèi)部直接使用CUDA;
    • 有單獨(dú)的CUDA線程,其他線程當(dāng)需要時(shí)通知此線程進(jìn)行運(yùn)算;
  • 多進(jì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)題:

  • 是否需要在一個(gè)Server上配置多塊兒GPU?雖說(shuō)CUDA 4.0已經(jīng)聲稱對(duì)此有很好的支持,但是其是否能利用好?另外受限于硬件瓶頸的一些限制(CPU計(jì)算能力、內(nèi)存速度、總線速度),配置幾塊兒GPU比較合適?
  • 如果使用ffmpeg,那么在一臺(tái)擁有16核的服務(wù)器上,理論可以同時(shí)啟動(dòng)16個(gè)ffmpeg進(jìn)程(單線程運(yùn)行)。加入GPU運(yùn)算后單個(gè)視頻處理速度的提高是一定的,但是否還有這么大的并行能力?以及單位時(shí)間段內(nèi)的處理能力是否提升?
  • 加入GPU后硬件成本的增加是否值得?與單獨(dú)使用CPU的相比單位成本是否更低?選用哪款Nvidia顯卡的性價(jià)比最高?
  • 如何看GPU的load average和top?
  • 最后這件事情最難的一點(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

    目錄

    [隱藏]

    • 1 H.264和x264
    • 2 獲取x264
    • 3 命令行界面的x264
    • 4 命令行的操作
    • 5 x264的輸入輸出文件類型
    • 6 x264的preset和tune系統(tǒng)
      • 6.1 --preset
      • 6.2 --tune
    • 7 碼率控制
      • 7.1 crf
      • 7.2 2pass bitrate
    • 8 64bit的x264
      • 8.1 用ffmpeg輸入
      • 8.2 用mencoder輸入
      • 8.3 用avs2yuv輸入
    • 9 x264壓制的自動(dòng)化
    • 10 DXVA

    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.avs

    1pass會(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ō)透明的。

    ?


    分享到:

    總結(jié)

    以上是生活随笔為你收集整理的x264 代码重点详解 详细分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

    18精品久久久无码午夜福利 | 色综合天天综合狠狠爱 | 婷婷丁香五月天综合东京热 | 给我免费的视频在线观看 | 国产高清不卡无码视频 | 日日天日日夜日日摸 | 日日鲁鲁鲁夜夜爽爽狠狠 | 久久99精品国产麻豆蜜芽 | 未满小14洗澡无码视频网站 | 亚洲毛片av日韩av无码 | 免费无码的av片在线观看 | 亚洲大尺度无码无码专区 | 久久久精品456亚洲影院 | 日韩少妇白浆无码系列 | 国产无遮挡又黄又爽又色 | 亚洲国产综合无码一区 | 天天做天天爱天天爽综合网 | 无码av岛国片在线播放 | 无码免费一区二区三区 | 少妇厨房愉情理9仑片视频 | 国产精品久久久久7777 | 97无码免费人妻超级碰碰夜夜 | 18黄暴禁片在线观看 | 蜜臀av无码人妻精品 | 无遮挡国产高潮视频免费观看 | 台湾无码一区二区 | 国产亚洲欧美在线专区 | 亚洲精品午夜国产va久久成人 | 爆乳一区二区三区无码 | 亚洲综合精品香蕉久久网 | 国产精品亚洲lv粉色 | 大胆欧美熟妇xx | 99精品国产综合久久久久五月天 | 对白脏话肉麻粗话av | 色综合久久88色综合天天 | 午夜精品一区二区三区的区别 | 国产色精品久久人妻 | 色五月五月丁香亚洲综合网 | 乱人伦人妻中文字幕无码久久网 | 九月婷婷人人澡人人添人人爽 | 娇妻被黑人粗大高潮白浆 | 中文字幕无码乱人伦 | 欧美35页视频在线观看 | 婷婷综合久久中文字幕蜜桃三电影 | 精品 日韩 国产 欧美 视频 | 国产成人综合色在线观看网站 | 亚洲第一无码av无码专区 | 一本久久a久久精品vr综合 | 国产精品成人av在线观看 | 久久久精品456亚洲影院 | 麻豆蜜桃av蜜臀av色欲av | 精品偷拍一区二区三区在线看 | 亚洲人成网站免费播放 | 日韩无套无码精品 | www一区二区www免费 | 无码国内精品人妻少妇 | 国产suv精品一区二区五 | 99精品国产综合久久久久五月天 | 久久国产精品偷任你爽任你 | 亚洲伊人久久精品影院 | 亚洲日韩乱码中文无码蜜桃臀网站 | 澳门永久av免费网站 | 日本精品人妻无码免费大全 | 少妇一晚三次一区二区三区 | 久久精品视频在线看15 | 精品欧洲av无码一区二区三区 | 丝袜 中出 制服 人妻 美腿 | 99视频精品全部免费免费观看 | 国产在线精品一区二区三区直播 | 久9re热视频这里只有精品 | 亚洲 激情 小说 另类 欧美 | 无码人妻丰满熟妇区五十路百度 | 久久综合网欧美色妞网 | 亚洲小说图区综合在线 | 玩弄人妻少妇500系列视频 | 日韩人妻系列无码专区 | 免费视频欧美无人区码 | 亚洲熟女一区二区三区 | 亚洲熟妇色xxxxx亚洲 | 国产成人无码a区在线观看视频app | 特级做a爰片毛片免费69 | 少妇无码av无码专区在线观看 | 日本精品少妇一区二区三区 | 国产成人无码一二三区视频 | 西西人体www44rt大胆高清 | 色婷婷综合激情综在线播放 | 中文字幕无线码 | 伊人色综合久久天天小片 | 国产精品久久久午夜夜伦鲁鲁 | 乱人伦中文视频在线观看 | 国产国语老龄妇女a片 | 国产人妻人伦精品1国产丝袜 | 日本肉体xxxx裸交 | 男人和女人高潮免费网站 | 一二三四社区在线中文视频 | 一二三四在线观看免费视频 | 无码人妻丰满熟妇区五十路百度 | av香港经典三级级 在线 | 少妇人妻大乳在线视频 | 成人无码精品1区2区3区免费看 | 丰满少妇高潮惨叫视频 | 色 综合 欧美 亚洲 国产 | 午夜性刺激在线视频免费 | 国产精品欧美成人 | 中文精品久久久久人妻不卡 | 亚洲成av人综合在线观看 | 久久精品国产99精品亚洲 | 欧美xxxxx精品 | 色噜噜亚洲男人的天堂 | 精品无码国产一区二区三区av | 亚洲色www成人永久网址 | 高清国产亚洲精品自在久久 | 亚洲欧洲日本无在线码 | 国产精品亚洲五月天高清 | 男人扒开女人内裤强吻桶进去 | 国产亚洲精品久久久久久久久动漫 | 欧美 日韩 人妻 高清 中文 | 又紧又大又爽精品一区二区 | 中文字幕人妻无码一夲道 | 中文精品久久久久人妻不卡 | 久久天天躁狠狠躁夜夜免费观看 | 性欧美牲交在线视频 | 久久久av男人的天堂 | 亚洲乱码日产精品bd | 亚洲va欧美va天堂v国产综合 | 正在播放东北夫妻内射 | 免费视频欧美无人区码 | 国产成人无码一二三区视频 | √8天堂资源地址中文在线 | 亚洲理论电影在线观看 | 色情久久久av熟女人妻网站 | 一本加勒比波多野结衣 | 蜜臀av在线观看 在线欧美精品一区二区三区 | 中文字幕 亚洲精品 第1页 | 无码人妻精品一区二区三区不卡 | 国内精品久久毛片一区二区 | 熟妇激情内射com | 乱人伦人妻中文字幕无码久久网 | 俄罗斯老熟妇色xxxx | 国内少妇偷人精品视频免费 | 久久综合香蕉国产蜜臀av | 国内精品久久毛片一区二区 | 麻豆国产97在线 | 欧洲 | 老熟妇仑乱视频一区二区 | 久久精品国产一区二区三区 | 亚洲精品鲁一鲁一区二区三区 | 国产精品-区区久久久狼 | 天干天干啦夜天干天2017 | 国产黄在线观看免费观看不卡 | 亚洲成av人综合在线观看 | 国产成人综合色在线观看网站 | 性欧美牲交xxxxx视频 | 久久99热只有频精品8 | 少妇高潮喷潮久久久影院 | 精品无码一区二区三区爱欲 | 国产亚洲人成a在线v网站 | 人妻无码久久精品人妻 | 自拍偷自拍亚洲精品被多人伦好爽 | 久久久精品456亚洲影院 | 夜先锋av资源网站 | 大肉大捧一进一出视频出来呀 | 国产sm调教视频在线观看 | 色情久久久av熟女人妻网站 | 亚洲欧美综合区丁香五月小说 | 99国产欧美久久久精品 | 亚洲国产一区二区三区在线观看 | 少妇被粗大的猛进出69影院 | 日本护士xxxxhd少妇 | 亚洲国产av美女网站 | 国产亚洲精品久久久久久大师 | 一本久道高清无码视频 | 欧美日韩亚洲国产精品 | 午夜福利试看120秒体验区 | 少妇无码一区二区二三区 | 亚洲欧美国产精品久久 | 在线a亚洲视频播放在线观看 | 亚洲 高清 成人 动漫 | 西西人体www44rt大胆高清 | 中文精品无码中文字幕无码专区 | 国产美女精品一区二区三区 | 国产suv精品一区二区五 | 少妇被黑人到高潮喷出白浆 | 亚洲の无码国产の无码步美 | 波多野42部无码喷潮在线 | 日韩av无码一区二区三区不卡 | 嫩b人妻精品一区二区三区 | 久久综合九色综合97网 | 在线播放亚洲第一字幕 | 亚洲色欲色欲天天天www | 美女张开腿让人桶 | 精品久久久久久亚洲精品 | 国产在线aaa片一区二区99 | 无码国产色欲xxxxx视频 | 久久久www成人免费毛片 | 亚洲欧美精品伊人久久 | 午夜福利试看120秒体验区 | 色窝窝无码一区二区三区色欲 | a国产一区二区免费入口 | 亚洲国产精品久久久久久 | 国产av一区二区三区最新精品 | 亚洲区小说区激情区图片区 | 全球成人中文在线 | 一二三四在线观看免费视频 | 国产精品无码一区二区三区不卡 | 日本熟妇浓毛 | 色狠狠av一区二区三区 | 国产精品99爱免费视频 | 给我免费的视频在线观看 | 亚洲中文字幕乱码av波多ji | 少妇一晚三次一区二区三区 | 欧美丰满熟妇xxxx性ppx人交 | 国内精品一区二区三区不卡 | а√天堂www在线天堂小说 | 宝宝好涨水快流出来免费视频 | 亚洲熟妇色xxxxx欧美老妇y | 国精产品一区二区三区 | 国产精品美女久久久久av爽李琼 | 精品一区二区不卡无码av | 国产超级va在线观看视频 | 国产亚洲精品精品国产亚洲综合 | 成人性做爰aaa片免费看 | 久久久久久九九精品久 | 男人的天堂av网站 | 国产办公室秘书无码精品99 | 中文字幕av伊人av无码av | 一本久道高清无码视频 | 天堂亚洲免费视频 | 老太婆性杂交欧美肥老太 | 色综合久久久无码网中文 | 日本一本二本三区免费 | 亚洲色www成人永久网址 | 亚洲s码欧洲m码国产av | yw尤物av无码国产在线观看 | 老子影院午夜伦不卡 | 无码人妻丰满熟妇区五十路百度 | 欧美老人巨大xxxx做受 | 日韩精品久久久肉伦网站 | 国产av剧情md精品麻豆 | 图片区 小说区 区 亚洲五月 | 国产精品99久久精品爆乳 | 亚洲精品中文字幕 | 色五月五月丁香亚洲综合网 | 欧美怡红院免费全部视频 | 日韩人妻系列无码专区 | 欧美兽交xxxx×视频 | 粗大的内捧猛烈进出视频 | 亚洲成av人在线观看网址 | 精品国产一区av天美传媒 | 国产精品久久久久久久9999 | 久久精品99久久香蕉国产色戒 | 日韩精品一区二区av在线 | 国产情侣作爱视频免费观看 | 18黄暴禁片在线观看 | 伊人色综合久久天天小片 | 国产高潮视频在线观看 | 亚洲天堂2017无码 | 精品国产一区二区三区av 性色 | 久久久国产一区二区三区 | 国产九九九九九九九a片 | 色窝窝无码一区二区三区色欲 | 成人无码视频免费播放 | 亚洲综合色区中文字幕 | 国产亚洲精品久久久久久久久动漫 | 99视频精品全部免费免费观看 | 国产69精品久久久久app下载 | 成人精品视频一区二区三区尤物 | 免费乱码人妻系列无码专区 | 无码人妻精品一区二区三区不卡 | 亚洲欧美日韩综合久久久 | 欧美黑人乱大交 | 97无码免费人妻超级碰碰夜夜 | 欧美日韩亚洲国产精品 | 中文字幕无码视频专区 | 国产精品亚洲а∨无码播放麻豆 | 丰满人妻翻云覆雨呻吟视频 | 丰满肥臀大屁股熟妇激情视频 | 蜜桃av抽搐高潮一区二区 | 麻豆果冻传媒2021精品传媒一区下载 | 欧洲美熟女乱又伦 | 精品无码av一区二区三区 | 少妇被粗大的猛进出69影院 | 色妞www精品免费视频 | 国产精品无码一区二区桃花视频 | 国产女主播喷水视频在线观看 | 亚洲精品久久久久久一区二区 | 77777熟女视频在线观看 а天堂中文在线官网 | 动漫av一区二区在线观看 | 国产av无码专区亚洲awww | 亚洲男人av天堂午夜在 | 又黄又爽又色的视频 | 麻豆人妻少妇精品无码专区 | 亚洲中文字幕无码一久久区 | 无码人妻出轨黑人中文字幕 | 俺去俺来也在线www色官网 | 国产乱子伦视频在线播放 | 免费无码的av片在线观看 | 亚洲综合精品香蕉久久网 | 日本一区二区更新不卡 | 国产亚洲人成在线播放 | 两性色午夜视频免费播放 | 久久精品丝袜高跟鞋 | 亚洲国精产品一二二线 | 久久久久久国产精品无码下载 | 国产麻豆精品一区二区三区v视界 | 东京一本一道一二三区 | 亚洲欧美中文字幕5发布 | 久久精品女人的天堂av | 日日摸夜夜摸狠狠摸婷婷 | 久久久国产一区二区三区 | 婷婷六月久久综合丁香 | 国产av人人夜夜澡人人爽麻豆 | 一个人免费观看的www视频 | 狠狠亚洲超碰狼人久久 | 亚洲成a人一区二区三区 | 久久99精品久久久久婷婷 | 亚洲国产精品一区二区第一页 | 日本在线高清不卡免费播放 | 免费无码午夜福利片69 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 免费看男女做好爽好硬视频 | 国产人妻精品一区二区三区不卡 | 欧美激情一区二区三区成人 | 无码人妻丰满熟妇区毛片18 | 三上悠亚人妻中文字幕在线 | 国产内射老熟女aaaa | 日韩精品a片一区二区三区妖精 | 麻豆av传媒蜜桃天美传媒 | 高清国产亚洲精品自在久久 | 久久综合给久久狠狠97色 | 日本丰满护士爆乳xxxx | 在线播放免费人成毛片乱码 | 午夜熟女插插xx免费视频 | 夜夜躁日日躁狠狠久久av | 色一情一乱一伦一视频免费看 | 亚洲精品国产品国语在线观看 | 熟女少妇人妻中文字幕 | 波多野结衣aⅴ在线 | 啦啦啦www在线观看免费视频 | 未满小14洗澡无码视频网站 | 中文字幕av日韩精品一区二区 | 久久精品无码一区二区三区 | 欧美国产日产一区二区 | 婷婷综合久久中文字幕蜜桃三电影 | 无码av免费一区二区三区试看 | 久久国内精品自在自线 | 少妇无码一区二区二三区 | 国产超碰人人爽人人做人人添 | 久久综合九色综合欧美狠狠 | 中文字幕中文有码在线 | 骚片av蜜桃精品一区 | 成在人线av无码免观看麻豆 | 性啪啪chinese东北女人 | 国产综合久久久久鬼色 | 国产在线一区二区三区四区五区 | 人妻中文无码久热丝袜 | 精品亚洲韩国一区二区三区 | 日韩欧美群交p片內射中文 | 麻豆蜜桃av蜜臀av色欲av | 老司机亚洲精品影院 | 国产精品久久久久久久9999 | 永久免费观看美女裸体的网站 | 国产网红无码精品视频 | 国产精品免费大片 | 亚洲一区二区三区 | 亚洲一区二区三区含羞草 | 精品久久久久久亚洲精品 | aⅴ在线视频男人的天堂 | 人人妻人人澡人人爽欧美一区 | 国产成人精品一区二区在线小狼 | 国产xxx69麻豆国语对白 | 久久99精品国产麻豆 | 国产 精品 自在自线 | 久久久久免费精品国产 | 中文字幕精品av一区二区五区 | 国产69精品久久久久app下载 | 亚洲国产av精品一区二区蜜芽 | 熟妇女人妻丰满少妇中文字幕 | 亚洲精品国偷拍自产在线观看蜜桃 | 久久久久久久人妻无码中文字幕爆 | 久久亚洲a片com人成 | 亚洲国产精品一区二区第一页 | 强奷人妻日本中文字幕 | 高潮毛片无遮挡高清免费 | 亚洲精品中文字幕乱码 | 波多野结衣高清一区二区三区 | √天堂中文官网8在线 | 欧美成人免费全部网站 | 撕开奶罩揉吮奶头视频 | 一本久久伊人热热精品中文字幕 | 中文字幕av无码一区二区三区电影 | 久久久成人毛片无码 | 伊人久久大香线焦av综合影院 | 色综合久久久久综合一本到桃花网 | 亚洲人成网站在线播放942 | 奇米影视7777久久精品 | 亚洲一区二区三区国产精华液 | 国产精品毛多多水多 | 亚洲天堂2017无码 | 亚洲 日韩 欧美 成人 在线观看 | 国产综合久久久久鬼色 | 熟女少妇在线视频播放 | 丰满岳乱妇在线观看中字无码 | 99国产精品白浆在线观看免费 | 久久国语露脸国产精品电影 | 国产成人亚洲综合无码 | 久激情内射婷内射蜜桃人妖 | a片在线免费观看 | 亚洲成熟女人毛毛耸耸多 | 日本xxxx色视频在线观看免费 | 国产一区二区三区日韩精品 | 精品国产一区二区三区av 性色 | 亚洲色偷偷男人的天堂 | 久久亚洲精品中文字幕无男同 | 成人欧美一区二区三区 | 国产亚洲人成a在线v网站 | 免费网站看v片在线18禁无码 | 在线播放无码字幕亚洲 | 老头边吃奶边弄进去呻吟 | 国产真人无遮挡作爱免费视频 | 曰韩少妇内射免费播放 | 精品国产精品久久一区免费式 | 亚洲天堂2017无码中文 | 中文字幕色婷婷在线视频 | 久久99精品久久久久久 | 欧美日本免费一区二区三区 | 天天摸天天透天天添 | 国产精品对白交换视频 | 大屁股大乳丰满人妻 | 亚洲精品久久久久久一区二区 | 人妻尝试又大又粗久久 | а√资源新版在线天堂 | 无码精品国产va在线观看dvd | 中文字幕无码免费久久99 | 捆绑白丝粉色jk震动捧喷白浆 | 乱码午夜-极国产极内射 | 人妻少妇被猛烈进入中文字幕 | 中文字幕人妻无码一夲道 | 人妻尝试又大又粗久久 | 97久久精品无码一区二区 | 亚洲精品中文字幕 | 高潮喷水的毛片 | 女人和拘做爰正片视频 | 强奷人妻日本中文字幕 | 一本色道久久综合狠狠躁 | 国产精品美女久久久网av | 日本欧美一区二区三区乱码 | 日本免费一区二区三区最新 | 国产一区二区三区影院 | 国产午夜精品一区二区三区嫩草 | 中文字幕无线码免费人妻 | 在线精品国产一区二区三区 | 好男人社区资源 | 樱花草在线播放免费中文 | 婷婷丁香六月激情综合啪 | 久久久中文久久久无码 | 日韩精品无码一本二本三本色 | 国产精品久久久久7777 | 久久久精品456亚洲影院 | 久久综合久久自在自线精品自 | 亚洲色偷偷男人的天堂 | 麻豆果冻传媒2021精品传媒一区下载 | 7777奇米四色成人眼影 | 最近免费中文字幕中文高清百度 | 亚洲国产av精品一区二区蜜芽 | 久久99精品久久久久久动态图 | 欧美丰满少妇xxxx性 | 熟女少妇在线视频播放 | 久久久久久九九精品久 | 一本色道久久综合亚洲精品不卡 | 日韩成人一区二区三区在线观看 | 亚洲国产欧美在线成人 | 亚洲精品午夜国产va久久成人 | 大地资源网第二页免费观看 | 51国偷自产一区二区三区 | 国产熟妇另类久久久久 | 色偷偷av老熟女 久久精品人妻少妇一区二区三区 | 亚洲第一无码av无码专区 | 国产成人综合色在线观看网站 | 精品人人妻人人澡人人爽人人 | 久久久中文字幕日本无吗 | 久久综合激激的五月天 | 亚洲热妇无码av在线播放 | 欧美黑人性暴力猛交喷水 | 国产精品国产三级国产专播 | 久久久av男人的天堂 | 全黄性性激高免费视频 | 又大又黄又粗又爽的免费视频 | 婷婷丁香五月天综合东京热 | 97无码免费人妻超级碰碰夜夜 | 中文字幕乱码人妻无码久久 | 亚洲精品成人av在线 | 亚洲日韩乱码中文无码蜜桃臀网站 | 无码国产色欲xxxxx视频 | 久久精品中文字幕大胸 | 亚洲熟女一区二区三区 | 亚洲日韩精品欧美一区二区 | 久久天天躁夜夜躁狠狠 | 4hu四虎永久在线观看 | 四虎影视成人永久免费观看视频 | 亚洲精品一区二区三区在线观看 | 亚洲毛片av日韩av无码 | 亚洲成av人综合在线观看 | 丰满肥臀大屁股熟妇激情视频 | 一本大道久久东京热无码av | 久久精品国产一区二区三区 | 国产亚洲欧美日韩亚洲中文色 | 亚洲a无码综合a国产av中文 | 国产明星裸体无码xxxx视频 | 亚洲区小说区激情区图片区 | 少妇性l交大片欧洲热妇乱xxx | 55夜色66夜色国产精品视频 | 日韩精品一区二区av在线 | 亚洲国产午夜精品理论片 | 日韩欧美成人免费观看 | 清纯唯美经典一区二区 | 樱花草在线播放免费中文 | 未满成年国产在线观看 | 成人欧美一区二区三区黑人免费 | 无码福利日韩神码福利片 | 无套内射视频囯产 | 午夜精品一区二区三区在线观看 | 亚洲精品成a人在线观看 | 黑森林福利视频导航 | 全球成人中文在线 | 国产偷抇久久精品a片69 | 亚洲欧美综合区丁香五月小说 | 乱人伦人妻中文字幕无码久久网 | 亚洲国产av精品一区二区蜜芽 | 久久久久99精品国产片 | 精品亚洲韩国一区二区三区 | 领导边摸边吃奶边做爽在线观看 | 欧美熟妇另类久久久久久不卡 | 波多野42部无码喷潮在线 | 亚洲国产高清在线观看视频 | 久久久久亚洲精品中文字幕 | 香蕉久久久久久av成人 | 色综合久久久久综合一本到桃花网 | 免费乱码人妻系列无码专区 | 精品国产福利一区二区 | 免费国产成人高清在线观看网站 | 黑人粗大猛烈进出高潮视频 | 久久精品人人做人人综合 | 女高中生第一次破苞av | 色偷偷人人澡人人爽人人模 | 久久天天躁狠狠躁夜夜免费观看 | 我要看www免费看插插视频 | 欧美日韩色另类综合 | 亚洲综合无码一区二区三区 | 国产成人综合在线女婷五月99播放 | 久久精品国产日本波多野结衣 | 麻豆av传媒蜜桃天美传媒 | 欧洲欧美人成视频在线 | 亚洲色欲久久久综合网东京热 | 无码人妻出轨黑人中文字幕 | 亚洲精品一区三区三区在线观看 | 丰满人妻一区二区三区免费视频 | 亚洲欧美综合区丁香五月小说 | 国产电影无码午夜在线播放 | 国产97色在线 | 免 | 欧美国产亚洲日韩在线二区 | 精品国偷自产在线 | 国产无遮挡又黄又爽免费视频 | 精品人人妻人人澡人人爽人人 | 久久久久久亚洲精品a片成人 | 大肉大捧一进一出好爽视频 | 日本欧美一区二区三区乱码 | 国产偷国产偷精品高清尤物 | 性色欲网站人妻丰满中文久久不卡 | 国语精品一区二区三区 | 国产九九九九九九九a片 | 精品国精品国产自在久国产87 | 欧美zoozzooz性欧美 | 国产乱人伦app精品久久 国产在线无码精品电影网 国产国产精品人在线视 | 亚洲日本va中文字幕 | 亚洲精品一区二区三区婷婷月 | 伊人久久婷婷五月综合97色 | 日本精品人妻无码免费大全 | 国产成人无码a区在线观看视频app | 无码乱肉视频免费大全合集 | 国产一区二区三区精品视频 | 内射白嫩少妇超碰 | 欧美性黑人极品hd | 日韩人妻少妇一区二区三区 | 粉嫩少妇内射浓精videos | 国产精品久久精品三级 | 人人爽人人爽人人片av亚洲 | 精品国产一区av天美传媒 | 狠狠色丁香久久婷婷综合五月 | 亚洲综合另类小说色区 | 国内老熟妇对白xxxxhd | 野狼第一精品社区 | 国产电影无码午夜在线播放 | 精品久久久久香蕉网 | 日本xxxx色视频在线观看免费 | 精品欧美一区二区三区久久久 | 蜜桃臀无码内射一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 性色av无码免费一区二区三区 | 国产av久久久久精东av | 女高中生第一次破苞av | 久久99精品久久久久久 | 亚洲成a人片在线观看无码 | 思思久久99热只有频精品66 | 97精品人妻一区二区三区香蕉 | 国产激情综合五月久久 | 国产成人av免费观看 | 自拍偷自拍亚洲精品10p | 少妇人妻大乳在线视频 | 四虎国产精品一区二区 | 国产尤物精品视频 | 色婷婷欧美在线播放内射 | 国产精品二区一区二区aⅴ污介绍 | 亚洲精品成人av在线 | 少妇太爽了在线观看 | 久久精品国产精品国产精品污 | 欧美日韩久久久精品a片 | 人人超人人超碰超国产 | 精品国产国产综合精品 | 在线a亚洲视频播放在线观看 | 婷婷六月久久综合丁香 | 无码帝国www无码专区色综合 | 国产特级毛片aaaaaaa高清 | 亚洲人成人无码网www国产 | 狠狠cao日日穞夜夜穞av | 成人免费视频在线观看 | 亚洲呦女专区 | 大地资源中文第3页 | 色欲综合久久中文字幕网 | 国产偷自视频区视频 | 夜夜躁日日躁狠狠久久av | 国语自产偷拍精品视频偷 | 装睡被陌生人摸出水好爽 | 永久免费精品精品永久-夜色 | 2020久久超碰国产精品最新 | 色综合久久中文娱乐网 | 国产性猛交╳xxx乱大交 国产精品久久久久久无码 欧洲欧美人成视频在线 | 成人免费视频在线观看 | 亚洲成在人网站无码天堂 | 国产性生交xxxxx无码 | 国产高清不卡无码视频 | 乌克兰少妇xxxx做受 | 男女爱爱好爽视频免费看 | 色情久久久av熟女人妻网站 | 国产亚洲视频中文字幕97精品 | 亚洲国产精品无码一区二区三区 | av无码不卡在线观看免费 | 亚洲国产欧美在线成人 | 亚洲精品国产品国语在线观看 | 午夜成人1000部免费视频 | 亚洲欧美色中文字幕在线 | 国产激情无码一区二区app | 初尝人妻少妇中文字幕 | 日本一区二区三区免费播放 | 中文字幕无码视频专区 | 日本爽爽爽爽爽爽在线观看免 | 久久久久久久女国产乱让韩 | 亚洲 欧美 激情 小说 另类 | 精品国产一区二区三区av 性色 | 国产成人精品无码播放 | 最近免费中文字幕中文高清百度 | 午夜不卡av免费 一本久久a久久精品vr综合 | 国产精品无码成人午夜电影 | 亚洲自偷自拍另类第1页 | 中文无码伦av中文字幕 | 亚洲精品综合一区二区三区在线 | 亚洲中文字幕乱码av波多ji | 狠狠色噜噜狠狠狠狠7777米奇 | 国产色精品久久人妻 | 撕开奶罩揉吮奶头视频 | 国产偷自视频区视频 | 中国女人内谢69xxxxxa片 | 内射老妇bbwx0c0ck | 亚洲欧洲日本无在线码 | 给我免费的视频在线观看 | 欧美午夜特黄aaaaaa片 | 丰满少妇人妻久久久久久 | 又粗又大又硬毛片免费看 | 日韩欧美中文字幕在线三区 | 亚洲a无码综合a国产av中文 | 国产精品无码mv在线观看 | 天天躁日日躁狠狠躁免费麻豆 | 丰满肥臀大屁股熟妇激情视频 | 男人的天堂av网站 | 少妇性荡欲午夜性开放视频剧场 | 老太婆性杂交欧美肥老太 | 人妻尝试又大又粗久久 | 久久精品国产99精品亚洲 | 丰满人妻被黑人猛烈进入 | 国产高潮视频在线观看 | 无套内谢老熟女 | 久久99久久99精品中文字幕 | 7777奇米四色成人眼影 | 国产sm调教视频在线观看 | 99精品无人区乱码1区2区3区 | 亚洲小说春色综合另类 | 欧美日韩综合一区二区三区 | 中文字幕乱码亚洲无线三区 | 人妻中文无码久热丝袜 | 欧美黑人性暴力猛交喷水 | 丰满妇女强制高潮18xxxx | 九九综合va免费看 | а√资源新版在线天堂 | 乱中年女人伦av三区 | 日本免费一区二区三区最新 | 无码精品人妻一区二区三区av | 熟女少妇在线视频播放 | 欧美成人免费全部网站 | 国产性生交xxxxx无码 | www国产亚洲精品久久久日本 | 三上悠亚人妻中文字幕在线 | 大肉大捧一进一出视频出来呀 | 亚洲国产成人a精品不卡在线 | 国产又爽又猛又粗的视频a片 | 日本xxxx色视频在线观看免费 | 日欧一片内射va在线影院 | 日韩av无码一区二区三区 | 51国偷自产一区二区三区 | 天天躁夜夜躁狠狠是什么心态 | 亚洲精品鲁一鲁一区二区三区 | 欧美人与物videos另类 | 扒开双腿疯狂进出爽爽爽视频 | 大屁股大乳丰满人妻 | 亚洲精品综合一区二区三区在线 | 国产精品人人妻人人爽 | a片免费视频在线观看 | 99re在线播放 | 亚洲男女内射在线播放 | 免费人成在线观看网站 | 啦啦啦www在线观看免费视频 | 十八禁视频网站在线观看 | 欧美 日韩 人妻 高清 中文 | 日本熟妇乱子伦xxxx | 人妻少妇精品视频专区 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 少妇太爽了在线观看 | 国产精品爱久久久久久久 | 久久久精品成人免费观看 | 中文字幕av伊人av无码av | 国产国产精品人在线视 | av无码久久久久不卡免费网站 | 国产精品毛片一区二区 | 国产综合色产在线精品 | 精品无码av一区二区三区 | 久久精品成人欧美大片 | 亚拍精品一区二区三区探花 | 国産精品久久久久久久 | 国产精品久久久久9999小说 | 亚洲一区二区三区国产精华液 | 免费男性肉肉影院 | 丰满人妻被黑人猛烈进入 | 欧美日韩一区二区免费视频 | 国内综合精品午夜久久资源 | 76少妇精品导航 | 中文字幕 人妻熟女 | 国产精品无码久久av | 欧美日韩精品 | 精品国产麻豆免费人成网站 | 牲欲强的熟妇农村老妇女 | 婷婷综合久久中文字幕蜜桃三电影 | 日本又色又爽又黄的a片18禁 | 国产xxx69麻豆国语对白 | 激情亚洲一区国产精品 | 欧美一区二区三区视频在线观看 | 欧美日韩视频无码一区二区三 | 一本色道久久综合狠狠躁 | 久久久久亚洲精品中文字幕 | 国产一区二区三区日韩精品 | 女人高潮内射99精品 | 国产超碰人人爽人人做人人添 | 日本一区二区三区免费高清 | 欧美放荡的少妇 | 99久久99久久免费精品蜜桃 | 无码人妻精品一区二区三区下载 | 无码人妻少妇伦在线电影 | 国精产品一品二品国精品69xx | 精品无码国产一区二区三区av | 亚洲七七久久桃花影院 | 国产成人精品无码播放 | 在线观看国产一区二区三区 | 秋霞特色aa大片 | 亚洲 欧美 激情 小说 另类 | 国产精品丝袜黑色高跟鞋 | 亚洲va中文字幕无码久久不卡 | 在教室伦流澡到高潮hnp视频 | 国产精品久久久久影院嫩草 | 国产精品资源一区二区 | 中国女人内谢69xxxxxa片 | 亚洲精品综合一区二区三区在线 | 狠狠色噜噜狠狠狠7777奇米 | 亚洲精品美女久久久久久久 | 精品少妇爆乳无码av无码专区 | 国产农村妇女aaaaa视频 撕开奶罩揉吮奶头视频 | 青青草原综合久久大伊人精品 | 亚洲精品午夜无码电影网 | 久久午夜无码鲁丝片午夜精品 | 国产精品18久久久久久麻辣 | 日本一区二区三区免费播放 | 久久久国产精品无码免费专区 | 成人三级无码视频在线观看 | 国产精品亚洲а∨无码播放麻豆 | 在线观看国产一区二区三区 | 亚洲国产成人av在线观看 | 亚洲成a人片在线观看无码 | 日韩欧美中文字幕在线三区 | 中文字幕av日韩精品一区二区 | av无码久久久久不卡免费网站 | 久久熟妇人妻午夜寂寞影院 | 熟女体下毛毛黑森林 | 巨爆乳无码视频在线观看 | 自拍偷自拍亚洲精品10p | 亚洲精品久久久久久一区二区 | 一区二区三区乱码在线 | 欧洲 | 国产成人精品久久亚洲高清不卡 | 六月丁香婷婷色狠狠久久 | 正在播放东北夫妻内射 | 亚洲人亚洲人成电影网站色 | 亚洲精品欧美二区三区中文字幕 | 丰满人妻精品国产99aⅴ | 精品国产一区二区三区av 性色 | 99久久精品午夜一区二区 | 国产精品无套呻吟在线 | 亚欧洲精品在线视频免费观看 | 久久国产精品_国产精品 | 国产人妻大战黑人第1集 | 成在人线av无码免观看麻豆 | 性生交片免费无码看人 | 日韩人妻无码一区二区三区久久99 | 精品国产青草久久久久福利 | 亚洲人成网站在线播放942 | 亚洲综合在线一区二区三区 | 久热国产vs视频在线观看 | 无码乱肉视频免费大全合集 | 亚洲区欧美区综合区自拍区 | 欧美肥老太牲交大战 | 欧美午夜特黄aaaaaa片 | 亚洲国产av精品一区二区蜜芽 | 亚洲狠狠色丁香婷婷综合 | 兔费看少妇性l交大片免费 | 久久久精品人妻久久影视 | www成人国产高清内射 | 欧美一区二区三区视频在线观看 | 久久99国产综合精品 | 午夜嘿嘿嘿影院 | 一区二区传媒有限公司 | 激情亚洲一区国产精品 | 小sao货水好多真紧h无码视频 | 精品久久久久香蕉网 | 桃花色综合影院 | 四虎国产精品一区二区 | 成人试看120秒体验区 | 亚洲人成无码网www | 九一九色国产 | yw尤物av无码国产在线观看 | 亚洲乱码中文字幕在线 | 国产在线精品一区二区三区直播 | 欧美丰满少妇xxxx性 | 欧美真人作爱免费视频 | 精品久久综合1区2区3区激情 | 无码人妻精品一区二区三区下载 | 麻豆果冻传媒2021精品传媒一区下载 | 亚洲天堂2017无码 | 欧美xxxx黑人又粗又长 | 成人一在线视频日韩国产 | 久久亚洲中文字幕精品一区 | 中文无码成人免费视频在线观看 | 丰满少妇人妻久久久久久 | 久久熟妇人妻午夜寂寞影院 | 免费看男女做好爽好硬视频 | 成人欧美一区二区三区黑人免费 | 日韩亚洲欧美精品综合 | 国内老熟妇对白xxxxhd | 成人三级无码视频在线观看 | 九一九色国产 | 国产精品永久免费视频 | 亚洲va中文字幕无码久久不卡 | 国产人妖乱国产精品人妖 | 夜先锋av资源网站 | 亚洲国产精品一区二区第一页 | 午夜免费福利小电影 | 亚洲人成影院在线无码按摩店 | 亚洲乱码日产精品bd | 欧美丰满老熟妇xxxxx性 | 日本精品久久久久中文字幕 | 欧美国产日产一区二区 | 午夜无码人妻av大片色欲 | 人妻中文无码久热丝袜 | 亚洲精品久久久久中文第一幕 | 亚洲国产精品无码久久久久高潮 | 少妇太爽了在线观看 | 一区二区三区乱码在线 | 欧洲 | 少妇人妻偷人精品无码视频 | 2020最新国产自产精品 | 少女韩国电视剧在线观看完整 | 国产精品福利视频导航 | 日本一区二区更新不卡 | 亚洲熟妇自偷自拍另类 | 亚洲色偷偷男人的天堂 | 国产香蕉尹人视频在线 | 国产乱子伦视频在线播放 | 亚洲国产一区二区三区在线观看 | 欧美人与牲动交xxxx | 亚洲精品中文字幕久久久久 | 人人妻人人澡人人爽人人精品浪潮 | 欧美 日韩 亚洲 在线 | 夫妻免费无码v看片 | 少妇性俱乐部纵欲狂欢电影 | 亚洲人成网站在线播放942 | 午夜无码人妻av大片色欲 | 国产手机在线αⅴ片无码观看 | 最近中文2019字幕第二页 | 大胆欧美熟妇xx | 曰韩无码二三区中文字幕 | a国产一区二区免费入口 | 国产成人精品三级麻豆 | 丰满人妻精品国产99aⅴ | 九月婷婷人人澡人人添人人爽 | 蜜桃无码一区二区三区 | 免费无码av一区二区 | 亚洲色欲色欲欲www在线 | av无码不卡在线观看免费 | 免费看男女做好爽好硬视频 | 国产精品久久久久久久9999 | 国产精品永久免费视频 | 日韩人妻无码一区二区三区久久99 | 亚洲日本va午夜在线电影 | 国内精品久久久久久中文字幕 | 欧美老妇与禽交 | 成人精品天堂一区二区三区 | 大肉大捧一进一出好爽视频 | 中文字幕日韩精品一区二区三区 | 大肉大捧一进一出视频出来呀 | 欧美日韩在线亚洲综合国产人 | 午夜理论片yy44880影院 | 午夜精品久久久久久久久 | 激情国产av做激情国产爱 | 国产亚洲视频中文字幕97精品 | 国产suv精品一区二区五 | 18无码粉嫩小泬无套在线观看 | 亚洲日本一区二区三区在线 | 久久综合给合久久狠狠狠97色 | 色五月丁香五月综合五月 | 亚洲精品成人福利网站 | 久久久久人妻一区精品色欧美 | 亚洲人成影院在线无码按摩店 | 国产亚洲精品精品国产亚洲综合 | 樱花草在线播放免费中文 | 狠狠色欧美亚洲狠狠色www | 曰韩无码二三区中文字幕 | 久青草影院在线观看国产 | 亚洲成av人综合在线观看 | 人人妻人人澡人人爽欧美一区九九 | 搡女人真爽免费视频大全 | 精品无码国产自产拍在线观看蜜 | 丰满少妇高潮惨叫视频 | 网友自拍区视频精品 | 欧美成人免费全部网站 | 亚洲无人区一区二区三区 | 国产精品久久久久无码av色戒 | 日日天干夜夜狠狠爱 | 精品久久8x国产免费观看 | 欧美人与善在线com | 4hu四虎永久在线观看 | 少妇性l交大片 | 色诱久久久久综合网ywww | 蜜桃av蜜臀av色欲av麻 999久久久国产精品消防器材 | av无码电影一区二区三区 | 免费无码的av片在线观看 | 久久aⅴ免费观看 | 巨爆乳无码视频在线观看 | 国产精品美女久久久网av | 久久亚洲中文字幕精品一区 | 国产无遮挡又黄又爽又色 | 国产人妻久久精品二区三区老狼 | 图片区 小说区 区 亚洲五月 | 亚洲精品一区三区三区在线观看 | 狠狠噜狠狠狠狠丁香五月 | 麻豆国产丝袜白领秘书在线观看 | 暴力强奷在线播放无码 | 国产 精品 自在自线 | 久久精品国产大片免费观看 | 67194成是人免费无码 | 熟妇激情内射com | 国产成人精品一区二区在线小狼 | 国产猛烈高潮尖叫视频免费 | 国产色在线 | 国产 | 久久综合九色综合欧美狠狠 | 国产成人精品一区二区在线小狼 | 色欲综合久久中文字幕网 | 99久久人妻精品免费二区 | 久久精品国产99精品亚洲 | 亚洲成在人网站无码天堂 | 3d动漫精品啪啪一区二区中 | 亚洲中文字幕久久无码 | 大乳丰满人妻中文字幕日本 | 熟妇人妻中文av无码 | 日日摸夜夜摸狠狠摸婷婷 | 欧洲vodafone精品性 | 国产明星裸体无码xxxx视频 | 国产成人无码av在线影院 | 老头边吃奶边弄进去呻吟 | 久久国产劲爆∧v内射 | 图片小说视频一区二区 | 国产麻豆精品一区二区三区v视界 | 国产乱码精品一品二品 | 67194成是人免费无码 | 国产一区二区三区影院 | 亚洲日韩乱码中文无码蜜桃臀网站 | 国产人妻久久精品二区三区老狼 | а天堂中文在线官网 | 亚洲の无码国产の无码步美 | 在线观看国产午夜福利片 | 未满成年国产在线观看 | 亚洲精品久久久久久一区二区 | 久久国语露脸国产精品电影 | 国产精品第一国产精品 | 亚洲自偷自拍另类第1页 | 亚洲一区二区三区四区 | 日本肉体xxxx裸交 | 久久午夜夜伦鲁鲁片无码免费 | 国产精品对白交换视频 | 亚洲无人区午夜福利码高清完整版 | 国产精品.xx视频.xxtv | 台湾无码一区二区 | 国产超级va在线观看视频 | 人人超人人超碰超国产 | 四虎永久在线精品免费网址 | 久久人人97超碰a片精品 | 婷婷五月综合激情中文字幕 | 久热国产vs视频在线观看 | 丝袜美腿亚洲一区二区 | 无人区乱码一区二区三区 | 噜噜噜亚洲色成人网站 | 精品无码国产一区二区三区av | 日本va欧美va欧美va精品 | 中文字幕+乱码+中文字幕一区 | 无码任你躁久久久久久久 | 日本一卡2卡3卡四卡精品网站 | 欧美精品一区二区精品久久 | 国产又爽又黄又刺激的视频 | 国产 精品 自在自线 | 国产精品亚洲lv粉色 | 国产精品二区一区二区aⅴ污介绍 | 婷婷丁香六月激情综合啪 | 久久熟妇人妻午夜寂寞影院 | 久久久www成人免费毛片 | 偷窥村妇洗澡毛毛多 | 精品国产乱码久久久久乱码 | 国产精品高潮呻吟av久久4虎 | 麻豆人妻少妇精品无码专区 | 日韩人妻无码一区二区三区久久99 | 亚洲日本va中文字幕 | 性色欲情网站iwww九文堂 | 亚洲自偷自偷在线制服 | 亚洲一区av无码专区在线观看 | 欧美真人作爱免费视频 | 大色综合色综合网站 | 亚洲毛片av日韩av无码 | 亚洲精品久久久久久一区二区 | 国产猛烈高潮尖叫视频免费 | 国产偷国产偷精品高清尤物 | 美女毛片一区二区三区四区 | 国产后入清纯学生妹 | aⅴ亚洲 日韩 色 图网站 播放 | 久久久精品成人免费观看 | 免费国产黄网站在线观看 | 久久精品成人欧美大片 | 黑人大群体交免费视频 | 乱人伦人妻中文字幕无码久久网 | 色欲久久久天天天综合网精品 | 国产艳妇av在线观看果冻传媒 | 日韩少妇内射免费播放 | 成人毛片一区二区 | 午夜精品一区二区三区的区别 | 久久久久久a亚洲欧洲av冫 | 一本久道高清无码视频 | 亚洲成av人片在线观看无码不卡 | 国语自产偷拍精品视频偷 | 人人超人人超碰超国产 | 欧美黑人巨大xxxxx | 天海翼激烈高潮到腰振不止 | 性色av无码免费一区二区三区 | 欧美 日韩 人妻 高清 中文 | 夜先锋av资源网站 | 丰满人妻精品国产99aⅴ | 九九热爱视频精品 | 国产一精品一av一免费 | 精品人妻av区 | 中文字幕无码av波多野吉衣 | 国产精品久久久久影院嫩草 | 久久精品女人的天堂av | 男女超爽视频免费播放 | 欧美丰满熟妇xxxx性ppx人交 | 粗大的内捧猛烈进出视频 | 无码人妻久久一区二区三区不卡 | 免费人成在线观看网站 | 日日麻批免费40分钟无码 | 国产精品怡红院永久免费 | 天堂在线观看www | 熟妇女人妻丰满少妇中文字幕 | 亚洲一区二区三区含羞草 | 欧美日本精品一区二区三区 | 丰满少妇人妻久久久久久 | 亚洲日韩av片在线观看 | 欧美老妇与禽交 | 在线精品亚洲一区二区 | 久久精品国产99精品亚洲 | 国产艳妇av在线观看果冻传媒 | 国产性生交xxxxx无码 | 精品日本一区二区三区在线观看 | 亚洲精品一区三区三区在线观看 | 成人一区二区免费视频 | 日本一区二区更新不卡 | 蜜臀aⅴ国产精品久久久国产老师 | 亚洲人成网站色7799 | 欧美zoozzooz性欧美 | 97精品国产97久久久久久免费 | 久久久精品成人免费观看 | 精品欧美一区二区三区久久久 | 人人妻人人澡人人爽人人精品 | 狂野欧美性猛xxxx乱大交 | 日韩欧美群交p片內射中文 | 中文无码成人免费视频在线观看 | 55夜色66夜色国产精品视频 | 欧美 丝袜 自拍 制服 另类 | 学生妹亚洲一区二区 | 中文字幕av日韩精品一区二区 | 人妻少妇精品无码专区二区 | 欧美人与牲动交xxxx | 精品日本一区二区三区在线观看 | 久久熟妇人妻午夜寂寞影院 | 久久综合狠狠综合久久综合88 | 午夜丰满少妇性开放视频 | 亚洲日韩乱码中文无码蜜桃臀网站 | 少妇人妻av毛片在线看 | 久久国产劲爆∧v内射 | 久久熟妇人妻午夜寂寞影院 | 午夜时刻免费入口 | 无套内射视频囯产 | 免费观看黄网站 | 亚洲日韩av一区二区三区中文 | 午夜福利试看120秒体验区 | 蜜桃无码一区二区三区 | 精品夜夜澡人妻无码av蜜桃 | 国产网红无码精品视频 | 国产国语老龄妇女a片 | 俺去俺来也www色官网 | 亚洲中文字幕av在天堂 | 成熟女人特级毛片www免费 | 亚洲国产成人a精品不卡在线 | 亚洲の无码国产の无码影院 | 日本va欧美va欧美va精品 | 国产疯狂伦交大片 | 久青草影院在线观看国产 | www成人国产高清内射 | 图片小说视频一区二区 | 欧美日韩亚洲国产精品 | 国产成人一区二区三区在线观看 | 性欧美牲交xxxxx视频 | 国产成人精品一区二区在线小狼 | 波多野结衣一区二区三区av免费 | 永久免费观看美女裸体的网站 | 好屌草这里只有精品 | 天天燥日日燥 | 老熟女乱子伦 | 国内揄拍国内精品少妇国语 | 嫩b人妻精品一区二区三区 | 久久久久久久人妻无码中文字幕爆 | 久久无码人妻影院 | 精品国偷自产在线 | 国产精品久久久 | 欧洲精品码一区二区三区免费看 | 特黄特色大片免费播放器图片 | 婷婷五月综合激情中文字幕 | 综合人妻久久一区二区精品 | 嫩b人妻精品一区二区三区 | 国产97色在线 | 免 | 一本加勒比波多野结衣 | 最近免费中文字幕中文高清百度 | 激情五月综合色婷婷一区二区 | 国内精品人妻无码久久久影院 | 性生交大片免费看女人按摩摩 | aⅴ亚洲 日韩 色 图网站 播放 | 免费无码的av片在线观看 | 全球成人中文在线 | 在线精品国产一区二区三区 | 亚洲人成影院在线无码按摩店 | 少妇被黑人到高潮喷出白浆 | 国产麻豆精品一区二区三区v视界 | 亚洲啪av永久无码精品放毛片 | 任你躁国产自任一区二区三区 | av无码不卡在线观看免费 | 国产欧美熟妇另类久久久 | 99久久精品日本一区二区免费 | 亚洲午夜久久久影院 | 国产莉萝无码av在线播放 | 精品久久久中文字幕人妻 | 亚洲日韩精品欧美一区二区 | 少妇太爽了在线观看 | 亚洲の无码国产の无码步美 | 青青草原综合久久大伊人精品 | 欧美国产日韩久久mv | 中国女人内谢69xxxxxa片 | 亚洲精品国偷拍自产在线麻豆 | 东京一本一道一二三区 | 日韩在线不卡免费视频一区 | 无码av最新清无码专区吞精 | 一本久道高清无码视频 | 狠狠色丁香久久婷婷综合五月 | 7777奇米四色成人眼影 | 粗大的内捧猛烈进出视频 | 亚洲日韩av一区二区三区四区 | 天天av天天av天天透 | 蜜臀av无码人妻精品 | 久久综合网欧美色妞网 | 欧洲精品码一区二区三区免费看 | 黑森林福利视频导航 | 久久视频在线观看精品 | 无码人妻丰满熟妇区毛片18 | 无码av岛国片在线播放 | 亚洲中文字幕在线无码一区二区 | 亚洲欧美中文字幕5发布 | 中文字幕乱码人妻二区三区 | 国产福利视频一区二区 | 又色又爽又黄的美女裸体网站 | 人妻少妇被猛烈进入中文字幕 | 国产精品多人p群无码 | 少妇被粗大的猛进出69影院 | 东京热无码av男人的天堂 | 亚洲成av人影院在线观看 | 日产精品99久久久久久 | 免费无码一区二区三区蜜桃大 | 亚洲欧美国产精品专区久久 | 精品一区二区不卡无码av | 久久久久久亚洲精品a片成人 | 亚洲成熟女人毛毛耸耸多 | 中文字幕 亚洲精品 第1页 | 激情内射亚州一区二区三区爱妻 | 久久国产自偷自偷免费一区调 | 久久www免费人成人片 | 婷婷六月久久综合丁香 | 98国产精品综合一区二区三区 | 狠狠亚洲超碰狼人久久 | 无码国产乱人伦偷精品视频 | 国内精品久久毛片一区二区 | 欧美黑人乱大交 | 97人妻精品一区二区三区 | 欧美人妻一区二区三区 | 成人女人看片免费视频放人 | 久久精品丝袜高跟鞋 | 精品成人av一区二区三区 | 国产乱人伦偷精品视频 | 日本护士xxxxhd少妇 | 亚洲爆乳大丰满无码专区 | 麻豆蜜桃av蜜臀av色欲av | 特大黑人娇小亚洲女 | 国产精品久久久av久久久 | 丁香啪啪综合成人亚洲 | 日本一区二区更新不卡 | 精品偷拍一区二区三区在线看 | 欧美人妻一区二区三区 | 天堂无码人妻精品一区二区三区 | 99久久久国产精品无码免费 | 骚片av蜜桃精品一区 | 狠狠色噜噜狠狠狠7777奇米 | 小sao货水好多真紧h无码视频 | 伊在人天堂亚洲香蕉精品区 | 国产农村妇女高潮大叫 | 免费看男女做好爽好硬视频 | 秋霞特色aa大片 | 玩弄人妻少妇500系列视频 | 无码帝国www无码专区色综合 | 精品久久久久香蕉网 | 亚洲国产精品毛片av不卡在线 | 少妇性l交大片欧洲热妇乱xxx | 国产精品久久久 | 骚片av蜜桃精品一区 | 亚洲精品一区国产 | 国产成人无码av片在线观看不卡 | 99视频精品全部免费免费观看 | aa片在线观看视频在线播放 | 国产精品久久久久久亚洲影视内衣 | 欧美人与禽猛交狂配 | 在线看片无码永久免费视频 | 亚洲另类伦春色综合小说 | 一个人看的www免费视频在线观看 | 中文字幕无码视频专区 | 亚洲精品一区二区三区大桥未久 | 无套内射视频囯产 | 国产电影无码午夜在线播放 | 久久久久久国产精品无码下载 | 国产乱人偷精品人妻a片 | 免费网站看v片在线18禁无码 | 亚洲小说春色综合另类 | 巨爆乳无码视频在线观看 | 中文字幕乱码人妻无码久久 | 亚洲欧美精品伊人久久 | 欧美性猛交xxxx富婆 | 亚洲日韩av片在线观看 | 日本一卡2卡3卡4卡无卡免费网站 国产一区二区三区影院 | 娇妻被黑人粗大高潮白浆 | 人妻尝试又大又粗久久 | 日本在线高清不卡免费播放 | 国产精品毛片一区二区 | 青青青手机频在线观看 | 99er热精品视频 | 蜜桃视频插满18在线观看 | 东京热男人av天堂 | 日本丰满熟妇videos | 亚洲成a人片在线观看日本 | 国产精品毛多多水多 | 女人高潮内射99精品 | 午夜理论片yy44880影院 | 国产精品va在线观看无码 | 国产精品igao视频网 | 成人无码影片精品久久久 | 国产综合在线观看 | 国产精品久久久久无码av色戒 | 中文字幕+乱码+中文字幕一区 | 久久久久人妻一区精品色欧美 | 99久久久国产精品无码免费 | 精品人妻中文字幕有码在线 | 狠狠亚洲超碰狼人久久 | 四虎国产精品一区二区 | 亚洲色大成网站www | 成熟妇人a片免费看网站 | 日韩 欧美 动漫 国产 制服 | 成人三级无码视频在线观看 | 无套内谢的新婚少妇国语播放 | 性色欲情网站iwww九文堂 | 国产精品毛片一区二区 | 精品久久8x国产免费观看 | 亚洲国产欧美日韩精品一区二区三区 | 亚洲欧美日韩成人高清在线一区 | 清纯唯美经典一区二区 | 国产三级久久久精品麻豆三级 | 久久亚洲日韩精品一区二区三区 | 成人一在线视频日韩国产 | 人妻插b视频一区二区三区 | 特级做a爰片毛片免费69 | 欧美一区二区三区视频在线观看 | 亚洲精品成人福利网站 | 久久亚洲a片com人成 | 亚洲精品久久久久avwww潮水 | 国产精品沙发午睡系列 | 久久99精品久久久久婷婷 | 国产乱人偷精品人妻a片 | 丰满护士巨好爽好大乳 | 午夜性刺激在线视频免费 | 无码人妻少妇伦在线电影 | 131美女爱做视频 | 精品国产乱码久久久久乱码 | 国产激情无码一区二区app | 亚洲精品国偷拍自产在线观看蜜桃 | 亚洲中文字幕无码一久久区 | 免费国产成人高清在线观看网站 | 男人扒开女人内裤强吻桶进去 | 日本精品少妇一区二区三区 | 久久久亚洲欧洲日产国码αv | 国产97色在线 | 免 | 成人三级无码视频在线观看 | 麻豆国产97在线 | 欧洲 | √天堂资源地址中文在线 | 亚洲色大成网站www | 丰满少妇女裸体bbw | 久久人妻内射无码一区三区 | 色综合视频一区二区三区 | 国产口爆吞精在线视频 | 国产免费无码一区二区视频 | 亚洲一区二区三区无码久久 | 亚洲午夜久久久影院 | 波多野结衣av一区二区全免费观看 | 中文字幕无码热在线视频 | 性生交大片免费看女人按摩摩 | 国产极品美女高潮无套在线观看 | 久久99精品国产.久久久久 | 亚洲一区二区三区播放 | 中文字幕av无码一区二区三区电影 | 亚洲日本在线电影 | 色欲久久久天天天综合网精品 | 国内少妇偷人精品视频免费 | 人人妻人人澡人人爽人人精品 | 一本精品99久久精品77 | 国产午夜视频在线观看 | 亚洲欧美精品aaaaaa片 | 精品欧美一区二区三区久久久 | 帮老师解开蕾丝奶罩吸乳网站 | 一本大道久久东京热无码av | 亚洲日韩av片在线观看 | 乱中年女人伦av三区 | 久久久www成人免费毛片 | 日本大香伊一区二区三区 | 精品无人国产偷自产在线 | 午夜性刺激在线视频免费 | 亚洲日本一区二区三区在线 | 一本久道久久综合婷婷五月 | 久久久久久国产精品无码下载 | 久久久久久av无码免费看大片 | 在线а√天堂中文官网 | 国产精品亚洲а∨无码播放麻豆 | 99精品无人区乱码1区2区3区 | 网友自拍区视频精品 | 国产成人精品三级麻豆 | 国产在线无码精品电影网 | 国产亚洲精品久久久久久久 | 夜夜躁日日躁狠狠久久av | 国产超碰人人爽人人做人人添 | 美女张开腿让人桶 | 国模大胆一区二区三区 | 国产成人综合在线女婷五月99播放 | 亚洲精品国产品国语在线观看 | 午夜不卡av免费 一本久久a久久精品vr综合 | 国产 浪潮av性色四虎 | 国产福利视频一区二区 | 日本va欧美va欧美va精品 | 性色欲情网站iwww九文堂 | 中文字幕无码av波多野吉衣 | 国产农村乱对白刺激视频 | 中文无码成人免费视频在线观看 | 国产精品久久久久久无码 | 99麻豆久久久国产精品免费 | 粉嫩少妇内射浓精videos | 亚洲精品成人福利网站 | 日本大香伊一区二区三区 | 精品国产aⅴ无码一区二区 | 中文字幕av伊人av无码av | 国产熟妇高潮叫床视频播放 | 风流少妇按摩来高潮 | 亚洲精品无码国产 | 国产另类ts人妖一区二区 | 亚洲无人区午夜福利码高清完整版 | 丝袜足控一区二区三区 | 中文字幕乱码亚洲无线三区 | 曰韩无码二三区中文字幕 | aⅴ在线视频男人的天堂 | 日本在线高清不卡免费播放 | 欧美喷潮久久久xxxxx | 久久99精品久久久久久 | 精品一区二区不卡无码av | 国产片av国语在线观看 | 日本大香伊一区二区三区 | 秋霞成人午夜鲁丝一区二区三区 | 天天综合网天天综合色 | 水蜜桃av无码 | 亚洲中文字幕久久无码 | 动漫av一区二区在线观看 | 精品久久综合1区2区3区激情 | 麻豆精产国品 | 精品国偷自产在线 | 夜夜高潮次次欢爽av女 | 国产成人午夜福利在线播放 | 欧美日韩在线亚洲综合国产人 | 国产精品久久久一区二区三区 | 国内少妇偷人精品视频免费 | 国产片av国语在线观看 | 又大又硬又爽免费视频 | 亚洲人交乣女bbw | 熟女体下毛毛黑森林 | 国产精华av午夜在线观看 | 99久久婷婷国产综合精品青草免费 | 欧美黑人乱大交 | 无码午夜成人1000部免费视频 | 又粗又大又硬毛片免费看 | 亚洲国产一区二区三区在线观看 | 精品久久综合1区2区3区激情 | 日韩欧美成人免费观看 | 玩弄少妇高潮ⅹxxxyw | 亚洲色成人中文字幕网站 | 综合激情五月综合激情五月激情1 | 色欲久久久天天天综合网精品 | 精品国产一区二区三区四区 | 免费无码av一区二区 | www国产亚洲精品久久网站 | 在线观看欧美一区二区三区 | 精品国产成人一区二区三区 | 人人爽人人爽人人片av亚洲 | 国产人妻精品一区二区三区 | 亚洲国产欧美国产综合一区 | 亚洲日韩一区二区 | 一本久久a久久精品vr综合 | 国产激情无码一区二区 | 思思久久99热只有频精品66 | 久久天天躁夜夜躁狠狠 | 色综合久久久无码中文字幕 | 无码人妻精品一区二区三区下载 | 双乳奶水饱满少妇呻吟 | 亚洲无人区一区二区三区 | 国内综合精品午夜久久资源 | 88国产精品欧美一区二区三区 | 在线观看国产一区二区三区 | 在教室伦流澡到高潮hnp视频 | 亚洲国产综合无码一区 | 国产凸凹视频一区二区 | 图片小说视频一区二区 | 精品无码国产自产拍在线观看蜜 | 亚洲男女内射在线播放 | 无码人妻丰满熟妇区五十路百度 | 性生交大片免费看女人按摩摩 | 国产国产精品人在线视 | 高清不卡一区二区三区 | 亚洲精品欧美二区三区中文字幕 | 久久午夜无码鲁丝片午夜精品 | 亚洲人成影院在线观看 | 自拍偷自拍亚洲精品10p | 无码av免费一区二区三区试看 | 精品亚洲成av人在线观看 | 欧美日韩一区二区综合 | 亚洲中文字幕va福利 | 婷婷综合久久中文字幕蜜桃三电影 | 激情综合激情五月俺也去 | 国产综合久久久久鬼色 | 国产在线一区二区三区四区五区 | 一本久道高清无码视频 | 无码av中文字幕免费放 | 97精品国产97久久久久久免费 | 免费看男女做好爽好硬视频 | 欧美精品免费观看二区 | 欧美野外疯狂做受xxxx高潮 | 久久亚洲精品中文字幕无男同 | 少妇高潮喷潮久久久影院 | 无码人妻av免费一区二区三区 | 色综合久久中文娱乐网 | 国产午夜亚洲精品不卡 | 欧美成人高清在线播放 | 国产精品va在线观看无码 | 免费看男女做好爽好硬视频 | 激情内射亚州一区二区三区爱妻 | 天堂亚洲2017在线观看 | 妺妺窝人体色www在线小说 | 青青青爽视频在线观看 | 亚洲色成人中文字幕网站 | 久久久久人妻一区精品色欧美 | 97精品国产97久久久久久免费 | 精品无码成人片一区二区98 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 日本熟妇乱子伦xxxx | 久久zyz资源站无码中文动漫 | 国产偷国产偷精品高清尤物 | 国内老熟妇对白xxxxhd | 欧洲欧美人成视频在线 | 国产97人人超碰caoprom | 成人欧美一区二区三区黑人免费 | 精品欧洲av无码一区二区三区 | 国产 精品 自在自线 | a片免费视频在线观看 | 国产成人无码专区 | 99国产精品白浆在线观看免费 | 免费播放一区二区三区 | 亚拍精品一区二区三区探花 | 国产乱人无码伦av在线a | 亚洲人交乣女bbw | 亚洲精品久久久久久久久久久 | 久久人人97超碰a片精品 | 亚洲の无码国产の无码影院 | 丁香啪啪综合成人亚洲 | 大屁股大乳丰满人妻 | 国产真实伦对白全集 | 狠狠cao日日穞夜夜穞av | 中文亚洲成a人片在线观看 | 最近中文2019字幕第二页 | 国产内射爽爽大片视频社区在线 | 狠狠色色综合网站 | 亚洲熟妇色xxxxx欧美老妇y | 亚洲人亚洲人成电影网站色 | 日韩欧美中文字幕在线三区 | 亚洲成av人综合在线观看 | 久久久久久久久888 | 秋霞特色aa大片 | 日韩人妻系列无码专区 | 亚洲综合在线一区二区三区 | 亚洲精品国产a久久久久久 | 男人的天堂2018无码 | 欧洲欧美人成视频在线 | 国产精品国产三级国产专播 | 好屌草这里只有精品 | 欧美亚洲日韩国产人成在线播放 | 狠狠色噜噜狠狠狠狠7777米奇 | 无码乱肉视频免费大全合集 | 亚洲国产一区二区三区在线观看 | 国产在线aaa片一区二区99 | 中文字幕无码av激情不卡 | 国产精品无码mv在线观看 | 免费无码肉片在线观看 | 国产xxx69麻豆国语对白 | 娇妻被黑人粗大高潮白浆 | 性生交大片免费看女人按摩摩 | 夜夜影院未满十八勿进 | 国产av无码专区亚洲awww | 亚洲一区二区三区含羞草 | 中文精品无码中文字幕无码专区 | 亚洲va欧美va天堂v国产综合 | 国产69精品久久久久app下载 | 久久久精品人妻久久影视 | 狠狠综合久久久久综合网 | 青青青爽视频在线观看 | 男人的天堂2018无码 | 乱人伦人妻中文字幕无码久久网 | 日韩精品成人一区二区三区 | 乱码午夜-极国产极内射 | 无套内射视频囯产 | 熟女少妇人妻中文字幕 | 性欧美牲交xxxxx视频 | 精品无码成人片一区二区98 | 亚洲精品午夜国产va久久成人 | 高清不卡一区二区三区 | 中文字幕无码av激情不卡 | 国产国产精品人在线视 | 一本久久a久久精品vr综合 | 久久久国产精品无码免费专区 | 亚洲日韩av一区二区三区中文 | 国产农村乱对白刺激视频 | 女人被男人躁得好爽免费视频 | 波多野结衣乳巨码无在线观看 | 亚洲精品国偷拍自产在线麻豆 | 亚洲 高清 成人 动漫 | 亚洲精品久久久久中文第一幕 | 国产精品久久国产三级国 | 亚洲国产精品久久久久久 | 亚洲国精产品一二二线 | 激情国产av做激情国产爱 | √天堂资源地址中文在线 | 欧美熟妇另类久久久久久多毛 | 男女下面进入的视频免费午夜 | 鲁大师影院在线观看 | 日产精品99久久久久久 | 亚洲国产精品毛片av不卡在线 | 粉嫩少妇内射浓精videos | www国产精品内射老师 | v一区无码内射国产 | 中文字幕中文有码在线 | 亚洲色无码一区二区三区 | 欧美人与物videos另类 | 色欲人妻aaaaaaa无码 | 波多野结衣一区二区三区av免费 | 久久久中文久久久无码 | 理论片87福利理论电影 | 小泽玛莉亚一区二区视频在线 | 亚洲 另类 在线 欧美 制服 | 久久久久久久女国产乱让韩 | 亚洲一区二区三区香蕉 | 中文字幕乱码亚洲无线三区 | 中文无码精品a∨在线观看不卡 | 97夜夜澡人人双人人人喊 | 欧美老妇与禽交 | 国产无套内射久久久国产 | 性色av无码免费一区二区三区 | 偷窥村妇洗澡毛毛多 | 无码免费一区二区三区 | 精品日本一区二区三区在线观看 | 国产偷抇久久精品a片69 | 野外少妇愉情中文字幕 | 国产精品无码一区二区桃花视频 | 日本精品久久久久中文字幕 | 夜夜高潮次次欢爽av女 | 亚洲国产成人a精品不卡在线 | 精品久久久久久人妻无码中文字幕 | 男人和女人高潮免费网站 | av香港经典三级级 在线 | 亚洲の无码国产の无码影院 | 无码人妻少妇伦在线电影 | 日本免费一区二区三区最新 | 无码人妻久久一区二区三区不卡 | 乱码av麻豆丝袜熟女系列 | 欧美国产日产一区二区 | 55夜色66夜色国产精品视频 | 奇米综合四色77777久久 东京无码熟妇人妻av在线网址 | 天堂亚洲2017在线观看 | 色综合久久久久综合一本到桃花网 | 亚洲阿v天堂在线 | 无遮挡啪啪摇乳动态图 | 日本欧美一区二区三区乱码 | 1000部夫妻午夜免费 | 国产激情无码一区二区app | 日日噜噜噜噜夜夜爽亚洲精品 | 久久亚洲国产成人精品性色 | 美女黄网站人色视频免费国产 | 日本护士毛茸茸高潮 |