国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频

深入理解Camera 三 (相機(jī)應(yīng)用層)

共 18755字,需瀏覽 38分鐘

 ·

2021-01-14 23:49

和你一起終身學(xué)習(xí),這里是程序員Android


經(jīng)典好文推薦,通過(guò)閱讀本文,您將收獲以下知識(shí)點(diǎn):

一、概覽
二、Camera Api v2
三、Camera Framework
四、Camera App Demo

相機(jī)應(yīng)用層

一、概覽

相機(jī)應(yīng)用處于整個(gè)框架的上層,在現(xiàn)實(shí)生活中,為了滿足各式各樣的應(yīng)用場(chǎng)景,會(huì)加入很多業(yè)務(wù)處理邏輯,但是一旦當(dāng)我們撥開(kāi)繁雜的業(yè)務(wù)邏輯,便會(huì)發(fā)現(xiàn)其核心部分依然是通過(guò)調(diào)用谷歌制訂的一系列Camera Api接口來(lái)完成的,而所有的相機(jī)行為都包含在該接口中。

起初,相機(jī)系統(tǒng)采用的是Camera Api v1接口,它通過(guò)一個(gè)Camera 類以及該類中的幾個(gè)標(biāo)準(zhǔn)方法來(lái)實(shí)現(xiàn)整個(gè)相機(jī)系統(tǒng)的預(yù)覽、拍照以及錄像功能,控制邏輯比較簡(jiǎn)單,同時(shí)也比較容易理解,但也正是這種簡(jiǎn)單,導(dǎo)致了它無(wú)法逐幀控制底層硬件,無(wú)法通過(guò)元數(shù)據(jù)進(jìn)行修改進(jìn)而增強(qiáng)幀的表達(dá)能力,再加之應(yīng)用場(chǎng)景的多樣化趨勢(shì),該接口在新功能的實(shí)現(xiàn)上顯得些許力不從心。面對(duì)該接口難以進(jìn)一步擴(kuò)展相機(jī)功能這一局面,谷歌在Andorid 5.0(API Level 21)便重新對(duì)Camera進(jìn)行了設(shè)計(jì),摒棄了Camera Api v1的設(shè)計(jì)邏輯,提出了一個(gè)全新的API – camera2,引入了Session以及Request概念,將控制邏輯統(tǒng)一成一個(gè)視圖,因此在使用上更加復(fù)雜,同時(shí)也支持了更多特性,比如逐幀控制曝光、感光度以及支持Raw格式的輸出等。并且由于對(duì)控制邏輯的高度抽象化,使得該接口具有很高的靈活性,可以通過(guò)簡(jiǎn)單的操作實(shí)現(xiàn)30fps的全高清連拍的功能,總得來(lái)說(shuō),該接口極大地提高了對(duì)于相機(jī)框架的控制能力,同時(shí)也進(jìn)一步大幅度提升了其整體性能。

谷歌提出Camera Api v2接口的同時(shí),將其具體實(shí)現(xiàn)放入了Camera Framework中來(lái)完成,F(xiàn)ramework內(nèi)部負(fù)責(zé)解析來(lái)自App的請(qǐng)求,并且通過(guò)AIDL跨進(jìn)程接口下發(fā)到Camera Service中進(jìn)行處理,并且等待結(jié)果的回傳。接下來(lái)我們首先以Camera Api v2接口為主簡(jiǎn)單講解下其邏輯含義,然后詳細(xì)梳理下Camera Framework對(duì)于它的實(shí)現(xiàn),最后以一個(gè)簡(jiǎn)單App Demo為例,來(lái)介紹下如何使用該接口來(lái)控制整個(gè)相機(jī)體系。

程序員Android轉(zhuǎn)于網(wǎng)絡(luò)

二、Camera Api v2

在介紹Camera Api v2之前,首先我們來(lái)回顧下Api v1接口的基本邏輯,該接口主要通過(guò)一個(gè)Camera.java類來(lái)定義了所有的控制行為,通過(guò)定義諸如open、startPreview、takePicture、AutoFocus等標(biāo)準(zhǔn)的接口來(lái)實(shí)現(xiàn)打開(kāi)設(shè)備、預(yù)覽、拍照以及對(duì)焦操作的功能,同時(shí)通過(guò)定義Camera.Parameters來(lái)實(shí)現(xiàn)了參數(shù)的讀取與設(shè)置,其中包括了幀率、圖片格式的控制,另外,通過(guò)定義了Camera.CameraInfo來(lái)實(shí)現(xiàn)了圖像元數(shù)據(jù)的獲取。而為了更加細(xì)致化地控制相機(jī)系統(tǒng)的Camera Api v2接口,相對(duì)于Api v1接口而言,復(fù)雜了許多,通過(guò)不同的接口類以及接口方法定義了復(fù)雜的相機(jī)系統(tǒng)行為,接下來(lái)我們來(lái)逐一進(jìn)行介紹:

CameraManager
谷歌將CameraManager定義為一個(gè)系統(tǒng)服務(wù),通過(guò)Context.getSystemService來(lái)獲取,主要用于檢測(cè)以及打開(kāi)系統(tǒng)相機(jī),其中打開(kāi)操作通過(guò)openCamera方法來(lái)完成。除此之外,還定義了getCameraCharacteristics方法來(lái)獲取當(dāng)前Camera 設(shè)備支持的屬性信息,而該屬性信息通過(guò)CameraCharacteristics來(lái)表示,其中包括了圖像數(shù)據(jù)的大小以及幀率等信息。

CameraDevice
代表了一個(gè)被打開(kāi)的系統(tǒng)相機(jī),類似于Camera Api v1中的Camera類,用于創(chuàng)建CameraCaptureSession以及對(duì)于最后相機(jī)資源的釋放。

CameraDevice.StateCallback
該類定義了一系列的回調(diào)方法,其實(shí)現(xiàn)交由App來(lái)完成,主要用于返回創(chuàng)建Camera設(shè)備的結(jié)果,一旦創(chuàng)建成功相機(jī)框架會(huì)通過(guò)回調(diào)其onOpened方法將CameraDevice實(shí)例給到App,如果失敗,則調(diào)用onError返回錯(cuò)誤信息。

CameraCaptureSession
該類代表了一個(gè)具體的相機(jī)會(huì)話,建立了與Camera設(shè)備的通道,而之后對(duì)于Camera 設(shè)備的控制都是通過(guò)該通道來(lái)完成的。當(dāng)需要進(jìn)行預(yù)覽或者拍照時(shí),首先通過(guò)該類創(chuàng)建一個(gè)Session,并且調(diào)用其startRepeatingRequest方法開(kāi)啟預(yù)覽流程,或者調(diào)用capture方法開(kāi)始一次拍照動(dòng)作。

CameraCaptureSession.StateCallback
該接口類定義了一系列回調(diào)方法,其實(shí)現(xiàn)交由App完成,主要用于返回創(chuàng)建CameraCaptureSession的結(jié)果,成功則通過(guò)onConfigured方法返回一個(gè)CameraCaptureSession實(shí)例,如果失敗則通過(guò)onConfigureFailed返回錯(cuò)誤信息。

CameraCaptureSession.CaptureCallback
該接口類定義了一系列回調(diào)方法,用于返回來(lái)自Camera Framework的數(shù)據(jù)和事件,其中onCaptureStarted方法在下發(fā)圖像需求之后立即被調(diào)用,告知App此次圖像需求已經(jīng)收到,onCaptureProgressed方法在產(chǎn)生partial meta data的時(shí)候回調(diào),onCaptureCompleted方法在圖像采集完成,上傳meta data數(shù)據(jù)時(shí)被調(diào)用。

CaptureRequest
該類用于表示一次圖像請(qǐng)求,在需要進(jìn)行預(yù)覽或者拍照時(shí),都需要?jiǎng)?chuàng)建一個(gè)CaptureRequest,并且將針對(duì)圖片的一系列諸如曝光/對(duì)焦設(shè)置參數(shù)都加入到該Request中,通過(guò)CameraCaptureSessin下發(fā)到相機(jī)系統(tǒng)中。

TotalCaptureResult
每當(dāng)通過(guò)CameraDevice完成了一次CaptureRequest之后會(huì)生成一個(gè)TotalCaptureResult對(duì)象,該對(duì)象包含了此次抓取動(dòng)作所產(chǎn)生的所有信息,其中包括關(guān)于硬件模塊(包括Sensor/lens/flash)的配置信息以及相機(jī)設(shè)備的狀態(tài)信息等。

CaptureResult
該類代表了某次抓取動(dòng)作最終生成的圖像信息,其中包括了此次關(guān)于硬件軟件的配置信息以及輸出的圖像數(shù)據(jù),以及顯示了當(dāng)前Camera設(shè)備的狀態(tài)的元數(shù)據(jù)(meta data),該類并不保證擁有所有的圖像信息。

三、Camera Framework

基于接口與實(shí)現(xiàn)相分離的基本設(shè)計(jì)原則,谷歌通過(guò)Camera Api 接口的定義,搭建起了App與相機(jī)系統(tǒng)的橋梁,而具體實(shí)現(xiàn)便是由Camera Framework來(lái)負(fù)責(zé)完成的。在采用Camera Api v1接口的時(shí)期,該部分是通過(guò)JNI層來(lái)進(jìn)行java到C++的轉(zhuǎn)換,進(jìn)而到達(dá)native層,而在native層會(huì)通過(guò)實(shí)現(xiàn)CameraClient建立與Camera Service的通訊 ,整個(gè)過(guò)程比較繁瑣,使得整體框架略顯繁雜,而隨著Camera Api v2的提出,在該層便大量使用AIDL機(jī)制,直接在Java層建立與Camera Service的通信,進(jìn)一步簡(jiǎn)化了整體框架。,接下來(lái)我們以幾個(gè)主要接口為主線,簡(jiǎn)單梳理下其具體實(shí)現(xiàn)。

程序員Android 轉(zhuǎn)于網(wǎng)絡(luò)

CameraManager
實(shí)現(xiàn)主要在CameraManager.java中,通過(guò)CameraManager查詢、獲取以及打開(kāi)一個(gè)Camera 設(shè)備。在該類中還實(shí)現(xiàn)了內(nèi)部類CameraManagerGlobal,該類繼承于ICameraServiceListener.Stub,在打開(kāi)相機(jī)設(shè)備的時(shí)候,在內(nèi)部會(huì)獲取到ICameraService遠(yuǎn)程代理,并且調(diào)用ICameraService的addListener方法將自己注冊(cè)到Camera Service中,一旦Camera Service狀態(tài)有所變更便會(huì)通過(guò)其實(shí)現(xiàn)的回調(diào)方法通知到Camera Manager服務(wù),另外,該類還通過(guò)調(diào)用ICameraService.connectDevice()方法獲取到Camera Service中的CameraDevice遠(yuǎn)程代理,并且將該代理傳入CameraDeviceImpl中,進(jìn)而與Camera Service建立了連接。

CameraDeviceImpl
該類定義在CameraDeviceImpl.java文件中,繼承并實(shí)現(xiàn)了CameraDevice接口,代表了一個(gè)相機(jī)設(shè)備,可以完成CameraCaptureSession的創(chuàng)建以及CaptureRequest創(chuàng)建等工作,內(nèi)部定義了CameraDeviceCallbacks類(該類繼承于ICameraDeviceCallbacks.Stub,對(duì)應(yīng)于Camera Service中的 ICameraDeviceCallbacks接口),用于接收來(lái)自Camera Service中的Camera Device的狀態(tài)回調(diào),并且內(nèi)部維護(hù)著一個(gè)Camera Service 的遠(yuǎn)程ICameraDevice代理,進(jìn)而可以下發(fā)圖像請(qǐng)求到Camera Service中。

CameraCaptureSessionImpl
該類定義在CameraCaptureSessionImpl.java文件中,繼承并實(shí)現(xiàn)了CameraCaptureSession接口,每一個(gè)相機(jī)設(shè)備在一個(gè)時(shí)間段中,只能創(chuàng)建并存在一個(gè)CameraCaptureSession,其中該類包含了兩種Session,一種是普通的,適用于一般情況下的會(huì)話操作,另一種是用于Reprocess流程的會(huì)話操作,該流程主要用于對(duì)于現(xiàn)有的圖像數(shù)據(jù)進(jìn)行再處理的操作。該類維護(hù)著來(lái)自實(shí)例化時(shí)傳入的Surface列表,這些Surface正是包含了每一個(gè)圖像請(qǐng)求的數(shù)據(jù)緩沖區(qū)。

除了以上這幾個(gè)接口,還有幾個(gè)接口是需要App部分進(jìn)行實(shí)現(xiàn)的,用于返回App所需要的對(duì)象或者數(shù)據(jù):

CameraDevice.StateCallback
被App端進(jìn)行繼承并實(shí)現(xiàn),用于在調(diào)用CameraManager的openCamera方法時(shí),通過(guò)參數(shù)的形式傳入Framework,在Framework中,一旦CameraDeviceImpl創(chuàng)建成功便通過(guò)其中的onOpened方法將其返回給App,如果失敗,便會(huì)通過(guò)其他方法返回給App錯(cuò)誤信息。

CameraCaptureSession.StateCallback
被App端進(jìn)行繼承并實(shí)現(xiàn),用于在調(diào)用CameraDevice的createCaptureSession方法時(shí)作為參數(shù)傳入Framework中,一旦創(chuàng)建成功,F(xiàn)ramework便會(huì)通過(guò)調(diào)用該類的onConfigured接口返回一個(gè)CameraCaptureSessionImpl的對(duì)象,如果失敗,F(xiàn)ramework會(huì)調(diào)用其onConfigureFailed方法將錯(cuò)誤信息返回至App。

CameraCaptureSession.CaptureCallback
被App端進(jìn)行繼承并實(shí)現(xiàn),App通過(guò)調(diào)用CameraCaptureSessionImpl的setReaptingRequest或者capture方法是作為參數(shù)傳入Framework,一旦Framework接收到來(lái)自CameraService的數(shù)據(jù)時(shí),便會(huì)通過(guò)調(diào)用這個(gè)回調(diào)類將數(shù)據(jù)發(fā)送至App中。

程序員Android轉(zhuǎn)于網(wǎng)絡(luò)

Camera Framework 中針對(duì)幾個(gè)接口的調(diào)用流程如上圖,接下來(lái)我們依次進(jìn)行分析:

a) openCamera
當(dāng)用戶打開(kāi)相機(jī)應(yīng)用時(shí),會(huì)去調(diào)用該方法打開(kāi)一個(gè)相機(jī)設(shè)備,其中該方法最終經(jīng)過(guò)層層調(diào)用會(huì)調(diào)用到Camera Framework中的openCameraDeviceUserAsync方法,在該方法中主要做了三件事:

  • 首先是獲取ICameraService代理,調(diào)用其getCameraInfo方法獲取當(dāng)前設(shè)備的屬性。

  • 其次是實(shí)例化了一個(gè)CameraDeviceImpl對(duì)象,并將來(lái)自App的CameraDevice.StateCallback接口存入該對(duì)象中,再將CameraDeviceImpl中的內(nèi)部類CameraDeviceCallback作為參數(shù)通過(guò)ICameraService的connectDevice方法傳入Camera Service去打開(kāi)并獲取一個(gè)ICameraDeviceUser代理,并將該代理存入CameraDeviceImpl中進(jìn)行管理。

  • 最后通過(guò)App傳入的回調(diào)將CameraDeviceImpl返回給App使用,至此整個(gè)流程便完成了。

b) createCaptureSession
在打開(kāi)相機(jī)設(shè)備之后便需要去創(chuàng)建一個(gè)相機(jī)會(huì)話,用于傳輸圖像請(qǐng)求,其最終實(shí)現(xiàn)是調(diào)用該方法來(lái)進(jìn)行實(shí)現(xiàn)的,而該方法會(huì)去調(diào)用到Camera Framework中的createCaptureSessionInternal方法,該方法主要做了兩件事:

  • 首先調(diào)用configureStreamsChecked方法來(lái)配置數(shù)據(jù)流。

  • 其次實(shí)例化了一個(gè)CameraCaptureImpl對(duì)象,并通過(guò)傳入CameraCaptureSession.StateCallback回調(diào)類將該對(duì)象發(fā)送至至App中。

而在configureStreamsChecked方法中會(huì)去調(diào)用ICameraDeviceUser代理的一系列方法進(jìn)行數(shù)據(jù)流配置,其中調(diào)用cancelRequest方法停掉當(dāng)前的的預(yù)覽流程,調(diào)用deleteStream方法刪除之前的數(shù)據(jù)流,調(diào)用createStream創(chuàng)建新的數(shù)據(jù)流,最后調(diào)用endConfigure來(lái)進(jìn)行數(shù)據(jù)流的配置工作,針對(duì)性的配置便在最后這個(gè)endConfigure方法中。

c) createCaptureRequest
在創(chuàng)建并獲取相機(jī)會(huì)話之后,便可以開(kāi)始下發(fā)圖像請(qǐng)求了,而在此之前,需要通過(guò)該方法來(lái)創(chuàng)建一個(gè)CaptureRequest,一旦調(diào)用該方法,最終會(huì)調(diào)用到Camera Service中ICameraDeviceUser的createDefaultRequest方法來(lái)創(chuàng)建一個(gè)默認(rèn)配置的CameraMetadataNative,其次實(shí)例化一個(gè)CaptureRequest.Builder對(duì)象,并將剛才獲取的CameraMetadataNative傳入其中,之后返回該CaptureRequest.Builder對(duì)象,在App中,直接通過(guò)調(diào)用該Buidler對(duì)象的build方法,獲取一個(gè)CaptureRequest對(duì)象。

CaptureRequest對(duì)象也創(chuàng)建成功了,接下來(lái)需要下發(fā)圖像請(qǐng)求了,一般常用請(qǐng)求分為兩種,一個(gè)是預(yù)覽一個(gè)是拍照。

d) setRepeatingRequest
App調(diào)用該方法開(kāi)始預(yù)覽流程,通過(guò)層層調(diào)用最終會(huì)調(diào)用到Framework中的submitCaptureRequest方法,該方法主要做了兩件事:

  • 首先調(diào)用CameraService層CameraDeviceUser的submitRequestList方法,將此次Request下發(fā)到CameraService中。

  • 其次將App通過(guò)參數(shù)傳入的CameraCaptureSession.CaptureCallback對(duì)象存到CameraDeviceImpI對(duì)象中。

接下來(lái)看下拍照請(qǐng)求的處理流程:
e) capture
該方法最終也會(huì)調(diào)用到Framework中的submitCaptureRequest方法,接下來(lái)邊和預(yù)覽流程大致相同,會(huì)去調(diào)用Camera Service 中的ICameraDeviceUser的submitRequestList方法傳入請(qǐng)求,之后將App實(shí)現(xiàn)的回調(diào)對(duì)象存入CameraDeviceImpl對(duì)象中。

f) onCaptureProgressed
一旦Request下發(fā)到Camera Service之后,當(dāng)?shù)讓由闪薖artial Meta Data數(shù)據(jù),Camera Service會(huì)調(diào)用通過(guò)調(diào)用在打開(kāi)相機(jī)設(shè)備時(shí)傳入的ICameraDeviceCallback代理,通過(guò)其onResultReceived方法將數(shù)據(jù)傳回Framework,之后調(diào)用App傳入的CameraCaptureSession.CaptureCallback中的onCaputreProgressed方法將結(jié)果回傳至App進(jìn)行解析以及后處理。

g) onCaptureCompleted
一旦Request下發(fā)到Camera Service之后,當(dāng)?shù)讓由闪薓eta data數(shù)據(jù),Camera Service會(huì)調(diào)用通過(guò)調(diào)用在打開(kāi)相機(jī)設(shè)備時(shí)傳入的ICameraDeviceCallback代理,通過(guò)其onResultReceived方法將數(shù)據(jù)傳回Framework,之后調(diào)用App傳入的CameraCaptureSession.CaptureCallback中的onCaputreCompleted方法將結(jié)果回傳至App進(jìn)行解析以及后處理。

h) onImageAvailable
之前已經(jīng)通過(guò)兩個(gè)回調(diào)接口onCaptureProgressed以及onCaptureCompleted方法將meta data上傳到了App,一般情況下,圖像數(shù)據(jù)會(huì)在他們之后上傳,而且這個(gè)上傳過(guò)程并不經(jīng)過(guò)Camera Framework,而是通過(guò)BufferQueue來(lái)進(jìn)行的,當(dāng)Camera Service接收到底層傳來(lái)的圖像數(shù)據(jù),便會(huì)立即調(diào)用processCaptureResult_3_4方法,該方法中會(huì)去調(diào)用BufferQueue中生產(chǎn)者角色的Surface的queueBuffer方法,將數(shù)據(jù)入隊(duì)并通知消費(fèi)者去消費(fèi),而此時(shí)的消費(fèi)者正是App端的ImageReader,并經(jīng)過(guò)一層層回調(diào),最終會(huì)通過(guò)調(diào)用ImageReader的onImageAvailable方法,通知ImageReader去將數(shù)據(jù)取出,并做后期操作。

從上面的梳理不難發(fā)現(xiàn),整個(gè)Camera Framework除了是對(duì)Camera Api v2的實(shí)現(xiàn)外,還承擔(dān)著與Camera Service跨進(jìn)程通信的任務(wù),充當(dāng)了一個(gè)位于App與Service之間的中轉(zhuǎn)站的角色。

四、Camera App Demo

經(jīng)過(guò)上面的梳理總結(jié),我們已經(jīng)對(duì)整個(gè)Camera Api v2接口以及實(shí)現(xiàn)都有了一個(gè)較為深入的認(rèn)識(shí),但是認(rèn)識(shí)暫時(shí)僅僅停留在代碼層面,為了更好理解其功能,接下來(lái)我們以一個(gè)簡(jiǎn)單的相機(jī)應(yīng)用入手來(lái)加深下對(duì)接口的使用流程的理解:

該相機(jī)Demo比較簡(jiǎn)單,界面有兩個(gè)元素,一個(gè)是用于預(yù)覽顯示的TextureView,以及一個(gè)用于拍照的按鈕,整個(gè)代碼就采用了一個(gè)MainActiviy,相機(jī)操作就在該類中進(jìn)行,其主要代碼如下:

package com.bruce.camerademo1;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.ImageFormat;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.TotalCaptureResult;
import android.media.Image;
import android.media.ImageReader;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.util.Size;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;

import java.io.File;
import java.io.FileOutputStream;
import java.nio.ByteBuffer;
import java.util.Arrays;

public class MainActivity extends AppCompatActivity {

TextureView mTextureView = null;
CameraManager mCamManager = null;
CameraDevice mCamDevice = null;
CameraCaptureSession mCamSession = null;
Button mClick = null;

//預(yù)覽數(shù)據(jù)大小 1080 × 720
private Size mPreviewSize = new Size(1080, 720);
//拍照數(shù)據(jù)圖像大小 1080 × 720
private Size mCaptureSize = new Size(1080, 720);

private Surface mPreviewSurface = null;
private CaptureRequest.Builder mCaptureRequestBuilder = null;
private CaptureRequest mCaptureRequest = null;
private ImageReader mImageReader = null;
static String LOG_TAG = "Camera";

private void log(String s) {
if (s.isEmpty()) {
Log.e(LOG_TAG, "s is empty");
return;
}
Log.i(LOG_TAG, "" + s);
}

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

@Override
protected void onResume() {
super.onResume();
mTextureView = findViewById(R.id.textview);
mTextureView.setSurfaceTextureListener(textureListener);
mClick = findViewById(R.id.button);
mImageReader = ImageReader.newInstance(mCaptureSize.getWidth(), mCaptureSize.getHeight(), ImageFormat.JPEG, 2);
mImageReader.setOnImageAvailableListener(new ImageReader.OnImageAvailableListener() {
@Override
public void onImageAvailable(ImageReader reader) {
Image image = reader.acquireNextImage();
ByteBuffer buffer = image.getPlanes()[0].getBuffer();
byte[] bytes = new byte[buffer.remaining()];
//由緩沖區(qū)存入字節(jié)數(shù)組
buffer.get(bytes);
//字節(jié)數(shù)組轉(zhuǎn)換為jpeg格式圖片,并存儲(chǔ)在設(shè)備中
doByte2JpegFile(bytes);
image.close();
}
}, null /*mCameraHandler*/);
mClick.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
//創(chuàng)建CaptureRequest.Builder,TEMPLATE_STILL_CAPTURE代表了此Request是用于拍照
CaptureRequest.Builder b = mCamDevice.createCaptureRequest(CameraDevice.TEMPLATE_STILL_CAPTURE);
b.addTarget(mImageReader.getSurface());
mCamSession.capture(b.build(), new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
super.onCaptureCompleted(session, request, result);
//返回result --> meta data
}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
});
}

public TextureView.SurfaceTextureListener textureListener = new TextureView.SurfaceTextureListener() {
@Override
public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CAMERA}, 1);
}

if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
}

//獲取CameraManager服務(wù)
mCamManager = (CameraManager)getSystemService(Context.CAMERA_SERVICE);
try {
//打開(kāi)主攝
mCamManager.openCamera("0", mStateCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}

//App需要實(shí)現(xiàn)該接口,用于接收CameraDevice實(shí)例
public CameraDevice.StateCallback mStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice camera) {
if (camera != null) {
log("camera is not null");
}
log("onOpened");
//返回CameraDevice,將其存入mCamDevice
mCamDevice = camera;
startPreview();
}

@Override
public void onDisconnected(CameraDevice camera) {
camera.close();
mCamDevice = null;
}

@Override
public void onError(CameraDevice camera, int error) {
camera.close();
mCamDevice = null;
}
};

public void startPreview() {
SurfaceTexture mSurfaceTexture = mTextureView.getSurfaceTexture();
// 設(shè)置TextureView 用于顯示的緩沖區(qū)大小
mSurfaceTexture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());
//創(chuàng)建Surface,用于顯示預(yù)覽數(shù)據(jù)
mPreviewSurface = new Surface(mSurfaceTexture);
try {
//創(chuàng)建CameraCaptureSession,App需要實(shí)現(xiàn)CameraCaptureSession.StateCallback用于接收CameraCaptureSession實(shí)例
mCamDevice.createCaptureSession(Arrays.asList(mPreviewSurface, mImageReader.getSurface()), new CameraCaptureSession.StateCallback() {
@Override
public void onConfigured(CameraCaptureSession session) {
try {
//創(chuàng)建用于預(yù)覽的CaptureRequest.Builder,進(jìn)而得到CaptureRequest
CaptureRequest.Builder b = mCamDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
b.addTarget(mPreviewSurface);
CaptureRequest r = b.build();
mCamSession = session;
//下發(fā)預(yù)覽需求
mCamSession.setRepeatingRequest(r, mPreviewCaptureCallback, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
CameraCaptureSession.CaptureCallback mPreviewCaptureCallback = new CameraCaptureSession.CaptureCallback() {
@Override
public void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {
//返回result --> meta data
}
};

@Override
public void onReady(CameraCaptureSession session) {
super.onReady(session);
}

@Override
public void onConfigureFailed(CameraCaptureSession session) {

}
}, null);
} catch (CameraAccessException e) {
e.printStackTrace();
}
}
@Override
public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
log("onSurfaceTextureSizeChanged Enter");
}

@Override
public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
log("onSurfaceTextureDestroyed Enter");
return false;
}

@Override
public void onSurfaceTextureUpdated(SurfaceTexture surface) {
log("onSurfaceTextureUpdated Enter");
}
};

private String doByte2JpegFile(byte[]... jpeg) {
File photo = new File(Environment.getExternalStorageDirectory(), "photo-test.jpg");
log("dir : " + Environment.getExternalStorageDirectory());

if (photo.exists()) {
photo.delete();
log("photo exists");
} else {
log("photo not exists");
}

try {
FileOutputStream fos = new FileOutputStream(photo.getPath());
log("photo path : " + photo.getPath());

fos.write(jpeg[0]);
fos.close();
}
catch (java.io.IOException e) {
Log.e(LOG_TAG, "Exception in photoCallback", e);
}

log("get jpeg files done");
return(null);
}
}

代碼比較簡(jiǎn)單,其主要邏輯如下:
a) 初始化
隨著應(yīng)用的打開(kāi),首先在MainActivity的onResume方法中去初始化用于拍照的按鈕和接收數(shù)據(jù)的ImageReader,并且設(shè)置其各自回調(diào)方法。

b) 獲取CameraManager/打開(kāi)Camera 設(shè)備
其次在TextureView.SurfaceTextureListener中的回調(diào)方法onSurfaceTextureAvailable會(huì)被調(diào)用,在該方法中會(huì)去獲取CameraManager服務(wù),并打調(diào)用其openCamera方法打開(kāi)后主攝相機(jī)設(shè)備,并通過(guò)回調(diào)接口獲取該設(shè)備,緊接著調(diào)用startPreview方法。

c) 創(chuàng)建Camera Capture Session/下發(fā)預(yù)覽需求
在startPreview方法中會(huì)去下發(fā)預(yù)覽需求,主要工作有設(shè)置TextureView緩沖區(qū)大小,創(chuàng)建用于接收預(yù)覽數(shù)據(jù)的Surface,并調(diào)用CameraDevice的createCaptureSession方法創(chuàng)建CameraCaptureSession,在其回調(diào)接口onConfigured方法中,去創(chuàng)建CaptureRequest,并調(diào)用CameraCaptureSession的setRepeatingRequest方法下發(fā)Request到相機(jī)框架中。

d) 返回預(yù)覽Metadata/圖像數(shù)據(jù)
在完成了預(yù)覽需求的Request的下發(fā)工作后,相機(jī)框架便會(huì)不斷通過(guò)傳入的CaptureCallback中的onCaptureComplete方法上傳Meta Data以及通過(guò)BufferQueue框架上傳圖像數(shù)據(jù)進(jìn)行預(yù)覽顯示。

e) 下發(fā)拍照需求
當(dāng)點(diǎn)擊應(yīng)用界面的拍照按鈕的時(shí)候,會(huì)觸發(fā)按鈕的View.OnClickListener監(jiān)聽(tīng)類中的onClick方法,在該方法中,初始化了一個(gè)用于拍照的CaptureRequest,并且通過(guò)調(diào)用CameraCaptureSession的capture方法下發(fā)拍照需求.

f) 返回拍照Metadata/圖像數(shù)據(jù)
一旦拍照?qǐng)D像數(shù)據(jù)生成,便會(huì)通過(guò)回調(diào)接口CaptureCallback中的onCaptureComplete方法上傳Meta Data以及通過(guò)BufferQueue框架上傳圖像數(shù)據(jù)到ImageReader中,觸發(fā)其onImageAvailable方法,在該方法中通過(guò)ImageReader的acquireNextImage獲取到拍照?qǐng)D像數(shù)據(jù),并通過(guò)doByte2JpegFile將其轉(zhuǎn)存外JPEG格式的圖片保存在設(shè)備中。

Camera App作為整個(gè)框架體系的最上層,直接面向的主體是普通用戶,其關(guān)鍵性不言而喻,一點(diǎn)點(diǎn)的卡頓或者停滯都會(huì)降低用戶體驗(yàn),所以為了保證整個(gè)框架的穩(wěn)定性以及高效性,谷歌重新設(shè)計(jì)了Camera 接口Api v2,由于該接口將控制邏輯高度抽象成了一個(gè)控制視圖,因此可以逐幀控制硬件參數(shù),進(jìn)而實(shí)現(xiàn)一系列強(qiáng)大的功能,比如可以直接在預(yù)覽過(guò)程中,手動(dòng)控制曝光、感光度、對(duì)焦以及白平衡的參數(shù),動(dòng)態(tài)地輸出不同效果的圖像,又比如可以利用該接口與HDR算法相配合,實(shí)現(xiàn)高動(dòng)態(tài)成像效果。而其中,對(duì)于Api v2接口的實(shí)現(xiàn)是在Camera Framework中完成的,由上面分析可以看出,其內(nèi)部并沒(méi)有采用十分復(fù)雜的控制邏輯,整套代碼流程清晰明朗,而這樣的設(shè)計(jì),進(jìn)一步保證了該層的穩(wěn)定性以及高效性,為整個(gè)相機(jī)框架體系的穩(wěn)定奠定了堅(jiān)實(shí)的基礎(chǔ)。

原文鏈接:?https://blog.csdn.net/u012596975/article/details/107137110

至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺(jué)得很優(yōu)秀,歡迎點(diǎn)擊閱讀原文,支持原創(chuàng)作者,如有侵權(quán),懇請(qǐng)聯(lián)系小編刪除,歡迎您的建議與指正。同時(shí)期待您的關(guān)注,感謝您的閱讀,謝謝!

友情推薦:

Android 開(kāi)發(fā)干貨集錦

至此,本篇已結(jié)束。轉(zhuǎn)載網(wǎng)絡(luò)的文章,小編覺(jué)得很優(yōu)秀,歡迎點(diǎn)擊閱讀原文,支持原創(chuàng)作者,如有侵權(quán),懇請(qǐng)聯(lián)系小編刪除,歡迎您的建議與指正。同時(shí)期待您的關(guān)注,感謝您的閱讀,謝謝!

點(diǎn)個(gè)在看,方便您使用時(shí)快速查找!

瀏覽 84
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)
評(píng)論
圖片
表情
推薦
點(diǎn)贊
評(píng)論
收藏
分享

手機(jī)掃一掃分享

分享
舉報(bào)

感谢您访问我们的网站,您可能还对以下资源感兴趣:

国产秋霞理论久久久电影-婷婷色九月综合激情丁香-欧美在线观看乱妇视频-精品国avA久久久久久久-国产乱码精品一区二区三区亚洲人-欧美熟妇一区二区三区蜜桃视频 二级黄色视频| 日韩性爱视频在线观看| 大香蕉大香蕉网| 日本高清免费视频| 亚洲天堂在线观看网站| 天干天干天夜夜操| 97国产视频| a在线免费观看| 日本高清无码视频| 成人中文字幕在线观看| 一区二区三区水蜜桃| 大香蕉99热| 国产三级AV在线观看| 一区二区免费| 亚洲人成电影| 影音先锋三级| 国产久久久久久久| 神马午夜精品| 久久国产激情| 亚洲色,天堂网| 人人看人人艹| 一本一道波多野结衣潮喷视频 | 小H片在线观看| 操碰在线视频| 色妹子综合| 久久无码一区| 老司机免费福利视频| 成人激情在线视频| 青草视频在线免费观看| 免费A片在线播放| 日韩毛片在线看| 国产1级片| 青青国产在线观看| 先锋资源男人站| 天天爽天天做| 日韩中文毛片| 高清色色女网站| 国产成人片| 亚洲www啪成人一区二区麻豆| 国产一区二| 日韩成人无码电影| 人人爽人人| 久草精品视频| 亚州高清无码视频| AV2014天堂网| 波多野结衣无码AV| 俺来射| 国产在线一| 色老板网址| A免费在线观看| 91蝌蚪在线视频| 丰满人妻一区二区三区精品高清| 久久午夜鲁丝| 久草在线资源| 亚洲小电影在线观看| 九九热播精品| 91丨豆花丨成人熟女| 久久人妻免费视频| gogogo高清在线观看免费直播中国 | 11孩岁女精品A片BBB| 九九r在线精品观看视频| 国产日韩欧美在线观看| 日韩一区二区三区四区| 亚洲秘无码一区二区三区观看| 操逼免费网站| 欧美a视频| 久草小视频| 成人在线视频网| 色婷婷一区| 国产三级黄片| 三级小说| 中文字幕第八页| 久操视频免费观看| 免费在线观看黄色| 97超碰大香蕉| 美女一级片| 成人网在线观看| 国产精品免费在线| 丁香五月激情综合| 亚洲欧美综合| 制服丝袜无码| 高清无码免费在线视频| 国产一区二区久久| 麻豆国产成人AV一区二区三区 | 成人精品一区日本无码网站suv | 欧美激情亚洲| 欧美性猛交XXXX乱大交蜜桃| 日韩免费高清无码| 99re视频在线| 黄色在线网站| 91人人妻人人澡人人爽人人| 国产精品久久久精品cos| 一区二区无码高清| 人人射在线| 亚洲成人影音| 久久精品91| 97色色网站| 九久久| 国产三级一区二区| 欧美888| 91成人在线电影| 脓肿是什么原因引起的,该怎么治疗 | 中文字幕人妻系列| 射死你天天日| 99热99在线| 97国产免费| 国产高清无码自拍| 99久久99| 黄色激情网站| 韩日黄色| 久99在线视频| 91精品国产亚洲| 午夜操逼逼| 爱搞搞搞搞| 色吧久久| 亚州成人视频| 色天天综合网| www.黄色在线观看| 黄色小电影在线观看| 三级视频网站| 婷婷深爱五月丁香网| 国产卡一卡二在线观看| 欧一美一婬一伦一区二区三区自慰国 | 岛国无码AV在线观看| 韩国gogogo高清在线完整版 | 99re在线观看视频| 亚洲无码一| 日韩毛片在线观看| 国产婷婷色一区二区| 国产精品午夜在线观看| 中文字幕在线视频无码| 日韩永久免费| а√在线中文8| 操久| 91国产爽黄在线| 久久国产无码| 视频一区二区三区免费| 波多野结衣av在线播放| 无码黄色片| 国产精品久久久久毛片SUV| 四lll少妇BBBB槡BBBB| 日韩精品中文字幕无码| 日韩无码网址| 91青青草| 丁香花中文字幕| 熟女视频网| 国产一级AV免费观看| 免费无码在线播放| 亚洲天堂欧美| 日韩欧美色图| 亚洲AVwww| 中文字幕高清视频| 国产A级毛片久久久久久| 国产视频在线免费观看| 大香蕉熟女| 欧美做受高潮白| 91色五月| 日韩1234区| 撸一撸在线观看| 日逼中文字幕| 中文字幕亞洲高清手機版第617| 嫩草在线观看| 很色很黄的A片一| 超碰人人爱人人操| 四川少妇bbbbbbbbb| 日本黄色电影在线播放| 亚洲精品成人片在线观看精品字幕| 波多野结衣高清av久久直播免 | 成年人视频免费看| 欧美日韩日逼| 国产成人亚洲日韩| 亚洲高清视频一区| 中国美女一级黄片| 一级黄色在线| 特级毛片片A片AAAAAA| 日本在线| 久久A视频| 天堂网中文字幕| 欧美成人高清无码| 人人操人人干人人爽| 国产一级二级三级| 色第一页| 中文字幕免费av| 日本中文字幕亚洲| 免费成人黄色网址| 国产精品自拍视频| 青青操人人操| 日韩无码av电影| 黄色激情在线| 亚洲久久无码| 996久久| a黄色视频| 国产一级麻豆| 午夜无码熟妇丰满人妻| 色婷婷天天操天天干| 黄色视频免费| 免费无码一级A片大黄在线观看| 99精品丰满人妻无码| 91免费观看视频| 中文字幕五月久久婷婷| www国产在线| 午夜福利三级| 日韩乱伦小说| 婷婷六区| 91蝌蚪91九色| 国产精品久久久久久久久夜色| 激情六月天| 啊啊啊啊国产| 久本草精品| 91丨PORNY丨丰满人妻网站| 内射免费视频| 日本成人免费电影| 夫妻-ThePorn| 男人天堂社区| 无码av无码AV| 18网站视频| 国产精品三| 亚洲欧美动漫| 国产综合色婷婷精品久久| 日韩美在线| 国产精品婷婷午夜在线观看| 性BBwBBwBBwBBw禽| 成人资源站| 国产AV无码专区| 永久免费看片视频| 色男人天堂| 天天干精品| 国产乱伦内射| 91亚洲电影| 久久久人妻无码精品蜜桃| 亚洲秘无码一区二区三区| 国产综合久久久7777777| jizz亚洲| 最近中文字幕av| 亚洲女人在线| 欧美a在线| 色五月婷婷五月天激情| 午夜AV在线免费观看| 东北嫖老熟女一区二区视频网站| 91视频青青草| 中文字幕va| 黄色成人视频在线免费观看| 91精品国产一区二区三区| 欧美18禁网站| 99中文字幕| 色就色欧美| 久久久久无码国产精品不卡| 98色色| 天天操天天射天天爽| 一本无码中文字幕| 欧美综合国产| 亚洲AV无码成人精品久久久| 日韩成人高清| 久久国内视频| 四川少妇搡BBw搡BBBB搡 | 91乱子伦国产乱子伦海的味道| 翔田千里高潮90分钟| 日本老女人视频| 亚洲最大无码| 农村新婚夜一级A片| 超碰福利导航| 国产区av| 欧美A片免费观看| 一区在线免费观看| 日本黄色视频在线| 青青草视频免费在线观看| 婷婷国产精品| 亚洲无码在线免费观看| 99久免费视频| 欧美操逼视频网站| 欧美国产成人在线| 天天干天天射天天爽| 2025中文字幕| 精品女同一区二区三区四区外站在线 | 亚洲AV永久无码精品国产精| 很很干在线视频| 91久久久久久久久18| 一本久道无码| 在线观看无码高清| 国际精品久久久| 99久久夜色精品国产亚洲| 麻豆91视频| 夜夜操天天| 奇米狠狠操| 国产成人超碰| 操嫩逼视频| 亚洲成人视频网站| 高清无码视频在线| 91蝌蚪视频在线观看| 三区在线观看| 免费日本A片| 精品久久免费一区二区三区| sese在线| 黄色视频网站免费观看| 亚洲精品自拍视频| 美女免费网站| 人人操人人射| 黑人大香蕉| 亚洲高清无码电影| 亚洲成人电影无码| 一级特黄妇女高潮AA片免费播放 | 99热在线免费观看| 99热播在线| 黄频在线观看| 最新日韩中文字幕| 91足浴店按摩漂亮少妇| 欧美性视频网站| 各种BBwBBwBBwBBw| 日韩精品无码一区二区| 日韩欧美人妻无码精品| 一本色道久久综合亚洲二区三区 | 成人性爱视频在线播放| 午夜免费视频| 无码电影在线播放| 日韩A级毛片| 特黄特色免费视频| 2017天天干| 欧美成人中文字幕| A级黄色电影| 天天日天天操天天| 国产av三级片| 中文视频免费播放| 欧美AAA片| 国产一区二区不卡| 日韩高清成人无码| 老女人的逼| 久久青草免费视频| 偷拍综合网| av天堂一区| 啊啊啊网站| 夜色精品视频| 亚洲超碰在线| 97爱爱视频| 欧洲操逼视频| 中文字幕精品综合| 国产操逼视频网站| 久草视频免费在线播放| 亚洲欧美国产毛片在线| 亚洲不卡免费视频| 精品国产污污免费网站入口| 国产久视频| 777视频在线观看| 色天使色天堂| 黄色免费看| 国产日本在线视频| 97人妻天天摸天天爽天天| 国产女人操逼视频| 另类色综合| 三级无码AV| 欧洲成人在线观看| 美女操网站| 99热青青草| 四色婷婷| 人人妻人人妻| 91一区在线观看| 激情小说激情视频| 中文字幕在线无码观看| 日韩欧美成人在线| 男女一区二区三区| 日韩无码电影网站| 日韩超清无码| 国产成人精品在线观看| 西西4444大胆无码视频| 超碰人人操| 国产av一区二区三区四区| 五月天婷婷乱伦| 久久精品无码视频| 国产vA| 一级黄色片免费| 在线观看免费黄| 依人大香蕉| 人妻无码在线观看| 粉粉嫩嫩的18虎白女| 999精品| 国产熟妇码视频| 牛牛在线精品视频| 精品蜜桃一区二区三区| 黄色a级片| 青娱乐在线成人| 欧美性性生交XXXXX无码| 亚州黄色电影| 69国产| 国产无码做爱视频| 日本A片在线观看| 日韩中文字幕av在线| 91久久精品无码一区二区三区| 99热最新国产| 亚洲综合p| 无码AV中文字幕| 伊人影院在线免费观看| 中文字幕日韩在线观看| 蜜桃人妻无码| 亚洲综合区| 欧美日韩成人在线观看| 伊人久久大香色综合久久| 在线中文无码| 日韩精品中文字幕在线观看 | 精品9999| 亚洲乱码国产乱码精品天美传媒| 日本親子亂子倫XXXX50路| 国产精品男女| 俺去俺来也www色视频| 五月天久久久久| 国产精品18进进出出17c| 不卡的av在线| 亚洲精品久久久久久久蜜桃| 国产视频网| 国外成人性视频免费| 国产精品乱草| 黄色A片在线观看| 在线a视频免费观看| 成人无码精品| 欧美成人免费A级在线观看| 亚洲精品一区二区三区四区高清| 日韩AV高清| 日韩久久精品视频| 北条麻妃一区二区三区-免费免费高清观看 | 2025av天堂网| 免费av中文字幕| 亚洲日韩精品中文字幕在线| 亚洲狼友视频| 黄片免费无码| 国产在线小电影| 国产色色网| 男女操逼视频网站免费| 在线亚洲观看| 欧美狠狠插| 大香蕉AV在线| 国产毛片一区二区| 偷拍亚洲综合| 99国产精品| 亚洲国产熟妇无码日韩| 日本免费在线观看视频| 亚洲一区二区视频| 玖玖资源网站| 日本三级片无码| 天堂资源网| 成人网站高清无码| 日韩精品免费一区二区在线观看| 国产黄色网| 91大香蕉视频| 乱人伦欲国语对白| 91久久欧美极品XXXXⅩ| 久久艹网| 男人天堂亚洲| a在线视频| 久久污| 一级一级a免一级a做免费线看内裤| 黄色片在线免费观看| 久久综合伊人777777| 激情五月天色色| 51乱伦| 91足浴店按摩漂亮少妇| 成人天堂一区二区三区| 亚洲字幕在线播放| 亚洲精品人伦一区二区| 亚洲另类图片小说| 在线观看国产区| 午夜无码熟妇丰满人妻| 99re6热在线精品视频| 狼友视频免费| 久草人妻| 最新日韩无码| 校园春色亚洲色图| 奇米四色秒播| 在线a视频| 男人的天堂免费视频| 日韩在线大香蕉| 精品视频在线播放| 日韩一级无码特黄AAA片| 国产精品久久久久久久久久久久久久久久| 熊猫视频91| 中文字幕无码Av在线看| 精品久久一区二区三区四区| 久久久久久无码精品亚洲日韩麻豆| 日本在线观看| 国产无码中文字幕| 亚洲69v久久久无码精品| 蝌蚪窝在线免费观看视频| 不卡视频在线| 久草手机视频在线观看| 亚洲午夜久久久| 日韩欧美一区二区三区| 人妻无码电影推荐| AV黄色在线| 91综合色| 久操影视| 操b视频在线观看| 久色视频在线| 日韩黄色电影在线| 国产操B视频| 99久久婷婷国产综合精品漫| 无码AV电影在线观看| 国产在线欧美在线白浆| 久久99精品视频| 可以免费观看的av| 中文字幕日本| 日韩一级电影在线| 国产美女高潮| 亚洲无码在线免费视频| 色黄视频在线观看| 国产特黄级AAAAA片免| 日韩99| 日韩免费在线观看视频| 黄色视频导航| 少妇高潮一区二区三区99| 国产欧美综合视频一区二区在线 | 亲子乱AⅤ一区二区三区| 91狠狠色丁香婷婷综合久久精品 | 91九色91蝌蚪91成人| 在线免费观看成人网站| 天天扣天天操| 热99精品| 黄色影院在线观看| 我和岳m愉情XXXⅩ视频| 婷婷久热| 国产精品秘精东影业| 波多野结衣黄色视频| 欧美V| 中文字幕日本精品5| 久久国产香蕉| 国产AV日韩AⅤ亚洲AV中文| 亚洲天堂一区| 五月丁香婷中文| 91丨九色丨熟女新版| 亚洲天堂在线免费| 91N视频| 中文午夜福利| 无码人妻一区二区一牛影视| 亚洲无码高清视频在线| 日本理论片一道本| 69久久成人精品| 欧美操逼免费视频| 在线免费看黄色| 无码黄色片| 国产v在线| 人妻无码一区二区三区| 最新亚洲无码在线观看| 91成人免费电影片| 精品无码国产一区二区三区51安| 精品国产乱码久久久久久郑州公司 | 国产女人18毛片水18精品软件 | 国产高清秘成人久久| 伊人网视频在线| 亚洲自拍无码| 69成人视频| 玖玖爱这里只有精品| 最新毛片网站〖网:.〗| 色人阁人妻中文字幕| 特一级黄色片| 久久男人天堂| 黄色操屄视频| 黄色a级片| 超碰免费人人| 91视频大全| 熟女人妻一区二区三区| 日韩免费| 五月婷婷婷| 草莓视频在线播放| 日韩无码影视| 夜夜福利| 偷拍一区二区三区| 天堂成人AV| 狼人香蕉在线视频| 九色PORNY国产成人蝌蚪| 91精品综合| 东方AV在线播放| 欧美成人毛片一级A片| 精品成人在线视频| 欧美色色综合| 五月天婷婷小说| 777欧美| 动图综合亚洲综合欧美男男| 免费观看无码| 成人视频一区二区| 丰满老妇高潮一级A片| 国产第一页在线播放| 少妇高潮在线| 在线观看亚洲中文字幕| 国产日韩欧美成人| 国产成人AA| 亚洲色在线播放| 成人黄色在线视频| 久久国产无码| www.插插插| 国产成人免费观看| 一道本高清无码视频| 91大香蕉视频| 无码人妻在线播放| 边添小泬边狠狠躁视频| 五十路熟妇| 成人国产片| 91丨PORNY丨在线中文| 色色欧美色色| 中文人妻| 欧美精品一区二区三区成人片在线 | 激情五月天色| 91视频专区| 午夜福利1000| 久久精品黄色| 在线99热| 黄色视频日本免费| 东京热日韩无码| 黄色大片免费网站| 五月天深爱激情网| 91美女在线观看| 伊人久久AV诱惑悠悠| 佳佳女王footjob超级爽| 在线观看国产| 中文字幕在线视频观看| 影音先锋男人站| 国产理论| 免费看黃色AAAAAA片| 成人激情五月天| 成人精品国产| av无码中文| 无码窝在线观看| 天天射天天射| 欧美嗯啊| 欧美另类综合| 精品aaa| 天天日,天天干,天天操| 九九九九九九精品| 精东av| 中文字幕欧美激情| 欧美成人性爱在线| 亚洲一区二区久久| 天天干,夜夜爽| 人人操人人人| 亚洲日本三级| jlzz18| 在线播放高清无码| 秋霞午夜久久| 高清无码小视频| AV中文无码| 97精品超碰一区二区三区| 波多野结衣AV网站| 色综合99久久久无码国产精品| 无码在线视频播放| 五月丁香色色网| 亚洲欧洲精品成人久久曰影片| 成人激情久久| 亚洲免费观看高清完整| 2024av在线| 在线一区观看| 亚洲AV无码成人精品区h麻豆| 91伊人久热精品| 波多野结衣福利视频| 三须三级久久三级久久18| 青草视屏| 日韩亚洲在线视频| 五月丁香激情在线| a√天堂资源中文8| 亚洲欧洲天堂| 久久肏逼| 日韩欧美黄| 色老板最新地址| 一本色道久久综合| 国产一片黑夜内射| 91丨露脸丨熟女抽搐| 亚洲欧美高清| 欧美日韩在线电影| 伊人网大香| 蜜桃传媒一区二区亚洲| 色九九综合| 国产性爱在线观看| 99热精品在线播放| 欧美成人高清| 亚洲日韩精品中文字幕| 亚洲一区二区在线| 爱爱导航| 免费一级婬片AA片观看| 国产精品91久久久| 国产精品51麻豆cm传媒| 亚洲五月六月| 三级乱伦视频| 蜜桃人妻无码AV天堂二区| 色综合久久88色综合| 欧美黄片一区二区| 怡春院视频| 日本精品黄色视频| 久久久久久婷婷| 91秦先生在线播放| 猛男大粗猛爽H男人味| 国产成人A| 91精品人妻一区二区三区蜜桃欧美 | 亚洲天堂在线视频观看| 五月丁香六月| 在线成人一区二区| 婷婷五月大香蕉| 在线视频三区| 在线视频福利| 丁香六月激情婷婷| 动漫一区二区| 西西特级WWW444无码| 操比在线| 色婷婷免费视频| 日韩一级黄色| 成人在线观看网站| 欧美一区| 中文字幕日本电影| 日本欧美一级片| www.91在线视频| 久久婷婷网站| 一区二区三区观看| 午夜AV在线观看| 豆花网| 午夜无码熟妇丰满人妻| 久久久久久久久久久高清毛片一级| 国产美女裸体网站| 亚洲天堂av在线观看| 久久燥| 久久伊人亚洲| 亚洲成人无码视频在线观看| 毛片A级| 青娱乐最新官网| 久久视频免费| 无码三级在线观看| 国产熟女乱伦| 狠狠狠久久久| 黄色网址在线观看视频| ThePorn精品无码| 黄色成人视频免费看| 国产精品成人在线观看| 久久精品国产99精品国产亚洲性色 | 日韩专区中文字幕| AV2014天堂网| 91热在线| 亚洲一卡二卡| 久久加勒比| 人人操人人操人人操人人操人人操 | 六月色| 97在线鲁碰免费视频| 一级黄色影院| 屁屁影院CCYYCOM发布地| 夜夜撸日日| 国产精品无码专区AV免费播放 | 亚洲成年人在线| 国产高清无码在线观看视频 | av女人天堂| 性A免费在线播放| 怡红院麻豆| 伊人久久精品| 丁香五月激情啪啪啪| 国产免费a| 四川w搡BBB搡wBBB搡| 黄色一区在线| 中国毛片网站| 日日舔| 日韩综合在线视频| 蜜桃BBwBBWBBwBBw| 亚洲第一在线| 天堂麻豆天美| 日韩三区在线| 一级黄色视频免费观看| 欧美亚洲一区二区三区| 亚洲高清在线观看视频| 娇小,学生,高潮,videos| 中文无码日本高潮喷水| 国产一级性爱| 五月婷婷激情五月| 欧美特黄AAAAAAAAA片| 亚洲三级免费| 精品无码一区二区三区四区久久久软件| 思思精品在线| 91污视频在线观看| 亚洲人妻无码一区| 婷婷视频在线| 色tv在线| 天天射天天干天天| H网站在线观看| 成人大香蕉网站精品免费| 在线观看者亚洲| 天天干天天干| 亚洲AV中文在线| 亚洲日韩免费| 亚洲秘无码一区二区三区蜜桃中文| 逼网站| 玩弄大乳乳妾高潮乳喷视频| 欧美日韩综合| 精品美女视频| 影音先锋在线视频| 嫩草在线精品| 国产成人a亚洲精品www| 天堂性爱AV| 色婷婷视频网站| 日本精品一区二区三区四区的功能| 久久久久久久人妻丝袜| 香蕉国产精品| 波多野结衣大战黑人| 99精品丰满人妻无码| 大香蕉尹人网| 亚洲人做受| 在线亚洲欧洲| 最新日韩无码| 激情六月天| 尻屄电影| h片无码| 在线天堂AV| 日韩一级一级| 黄色电影天堂网站| 丁香六月婷婷综合缴| 久久久久久性爱| 操逼在线视频| 国产一级免费在线观看| 美女特黄视频| 国产精品免费观看视频| 欧美三级片在线播放| 欧美黄色操逼| 九一成人电影| 成人做爰黄AA片免费看三区| 97人人艹| 激情麻豆| 国产精品婷婷久久久| 自慰精品| 亚洲精品国产精品乱码视99| 91成人视频免费观看| 国产精品揄拍500视频| 天天日天天舔| 91人兽| 一色综合| 黄骗免费网站| 青误乐在线播放| 四虎最新地址| 9l农村站街老熟女| 激情欧美| 中文原创麻豆传媒md0052| 日韩毛片在线看| 草草在线视频| 777免费观看成人电影视频 | 国产精品欧美日韩| 五月丁香狠狠爱| www.91爱爱,com| 久久国产精品影院| 天天干人人干| 欧美一级片在线| av不卡免费观看| 日韩永久免费| 无码在线电影| 色aV牛牛在线观看| AV无码一区| 罗莉AV| 操逼视频网| 看A片在线| 在线免费看黄色视频| 天天无码| 无码欧美人XXXXX日本无码| 欧美人妻日韩精品| 婷婷五月在线视频| 欧美啪啪视频| 天码人妻一区二区三区在线看| 青青草大香蕉| 日本特黄一级| 精品超碰| 高h视频在线观看| 高清毛片AAAAAAAAA片| 亚洲精品视频免费观看| 精品自拍视频| 久久国产精品影院| 大香蕉大香蕉视频网| 成人视频在线播放| 日本成人免费电影| 成人AV中文字幕| 伊人大香蕉在线观看| 亚洲一级无码视频| 久久男人| 国产成人一区二区| 亚洲视频A| 91秦先生在线播放| 欧美高清无码| 亚洲精品麻豆| 丰满少妇一区二区三区| 天天操免费| 欧美熟妇搡BBBB搡BBBBB| 俄女兵一级婬片A片| 97热| 精品超碰| 女生被操网站| 婷婷日韩在线| 成人做爰A片免费看网站| 美女av日逼| 69国产成人综合久久精品欧美| 亚洲清高毛无码毛片| 91丨豆花丨成人熟女| 五月婷婷丁香网| 国产无码激情视频| 2024av在线| 波多野结衣国产| 男人天堂手机视频| 黄色片无码| 欧美一级婬片免费视频黄| 影音先锋女人aV鲁色资源网站 | www日韩| 高清无码小视频| 中文字幕国产在线| 亚洲福利一区二区| 亚洲第一视频在线观看| 亚洲一区二区无码| 国产成人精品a视频一区| 91人妻人人澡人人|