久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

ARTICLE DETAIL

資訊詳情

深耕商務(wù)建站與企業(yè)官網(wǎng)運(yùn)營(yíng)的一線實(shí)戰(zhàn)洞察。

鴻蒙自定義相機(jī)前后切換實(shí)戰(zhàn):會(huì)話重建與狀態(tài)同步

鴻蒙自定義相機(jī)前后切換實(shí)戰(zhàn):會(huì)話重建與狀態(tài)同步 1. 為什么要跟系統(tǒng)相機(jī)較勁自定義相機(jī)的前后切換到底難在哪做鴻蒙自定義相機(jī)最容易被低估的就是前后攝像頭切換。系統(tǒng)相機(jī)里一個(gè)八角按鈕完成的動(dòng)作放到自定義相機(jī)里卻涉及會(huì)話重建、狀態(tài)同步、方向翻轉(zhuǎn)和一堆兼容性問(wèn)題。我最初接手公司內(nèi)部巡檢App時(shí)需求文檔只有一行相機(jī)模塊支持前后切換默認(rèn)后置當(dāng)時(shí)覺(jué)得頂多改個(gè)設(shè)備ID結(jié)果真正寫(xiě)起來(lái)才發(fā)現(xiàn)鴻蒙的相機(jī)棧和Android、iOS的習(xí)慣完全不一樣。那臺(tái)設(shè)備巡檢App本身業(yè)務(wù)很樸素登錄后用自定義相機(jī)掃描設(shè)備二維碼識(shí)別成功后跳到信息錄入頁(yè)錄入頁(yè)里需要拍攝設(shè)備銘牌照片還支持在拍照頁(yè)手動(dòng)切換到前置攝像頭拍操作人員人臉。這個(gè)場(chǎng)景是典型的嵌入式自定義相機(jī)——相機(jī)畫(huà)面必須存在于App自身的頁(yè)面里上面要疊加取景框、按鈕、遮罩動(dòng)畫(huà)系統(tǒng)相機(jī)完全給不了這套交互。更麻煩的是二維碼掃描和后前景衡平拍攝共用同一個(gè)相機(jī)實(shí)例但二維碼掃描需要后置人臉核對(duì)需要前置所以前后切換頻率很高業(yè)務(wù)上一旦切換失敗用戶只能重啟App這壓力就全落在相機(jī)模塊上。在動(dòng)手之前我先把前后切換拆成了四種不同語(yǔ)義方便后續(xù)設(shè)計(jì)代碼結(jié)構(gòu)。第一種是純手動(dòng)切換用戶點(diǎn)按鈕切換畫(huà)面來(lái)源這是本文重點(diǎn)。第二種是業(yè)務(wù)自動(dòng)切換比如掃描模塊識(shí)別到條碼后自動(dòng)切到前置做人臉比對(duì)。第三種是雙攝同屏直播和AR類(lèi)場(chǎng)景可能要同時(shí)掛兩個(gè)攝像頭輸出到不同Surface這已經(jīng)不是切換而是并存。第四種是前后臺(tái)切換App進(jìn)入后臺(tái)要釋放相機(jī)回到前臺(tái)再恢復(fù)——這雖然不是攝像頭之間的切換但和攝像頭切換共用同一套釋放重建邏輯也是最容易被忽略的。如果你的需求只是第一種可以往下看如果是二三四種的任意組合建議把相機(jī)模塊設(shè)計(jì)成狀態(tài)機(jī)否則代碼寫(xiě)到后面會(huì)糾結(jié)到爆。我在這一系列文章里使用的環(huán)境基線是HarmonyOS NEXTAPI 12DevEco Studio 5.0以上語(yǔ)言ArkTS。為什么特別強(qiáng)調(diào)版本因?yàn)镃amera Kit在API 10到API 12之間改動(dòng)實(shí)在不小后面我會(huì)提到的createSession(camera.SceneMode.NORMAL_PHOTO)在老版本上只能寫(xiě)成createSession()。如果你照抄新代碼到API 9工程直接編譯不過(guò)。所以文中的示例代碼以API 12為準(zhǔn)老版本遷移時(shí)注意查SDK變更日志。2. 鴻蒙相機(jī)API選型別把CameraPicker當(dāng)成萬(wàn)能鑰匙也別跳進(jìn)CameraManager的坑2.1 CameraPicker到底能做什么很多初學(xué)者看到鴻蒙Camera Kit的文檔第一反應(yīng)是用CameraPicker啊省事。CameraPicker確實(shí)省事它是系統(tǒng)封裝好的拍照/錄像選擇器調(diào)用后直接彈出系統(tǒng)相機(jī)或相冊(cè)界面你不需要申請(qǐng)相機(jī)權(quán)限也不需要管理Surface。但是你所能控制的僅限于等它返回一個(gè)文件路徑相機(jī)預(yù)覽畫(huà)面、前后切換按鈕、取景框、疊加水印這些通通不是你能控制的。它適合做發(fā)個(gè)朋友圈拍張照這類(lèi)操作但做不了集成在業(yè)務(wù)流程里的自定義相機(jī)。我在需求調(diào)研階段就否掉了CameraPicker原因是巡檢App需要在相機(jī)畫(huà)面中央畫(huà)一個(gè)對(duì)齊框用來(lái)引導(dǎo)用戶把二維碼放進(jìn)框內(nèi)。這種疊加UI的需求只有自定義相機(jī)才做得到。另外CameraPicker走的是獨(dú)立頁(yè)面流程Android上還好在鴻蒙上如果App頁(yè)面本身橫豎屏狀態(tài)特殊CameraPicker返回后Activity/Want的轉(zhuǎn)場(chǎng)會(huì)有明顯閃爍放在邊夾流程里很出戲。2.2 Camera Kit的兩層模型Manager和Session真正要做自定義相機(jī)必須用kit.CameraKit里的camera模塊。這個(gè)模塊可以理解為兩層結(jié)構(gòu)底層是CameraManager負(fù)責(zé)探測(cè)設(shè)備、管理CameraInput和Output上層是CaptureSession負(fù)責(zé)把輸入輸出組合成一個(gè)會(huì)話語(yǔ)義。舉個(gè)例子CameraManager好比是停車(chē)場(chǎng)的閘機(jī)管著哪輛車(chē)能進(jìn)、哪輛能出CaptureSession則是你從停車(chē)場(chǎng)開(kāi)走的整條路線它決定了這輛車(chē)從哪個(gè)口進(jìn)、去哪個(gè)車(chē)位、最后從哪個(gè)口出。很多剛上手的人只看到閘機(jī)以為拿到CameraManager就能切換攝像頭忽略了變化于是反復(fù)創(chuàng)建輸入輸出時(shí)不沖突還好一沖突就報(bào)Camera device not exist之類(lèi)的詭異錯(cuò)誤。從API 12開(kāi)始創(chuàng)建Session必須帶場(chǎng)景模式NORMAL_PHOTO表示普通拍照?qǐng)鼍傲硗膺€有NORMAL_VIDEO等。會(huì)話的最大作用是讓你在beginConfig到commitConfig之間把CameraInput和PreviewOutput綁在一起。切換攝像頭之所以麻煩就是因?yàn)槟悴荒芎?jiǎn)單地把Session里的Input引用換掉——正規(guī)流程是拆掉整個(gè)會(huì)話重建。2.3 前置和后置的物理能力差異Profile不匹配引發(fā)的連鎖問(wèn)題不同攝像頭擁有完全不同的CameraOutputCapability。我在一臺(tái)平板設(shè)備上實(shí)測(cè)后置攝像頭能輸出3840x2160前置攝像頭最大只支持1920x1080。如果切換后仍然沿用后置的PreviewProfile去創(chuàng)建前置輸出createPreviewOutput會(huì)直接拋異常即便某些機(jī)型不拋畫(huà)面比例也會(huì)從16:9變成4:3取景框全歪。所以切換攝像頭時(shí)第一個(gè)要處理的就是重新獲取目標(biāo)攝像頭的Profile。我踩過(guò)的一個(gè)隱蔽坑是后置拍攝時(shí)用戶把變焦放大了切到前置后我還保留著后置的Profile對(duì)象但前置的攝像頭FOV本來(lái)就窄再加上夸張的變焦值生成的預(yù)覽畫(huà)面會(huì)發(fā)生明顯的裁切。后來(lái)我的做法是每切一次就根據(jù)目標(biāo)設(shè)備重新查詢getSupportedOutputCapability(device)再?gòu)闹刑粢粋€(gè)合適的分辨率。這個(gè)查詢操作很便宜但必須每次做不能緩存。還有一個(gè)更微妙的點(diǎn)同一個(gè)設(shè)備在不同場(chǎng)景模式下的能力也不同。NORMAL_PHOTO和NORMAL_VIDEO對(duì)應(yīng)的分辨率集合可能差挺多。如果你在拍照模式創(chuàng)建工作卻拿視頻模式的Profile去創(chuàng)建輸出部分設(shè)備會(huì)給你一個(gè)低一級(jí)的分辨率。所以簡(jiǎn)單起見(jiàn)我在確認(rèn)Profile時(shí)直接問(wèn)cameraManager.createPreviewOutput(profile, surfaceId)但保證profile來(lái)自目標(biāo)設(shè)備在當(dāng)前場(chǎng)景模式下的支持列表。這一步做對(duì)了后面切換的成功率會(huì)高很多。3. 跑通自定義相機(jī)預(yù)覽的最小骨架XComponent、CameraInput和CaptureSession三件套3.1 初始化前的權(quán)限籌備在開(kāi)發(fā)自定義相機(jī)前先保證權(quán)限申請(qǐng)和XComponent能正常運(yùn)作。CAMERA權(quán)限是高危權(quán)限需要在module.json5里聲明然后在主Ability首次啟動(dòng)時(shí)向用戶動(dòng)態(tài)申請(qǐng)。這步不能省略如果漏了后面createCameraManager或createCameraInput會(huì)直接拋權(quán)限異常而不是彈窗。權(quán)限代碼我放在onPageShow里做一次申請(qǐng)避免每次啟動(dòng)都彈窗。import { abilityAccessCtrl, Permissions, common } from kit.AbilityKit; async requestCameraPermission(): Promiseboolean { let context getContext(this) as common.UIAbilityContext; let atManager abilityAccessCtrl.createAtManager(); let permissions: ArrayPermissions [ohos.permission.CAMERA]; let result await atManager.requestPermissionsFromUser(context, permissions); return result.authResults.length 0 result.authResults[0] 0; }頁(yè)面?zhèn)扔肵Component承載預(yù)覽畫(huà)面。XComponent的type必須設(shè)為surface然后在onCreated回調(diào)里拿到surfaceId再把它傳給相機(jī)管理器。這里有一個(gè)經(jīng)驗(yàn)surfaceId在前端是字符串在底層是原生Surface句柄你拿到的surfaceId必須是有效的否則createPreviewOutput即使不報(bào)錯(cuò)也會(huì)黑屏。確認(rèn)有效性的最簡(jiǎn)單方式是在onCreated回調(diào)里打日志看長(zhǎng)度一般API 12下是幾十位的數(shù)字字符串。3.2 第一個(gè)能動(dòng)的預(yù)覽從CameraManager到CaptureSession下面這一段是我在項(xiàng)目里用的最小初始化流程你可以直接參照。核心順序是拿Manager - 找設(shè)備 - 建Input - 建Output - 建Session - 拼裝 - start。import { camera } from kit.CameraKit; import { common } from kit.AbilityKit; private cameraManager: camera.CameraManager | undefined undefined; private cameraInput: camera.CameraInput | undefined undefined; private previewOutput: camera.PreviewOutput | undefined undefined; private captureSession: camera.CaptureSession | undefined undefined; async initCamera(surfaceId: string, targetPosition: camera.CameraPosition camera.CameraPosition.CAMERA_POSITION_BACK) { // 1. 拿到CameraManager let context getContext(this) as common.UIAbilityContext; this.cameraManager camera.getCameraManager(context); // 2. 找到目標(biāo)攝像頭優(yōu)先按position查找 let devices: Arraycamera.CameraDevice this.cameraManager.getSupportedCameras(); let targetDevice devices.find(device device.cameraPosition targetPosition); if (!targetDevice) { targetDevice devices[0]; console.warn(No target camera, fallback to first device); } // 3. 創(chuàng)建CameraInput this.cameraInput this.cameraManager.createCameraInput(targetDevice); await this.cameraInput.open(); // 4. 根據(jù)目標(biāo)camera能力挑選預(yù)覽Profile let outputCapability this.cameraManager.getSupportedOutputCapability(targetDevice); let previewProfile this.choosePreviewProfile(outputCapability); // 5. 創(chuàng)建PreviewOutput并綁定surfaceId this.previewOutput this.cameraManager.createPreviewOutput(previewProfile, surfaceId); // 6. 創(chuàng)建CaptureSession this.captureSession this.cameraManager.createSession(camera.SceneMode.NORMAL_PHOTO); this.captureSession.beginConfig(); this.captureSession.addInput(this.cameraInput); this.captureSession.addOutput(this.previewOutput); await this.captureSession.commitConfig(); await this.captureSession.start(); } private choosePreviewProfile(capability: camera.CameraOutputCapability): camera.Profile { const targetWidth 1920; // 優(yōu)先1080P太高意義不大 let profiles capability.previewProfiles; let best profiles[0]; for (let profile of profiles) { if (profile.size.width targetWidth) { best profile; break; } } return best; }這個(gè)流程本身不難但有幾個(gè)隱藏細(xì)節(jié)。第一createCameraInput之后必須顯式open()否則后續(xù)addInput會(huì)失敗。第二Surface在頁(yè)面可見(jiàn)后才能獲取如果頁(yè)面還在后臺(tái)onCreated不會(huì)觸發(fā)。第三beginConfig之后如果任何一步add失敗要記得abortConfig()否則session處于流浪狀態(tài)。在切換攝像頭時(shí)我見(jiàn)過(guò)不少人只是重新beginConfig而沒(méi)有處理掉上一次的session結(jié)果相機(jī)服務(wù)直接被占用。3.3 生命周期里最容易漏掉的釋放邏輯自定義相機(jī)比系統(tǒng)相機(jī)多了一堆疏漏點(diǎn)其中最大的就是生命周期釋放。App在后退、切后臺(tái)、最小化時(shí)CameraInput和CaptureSession必須釋放否則設(shè)備相機(jī)可能被這個(gè)進(jìn)程一直占著導(dǎo)致其他應(yīng)用拍照也是黑的。在鴻蒙上我通常在自定義Page組件里監(jiān)聽(tīng)onPageHide和onPageShow。onPageHide時(shí)執(zhí)行stopSession并釋放輸入輸出onPageShow時(shí)根據(jù)上下文決定是否需要重新初始化。如果業(yè)務(wù)要求App在后臺(tái)還要繼續(xù)“監(jiān)聽(tīng)”相機(jī)那么必須使用后臺(tái)任務(wù)或者保持前臺(tái)運(yùn)行的方式這里就不展開(kāi)了大部分B端一碰就死的規(guī)則還是讓相機(jī)釋放更穩(wěn)妥。生命周期設(shè)計(jì)的另一個(gè)要點(diǎn)是冪等性。我開(kāi)始寫(xiě)的release函數(shù)不夠冪等快速返回頁(yè)面時(shí)被調(diào)用了兩遍第二遍釋放空對(duì)象直接拋錯(cuò)。后來(lái)在每個(gè)釋放子函數(shù)里加了一個(gè)if (this.cameraInput) { ... }判斷并且把this.cameraInput立即置空。這樣即使快速切換也不會(huì)出現(xiàn)二次釋放。這個(gè)先清引用再執(zhí)行釋放的習(xí)慣幫我省了后續(xù)很多崩潰日志。4. 前后攝像頭切換的完整實(shí)現(xiàn)釋放舊會(huì)話、重建新會(huì)話與狀態(tài)同步4.1 一步一步的切換代碼現(xiàn)在到了本文最核心的部分。前后攝像頭切換我歸納為三步走停會(huì)話釋放輸入輸出用新Device重建。也許你會(huì)想能不能removeInput之后addInput在API 12上CaptureSession確實(shí)有removeInput和removeOutput但實(shí)測(cè)在切換攝像頭時(shí)舊CameraInput和新CameraInput不能同時(shí)存在于同一個(gè)Session里而且部分設(shè)備上remove之后Session內(nèi)部的buffers會(huì)出現(xiàn)殘留導(dǎo)致新Input無(wú)法正常預(yù)覽。我最終采用的方案是徹底銷(xiāo)毀重建穩(wěn)定壓倒一切。async switchCamera() { let nextPosition this.currentPosition camera.CameraPosition.CAMERA_POSITION_BACK ? camera.CameraPosition.CAMERA_POSITION_FRONT : camera.CameraPosition.CAMERA_POSITION_BACK; // 1. 停止會(huì)話 if (this.captureSession) { await this.captureSession.stop(); await this.captureSession.release(); this.captureSession undefined; } // 2. 釋放輸出與輸入 if (this.previewOutput) { await this.previewOutput.release(); this.previewOutput undefined; } if (this.cameraInput) { await this.cameraInput.release(); this.cameraInput undefined; } // 3. 用新位置重新初始化 this.currentPosition nextPosition; await this.initCamera(this.surfaceId, nextPosition); }很多人會(huì)覺(jué)得這個(gè)release順序無(wú)所謂其實(shí)非常有講究。Session.release()必須放在CameraInput.release()之前。如果反過(guò)來(lái)Input已經(jīng)釋放Session還認(rèn)為它綁定著輸入你去release Session時(shí)內(nèi)部會(huì)試圖對(duì)已釋放的Input做清理輕則告警重則底層報(bào)RTP異常導(dǎo)致概率性崩潰。同理PreviewOutput.release()其實(shí)可以盡早因?yàn)镺utput沒(méi)有Input那么依賴Session但我習(xí)慣連同Input一起依次釋放流程簡(jiǎn)單統(tǒng)一。再提一步異常恢復(fù)。release和重建之間如果相機(jī)服務(wù)剛好被其他應(yīng)用搶走createCameraInput可能拋ServiceUnavailable。我在switchCamera外層套了try-catch失敗后將currentPosition回滾到切換前的值并且彈一條Toast讓用戶重試。這個(gè)回滾邏輯別省——實(shí)測(cè)在多個(gè)應(yīng)用輪番占用相機(jī)的情況下切換失敗概率能到千分之幾對(duì)B端設(shè)備雖然不算高但一旦失敗App就卡在無(wú)畫(huà)面狀態(tài)反饋體驗(yàn)很差。4.2 狀態(tài)同步閃光燈、變焦、對(duì)焦、曝光一個(gè)都不能少切換完成后Session是新的但用戶期望還是原來(lái)的配置。我遇到過(guò)最典型的場(chǎng)景用戶在后置模式下把閃光燈打開(kāi)拍單據(jù)切到前置后再切回來(lái)發(fā)現(xiàn)閃光燈狀態(tài)丟了按鈕顯示關(guān)閉可實(shí)際后置閃光燈又亮了因?yàn)榈讓覥ameraInput被重建后默認(rèn)配置被重置。UI狀態(tài)和硬件狀態(tài)不一致這個(gè)bug特別難查。我的做法是在組件里維護(hù)一個(gè)CameraState它不只記錄頁(yè)面按鈕狀態(tài)而是作為期望狀態(tài)在每次相機(jī)初始化完成后應(yīng)用。狀態(tài)包括變焦比例、是否開(kāi)閃光燈、對(duì)焦模式和曝光值。切換完成后的RestoreState代碼大概長(zhǎng)這樣private restoreCameraState() { // 閃光燈 if (this.cameraInput) { let flashMode this.cameraState.flashOn ? camera.FlashMode.FLASH_MODE_ALWAYS_OPEN : camera.FlashMode.FLASH_MODE_CLOSE; try { this.cameraInput.setFlashMode(flashMode); } catch (err) { // 前置攝像頭通常沒(méi)有閃光燈不用處理保持UI為關(guān)閉態(tài)即可 } } // 變焦需要根據(jù)目標(biāo)設(shè)備能力決定是否恢復(fù) if (this.cameraState.zoomRatio 1) { try { this.cameraInput?.setZoomRatio(this.cameraState.zoomRatio); } catch (err) { // 前置或部分設(shè)備不支持高倍變焦重置換擋為1 this.cameraState.zoomRatio 1; } } // 對(duì)焦模式默認(rèn)連續(xù)對(duì)焦 try { this.cameraInput?.setFocusMode(camera.FocusMode.FOCUS_MODE_CONTINUOUS_AUTO); } catch (err) { console.warn(set continuous autofocus failed); } }這里最有爭(zhēng)議的是變焦恢復(fù)。我的實(shí)際選擇是切換即重置用戶再手動(dòng)調(diào)回來(lái)。因?yàn)榻^大多數(shù)用戶切到前置后并不想保持后置的2倍變焦前置的取景范圍本來(lái)就小再加上變焦會(huì)變得特別局促。而且前置攝像頭一般只支持?jǐn)?shù)碼變焦在高倍率下畫(huà)質(zhì)下降嚴(yán)重硬恢復(fù)只會(huì)放大卡頓。所以restoreCameraState里我強(qiáng)制把zoomRatio重置為1只恢復(fù)閃光燈和對(duì)焦模式。這樣做不完美但在絕大多數(shù)業(yè)務(wù)場(chǎng)景里更符合直覺(jué)。4.3 鏡像設(shè)置的兩個(gè)層次viewMirror與photoMirror前置攝像頭天然有鏡像問(wèn)題。前置自拍時(shí)預(yù)覽畫(huà)面像鏡子一樣用戶習(xí)慣這種翻轉(zhuǎn)效果但如果你用前置拍文件、拍人臉用于識(shí)別就不應(yīng)該鏡像。這里要分清兩個(gè)APIPreviewOutput.setViewMirror(boolean)控制預(yù)覽畫(huà)面的左右翻轉(zhuǎn)PhotoOutput.setPhotoMirror(boolean)控制照片輸出是否翻轉(zhuǎn)。我在很多教程里看到只設(shè)置viewMirror結(jié)果預(yù)覽是正常的照片一拍出來(lái)卻是反向的。在API 12上我建議切換完成后這樣設(shè)置private adjustMirrorByPosition(device: camera.CameraDevice, isPreview: boolean true) { const isFront device.cameraPosition camera.CameraPosition.CAMERA_POSITION_FRONT; // 預(yù)覽鏡像自拍場(chǎng)景一般要鏡像業(yè)務(wù)識(shí)別場(chǎng)景不要鏡像 if (isFront this.cameraState.previewMirror) { this.previewOutput?.setViewMirror(true); } else { this.previewOutput?.setViewMirror(false); } // 照片鏡像絕大部分業(yè)務(wù)不需要鏡像所以直接關(guān)掉 if (this.photoOutput) { this.photoOutput?.setPhotoMirror(false); } }需要注意這個(gè)設(shè)置必須在Session已經(jīng)start之后調(diào)用才穩(wěn)定生效。我曾經(jīng)在beginConfig階段調(diào)setViewMirror結(jié)果有的設(shè)備生成了鏡像有的設(shè)備忽略了。切到前置后先start再調(diào)MirrorApp UI上會(huì)閃一下因?yàn)閟tart時(shí)還是非鏡像這個(gè)閃爍可以用一個(gè)簡(jiǎn)單動(dòng)畫(huà)遮罩蓋住。如果你想第一幀就是鏡像只能在業(yè)務(wù)層簽名支持之前短暫隱藏預(yù)覽層。這些細(xì)節(jié)很惱人但是自定義相機(jī)和系統(tǒng)相機(jī)體驗(yàn)差距的來(lái)源之一。5. 高頻問(wèn)題和性能優(yōu)化把切換從能用打磨到順手5.1 快速連點(diǎn)導(dǎo)致會(huì)話重建風(fēng)暴前后切換最大的敵人是用戶手快。連點(diǎn)切換按鈕時(shí)如果不做串行控制第一個(gè)切換還在release的過(guò)程中第二個(gè)已經(jīng)進(jìn)來(lái)createCameraInput兩路請(qǐng)求會(huì)同時(shí)操作相機(jī)服務(wù)。我的實(shí)測(cè)結(jié)果是輕則某個(gè)Input創(chuàng)建失敗重則第二個(gè)切換永久卡死必須殺進(jìn)程才能恢復(fù)。因?yàn)镃amera Kit的底層對(duì)同一個(gè)攝像頭設(shè)備有占用鎖前一個(gè)Input還沒(méi)釋放完新的Input不能創(chuàng)建而Release本身又是異步動(dòng)作肉眼看著代碼是順序await實(shí)際線程之間可能穿插。最簡(jiǎn)單有效的控制手段是加一個(gè)串行隊(duì)列。我用一個(gè)Promise鏈每次點(diǎn)擊都把切換動(dòng)作排到上一個(gè)切換動(dòng)作后面private switchQueue: Promisevoid Promise.resolve(); switchCameraQueued(): Promisevoid { this.switchQueue this.switchQueue.then(() this.switchCamera()); return this.switchQueue; }這樣即使玩家一秒點(diǎn)了五次切換底層也只會(huì)按順序執(zhí)行五個(gè)完整的切換流程杜絕并發(fā)崩潰。注意這樣如果連續(xù)點(diǎn)五次最終還是執(zhí)行了五次完整切換最后落在某個(gè)方向上。如果你希望更精確地忽略中間請(qǐng)求可以用只有隊(duì)列為空時(shí)才提交否則標(biāo)記pending的簡(jiǎn)單節(jié)流版。但業(yè)務(wù)上用戶連點(diǎn)本身是亂操作按順序依次切換已經(jīng)足夠?qū)捜荨?.2 黑屏、花屏和surfaceId復(fù)用陷阱切換后黑屏是問(wèn)題數(shù)最高的反饋。一是在XComponent沒(méi)有重建Surface的情況下直接復(fù)用舊surfaceId二是在舊Output尚未完全釋放時(shí)同一surfaceId被新的PreviewOutput接管。在部分圖形棧實(shí)現(xiàn)里Surface的所有權(quán)沒(méi)有在恰當(dāng)時(shí)機(jī)轉(zhuǎn)移新Output綁上去后一直拿不到幀緩沖區(qū)于是黑屏。我試過(guò)切換前把XComponent隱藏切換后顯示但這只是視覺(jué)手段不解決根本問(wèn)題。更穩(wěn)的做法是每次切換都重新為XComponent獲取一個(gè)新的surfaceId即先銷(xiāo)毀XComponent再重建。比如在ArkUI里給XComponent加一個(gè)key值切換時(shí)先this.needReCreateSurface true然后通過(guò)條件渲染重建組件讓新onCreated回調(diào)拿到全新Surface句柄。代價(jià)是重建XComponent會(huì)有幾十毫秒到一百毫秒的空白期但相比黑屏這點(diǎn)代價(jià)值得。如果你不希望頻繁銷(xiāo)毀Surface也可以嘗試復(fù)用surfaceId但保證舊PreviewOutput釋放完成。previewOutput.release()返回Promiseawait它之后還需要再等一幀。我是這樣做的release后用await new Promise(resolve setTimeout(resolve, 50))強(qiáng)制等50ms再重建Output。實(shí)測(cè)大部分機(jī)型能解決但有個(gè)別平板仍然黑屏。最終我在兼容層選擇了重建XComponent方案切換耗時(shí)大約增加20ms換來(lái)的是穩(wěn)定。5.3 畫(huà)面方向漂移的根源與修正前后切換后畫(huà)面橫豎屏方向錯(cuò)亂也是常見(jiàn)問(wèn)題。攝像頭傳感器有一個(gè)固定的安裝方向通常后置是90度前置是270度這在SensorOrientation屬性里可以看到。鴻蒙的PreviewOutput會(huì)根據(jù)Display的方向自動(dòng)旋轉(zhuǎn)不能說(shuō)自動(dòng)實(shí)際上是開(kāi)發(fā)者要讓Session知道預(yù)覽的預(yù)期方向。在不同華為設(shè)備上不做direction處理橫屏進(jìn)入頁(yè)面后切到前置預(yù)覽畫(huà)面會(huì)歪著。我的處理方案很粗暴首先在項(xiàng)目里鎖定豎屏然后在每次創(chuàng)建Session后調(diào)用session.setPreviewOrientation(90)。如果你要兼容橫豎屏切換需要監(jiān)聽(tīng)屏幕旋轉(zhuǎn)把映射表做出來(lái)。我簡(jiǎn)單給出豎屏場(chǎng)景的代碼private async configureOrientation() { if (this.captureSession) { try { this.captureSession.setPreviewOrientation(90); // 豎屏固定90 } catch (e) { console.warn(setPreviewOrientation not supported); } } }這個(gè)調(diào)用時(shí)機(jī)在commitConfig之后、start之前或之后都可以不同設(shè)備表現(xiàn)略有差異。我把它放在commitConfig后立刻執(zhí)行再start。如果你看到切換后畫(huà)面內(nèi)容旋轉(zhuǎn)90度優(yōu)先檢查這個(gè)值如果方向?qū)ΦA(yù)覽被拉伸去看3.2里的profile選擇是否正確。方向問(wèn)題不會(huì)讓App崩潰但用戶立刻能感知屬于不崩潰但很傷逼格的坑。5.4 我壓到120ms的三個(gè)關(guān)鍵優(yōu)化最后說(shuō)說(shuō)性能。最開(kāi)始我的完整切換流程耗時(shí)200-400ms切換時(shí)黑屏明顯。做了三個(gè)優(yōu)化后在Mate系列機(jī)型上穩(wěn)定壓到120ms左右體感已經(jīng)接近系統(tǒng)相機(jī)。第一個(gè)優(yōu)化是緩存Profile。每次查詢getSupportedOutputCapability雖然不貴但加上對(duì)象分配和設(shè)備IO在低端機(jī)上也要幾毫秒到幾十毫秒。我在頁(yè)面加載時(shí)把前置和后置各自的previewProfile都查好切換時(shí)直接取用。注意如果設(shè)備支持隨時(shí)熱拔插這種緩存會(huì)失效需要監(jiān)聽(tīng)onCameraStatusChanged事件做失效處理。B端固定設(shè)備很少拔插所以我直接緩存。第二個(gè)優(yōu)化是重建XComponent和重建Session并行化。釋放和創(chuàng)建之間存在硬依賴但創(chuàng)建XComponent的time和會(huì)話重建可以并行。我在切換前先申請(qǐng)新的surfaceId并把initCamera中的createSession和createPreviewOutput并行執(zhí)行用Promise.all因?yàn)閮烧邲](méi)有依賴關(guān)系。實(shí)際收益大約30-50ms。第三個(gè)優(yōu)化是減少無(wú)謂的全局狀態(tài)同步。切換完切換restoreCameraState放到start()之后并和UI更新錯(cuò)開(kāi)。第一次寫(xiě)時(shí)我們把狀態(tài)恢復(fù)邏輯放在start之前結(jié)果前幾幀調(diào)用部分API被拒白白浪費(fèi)時(shí)間。放到start之后一次秒級(jí)操作就能全部同步。這三點(diǎn)做完切換依然有可感知的停頓但用戶不會(huì)覺(jué)得卡——他們會(huì)覺(jué)得“有個(gè)切換過(guò)程”但不至于煩。如果你的業(yè)務(wù)對(duì)切換流暢度要求更高可以再?gòu)牡讓覵urface預(yù)分配和雙會(huì)話輪轉(zhuǎn)方向做文章但那樣復(fù)雜度會(huì)成倍增長(zhǎng)個(gè)人覺(jué)得除非做消費(fèi)級(jí)相機(jī)App否則不值當(dāng)。做完整套切換后我最深刻的體會(huì)是自定義相機(jī)里的前后切換難點(diǎn)從來(lái)不是切換這個(gè)動(dòng)作本身而是切換前后的一整套狀態(tài)維護(hù)、資源順序和異常兜底。如果你在鴻蒙自定義相機(jī)上遇到了切換后黑屏、崩潰、照片鏡像反了之類(lèi)的問(wèn)題先不要懷疑API從頭檢查一遍會(huì)話釋放順序是否正確目標(biāo)攝像頭的Profile有沒(méi)有重新取前置Mirror是不是只設(shè)了一半。把這些基礎(chǔ)細(xì)節(jié)打磨好切換模塊比任何花哨優(yōu)化都更值得投入。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天日天天屌天天操| 九九综合| xxx亚洲午夜天堂| 精品人妻15区| 激情网五月天| 日本免费中文字幕在线| 日日日色色色色色| 香蕉久久国产AV一区二区| 色九久| 97干在线| 91碰碰碰| 亚洲av综合色区无码一| 91精品国产一区三一| 麻豆天美国美国产| 国产毛片久久久久久久| 九九热国产| 嗯嗯啊好大| 精品国产乱码久久久久久口爆网站| aV中文麻| 91亚洲网站| 日本天堂网| 天堂8在线新版官网| 男人的天堂Va| 色五月av| 无码二级三级| 欧美 色 亚洲| 97久久久久| 九九夜精品九九在线| 国产精品爽爽va在线观看98| 精品国产91av一区二区三区 | 99精品无码| 久久精品免费| 五月婷婷激情综合| 东北女人av| 黄色av片三级三级三级免费看| 欧美日韩*字幕一区| 色欲无码人妻日韩欧美精品| 色99在线| 久久手机视直播| 久久精彩免费视频| 99热国产| 日本不卡高清免v欧美日韩在线观看| 色性欧美| 六月色婷婷| 人妻啊啊人妻啊| 一,爱啪啪,在线免费视频| 国产自制av蜜乳| 90后后入| 日本久久女同性恋视频| 免费看黄片现成| 99re公开精品免费视频| 性爱乱伦视频免费| 不卡一区二区日本视频| 99精品网| 美女主播色欲91抠b在线播放| 久久这里都是精品| 国产一区二区三区中文字幕| 超碰九色| 日本天天色| 女色视频社区| 欧美91网站| 丝袜美腿操av| 免费家庭乱伦视频| 视频一区二区三区精品| 加勒比在线视频一区二区三区 | 国产性感骚丝袜在线| 日韩中字av一区| 精品九九九九九九九| av线电影| 91亚州| 超碰在线91| 性夜影院爽黄A爽免费动漫| 嫩草美女久久| 日va操| 爱爱动态120秒| 欧美玖玖爱免费玖玖| 欧美亚洲今日在线| 在线观看色视频| 看日韩美女二区三区免费操逼视频| 97 亚洲 日韩 欧美 在线| 啊啊啊啊啊啊啊在线| 国产精品久久久亚洲第一牛牛_在线观看| 操逼逼一区视频| 久久免费精品视频免一| 加勒比日本在线| 四季av一区二区凹凸精品小说| 日韩人妻丝袜中文字幕| A级国产欧美激情在线| 97 色综合| 亚洲精品国产熟女| 久久av色| 日1区2区3区2020| 男女激烈网站最新| 九九热最新| 久久久久久9999| 久午视频| 五月丁香六月激情| 久久99久久99精品天美传媒棢·纸:.| 日韩亚洲中文字幕在线| 97青娱乐超碰久久| 屁股久久久久久| av爱爱爱| 婷婷伊人一区| 日韩在线观看三级电影| 欧美日韩第一页| 按摩中文字幕| 搡老女人老91妇女老熟女| 久久亚州精品成人Av无| 激情小说五月天| 天美传媒精品一区二区三区| 大象AV在线| 亚洲日韩一区电影| 超碰九区| AV一二区| 中国韩国明星一极片一区乱码毛片人妻熟女一区二区三区 | 小草精彩毛片| 国产成人拍国产亚洲精品| 亚欧精品久久久久久久久久久| 加勒比综合a∨| 青青在线视频免费| 大香蕉宗合网在线| 天天日天天操天天射河南省| 自拍丝袜美腿人妻| 在线色导航| 久久久久ab| 欧美自拍网| 5月婷婷6月六月丁香| 久久国产视频专区一二三| 美女网站黄页| 成人乱码一区二区三少妇| 亚洲91网站| 国内毛片无遮挡国产| 91亚洲影院综合| 99re这里只有| 欧美亚洲丝袜美女电影| 涩涩涩综合| 美性中文综合网| 久久美女国产| 黄页av| 精品人妻1237| 日本一区二区不卡精品| 精品欧美乱码久| 91色噜噜狠狠| 美女操逼福利视频| 一区二区影视| 东北操逼| 老熟妇一区二区三区啪啪| 天天澡天天爽日日AV| 1956日韩精品| 18禁无码永久免费无限制| 伊人伊人LD| 亚洲精品一区二区三区在线播放| 亚州色综合| 国产丰满少妇久久久精品影院| 日韩激情小说一区二区| 日产中文字幕2020| 亚洲精品乱码久久久久久蜜桃麻豆| asc国产精品| a久久| 強姦亂倫a| 色五月激情AV在线| 婷婷久草一区二区三区| 色嗨嗨在线| 91亚洲欧美激情| 亚洲棕合电彰| 天天爽天天| 亚洲欧美国产va在线播放频| 哈哈操电影AV| 五月天综合在线| 日韩综合无码色欲vv| 久久久久久久久一区二区三区| 曰本熟女视频| 色婷婷亚洲婷婷| 377p欧洲日本亚洲大胆| 国产JDAV无码视频在线观看| 亚洲美女高潮喷水视频| 国产美女口爆吞精| 丝袜夫妻自拍| 色综合尤物| 操逼www.| 91av一区二区在线观看| 精品999999| 免费99精品国产自在在线| 日韩AV一起草| 亚洲97久久精品亚洲| 亚洲开心网| 少妇丝袜在线观看AV| 国语人妻精彩刺激| 天天日天天插| 婷婷AV一区二区三区| 午夜乱轮操逼视频免费看| 97超碰色情| 日本在线999| 国产丝袜一区二区三区| 熟妇视频一区二区三区在线观看| 99九九精品| 五月丁香社区婷婷日韩欧美精品影院| 中欧人妻丝袜中文字幕| 亚洲美女AV无码| 老熟女网站| 97久操| 97超碰公开| 97久久久久久久久久| 精品一区二区三区蜜桃臀www| 偷拍亚洲高清图片| 久草资源在线视频官方总站日韩丝袜美腿| 91网站18在线观看| 欧美亚男人的天堂| 超碰97玖玖爱| 国产风韵犹存熟妇三区| 亚洲成人帖图| 亚洲欧美色图片| 国产深喉视频一区二区| 无码直播久久久| 欧美真人抽搐一进一出gif| 亚洲āv网址在线观看| 国产亚洲色停停久久99精品91| 淫荡网址| 日韩无码黄色片| 国产成人精品日本亚洲语言| 天天干天天拍| 超碰久久草| 强奸熟女一区二区三区| 最新AV在线| 天天做天天爱| wwwxxx日本爽| 欧美一级A片在线看视频性色| 丁香六月综合激情| 嗯嗯嗯啊啊啊在线免费观看| 综合97久久| 男人的天堂视频精品乱在线| 欧美性爱第一页久久| 亚洲囯产精品女人久久久| 欧美成人性爱视频免费观看| 精品国产一区二区三区av在线资源| 精品网站9999| 中文一区二区| 久久大黄片| 国产精品一区av在线| 丁香五月综合| 国产日本熟女顶级一区二区三区视频 | 久久曰曰| 91九色丨国产丨爆乳| 神马影院午夜福利久久久| 久久久久深夜无码| 一级做a爰片性色毛片久久| 一级久久久久久久久久久| 五月综合视频| 老鸭窝成人| 中文字幕人妻资源在线| 高清在线偷拍自拍视频| 亚洲和欧美裸体美女双飞视频| 天天综合站| 狠狠操使劲操| 黑丝少妇| 久久国产99精品72福利| 狠狠做深爱婷婷久久二区| 亚洲熟女一区| 欧美性高潮| 伊人五月天婷婷| 免费视频a级毛片免费视频| 中文字幕成人| 97视频新免费| 欧美日韩国产高清在线一二三区| 天美国产精品| 亚洲天堂资源在线| 亚洲精品乱码久久久久久蜜桃麻豆| 成人夜夜爽| 久久黄黄黄| 国产精品干干干| 男人的天堂在线2| 国产精品农村妇女| 亚洲国产日韩欧美熟妇在线| 国产日韩欧美| 日本成人A片网站| 色哟哟国产精品免费网址| 欧美,亚洲,日韩,v,天堂,手机在线观看 | AAAA级日本片免费视频| 熟妇熟女视频一区二区三区| 九九九九九精品视频| 操逼啊啊啊91| 色男人色天堂东京热| 9国产超碰| 天天综合日韩网| 久久久月天| 精品无码久久久久久久久果冻糖心 | 殴美,日韩国产伦精品| 国产熟码AV| 成人免费不卡在线视频| 69丨亚洲丨精品丨入口免费播放| 日韩乱伦AⅤ| 99re95| 国产亚洲精品无码三区| 九九热精彩视频| 丰满岳乱妇一区二区三区| 人妻美腿丝袜制服诱惑综合天堂-| 综合欧美亚洲| 国产日韩精品一区二区三区| 丁香婷婷五月| 涩涩五月天| 国产精品一区在线播放| 青青草日韩无码| 热热色中文无码| 992这里有精品| 熟妇女伦乱视频| 日韩偷拍色图| 性久久| 91激情国产| 成人日韩欧美| 亚洲综合另类小说色区亚洲成av人片在www | 国产视频三区四区| 人妻二区| 玖玖爱伊人玖玖爱| 97精品国产97久久久| 黄色免费一级在线毛片| 狠色婷婷久久一区二区三区_| 国产黄色影片在线观看| 97视频在线免费| 色九月婷婷| 日本久久女同性恋视频| 乱子伦一区二区三区国产精品| 久久久久亚洲?V片无码V| 97超碰总站| 91丨九色丨东北熟女| 加勒比综合网| 天天激色| 亚洲国产欧美日韩人妻日中文| 在线亚洲 欧美 日本专区| 欧洲精品久久| 国产天美欧美| 欧美三级中文字幕hd| 亚洲资源站| 人妻少妇三级| 蜜臀av在线播放一区二区三区| 亚洲在线网站| 亚洲日精品| 九九九九日本| 日本福利社| 中文字幕一二区二三区人妻专区| 天美麻豆一区二区三区| 伊人991| 狠狠狠狠狠干| 97任你吞精| 欧美探花网| 一二三区精品视频| 国产精品在线一区二区| 久久久久久久九九九九九九| 亚洲 欧美日韩 另类| 无遮挡又黄又刺激的视频| 我想要啊 啊 啊| 中文字幕78| 精品一区二区三区蜜桃臀赵总| 思思热久久成人| 78超碰| 精品女同一区| 九九九九免费高| 九色 人妻 大香蕉| 婷婷色综合| 国产高清在线观看欧美| 日韩欧美大力操| 精品久久久久久中文字幕视频免费| 操逼无毒无码免费视频| 粉嫩少妇自慰在线| 污到发麻的视频 国产| 婷婷综合在线| 精品性爱无码在线播放| 国产精品免费日韩| 中文字幕奈奈美被公侵犯| 91色图| 人人妻人人澡人人爽久久av| 欧美男人的天堂| 啊啊啊在线看| 91丝袜视频在线观看| 精品在线78| 超碰偷拍| 天天综合~91| 亚洲色天堂九9| 亚洲性少妇| 久久妇| 国产自产22区| 91色人| 中文字幕一二三av| 日韩久射综合| 91无码西班牙视频在线| 无码久久亚洲高清,| 无码久久亚洲高清,| 国产无码三级视频在线观看| 92性色国产午夜福利在线661 | 麻豆天美久久91| 欧美嫩性色| 日本在线不卡123| 看日韩美女二区三区免费操逼视频 | 色五月婷婷五月天| 91男女啊啊啊| 蜜桃久久久久久久久久久久| 后入式五六区| 加勒比综合88| 眼镜人妻101.com| 尤物网址| 五月丁香久久| 亚洲男人天堂2012| 中字一区| 色妇综合网| 一级做a爰片性色毛片久久| 国产操逼视频在线观看| 国岛片视频| 五月丁香色色网| 热天堂一区二区| 99热导航| 精品人妻一区二区三区四区| 青娱乐淫乱1314| 国产成人一级av88| 五月婷色| 亚洲免费97免费| 2020中文字幕在线| 日韩熟女三十乱伦| 亚洲一区二区三区AV无码| 欧美99| 黄色高清久久无码依人| 色香网| 人妻色偷色噜| 大香蕉五月天| 精品一区二区三区四区外站| 亚洲不雅视频1区二区| 欧美偷拍区| 开心五月激情网| 天天看高清麻豆| 一本色道久久综合精品婷婷| 午夜操逼不卡| 日韩美一区| 日本熟妇自慰性高潮一区二区三区| 欧美天天干| 中文字幕交换人妻| 精品999日本| 欧美牲| 一起草精品人妻| 欧美综合加勒比在线| 干美女人妻| 欧美一区二区三区四区综合| 中亚精品极乱| 欧美性第1页| 国产午夜在线观看视频| 岛国小电影| 人妻激情视频| 超碰人人在线| 五月天人妻综合| 亚洲伊人a线观看视频| 91xingse| 色噜噜国产精品视频一区二区| 性爱乱伦网址| 国产精品一级二级在线| 日本性爱欧美性爱| 久久国产精品,久久国产| 少妇熟女一区二区三区| 欧美一区二区三区日韩| ...日韩成人一区二区三区字幕| 精品久久无码午夜福利| 天天操天天射青青草| 青青草依人大香蕉| 婷婷色色五月天| 91痴汉| 3p国产欧美99热| 少妇特黄一区二区三区| 欧美专区日本专区| 曰本道人妻久久久在线不卡色视频| 日日插夜夜| 1区2区3区中文字幕日韩| 91AV入口| 欧美少妇性乱| 亚洲一卡2卡3卡4卡乱码网站| 国产乱人妻精品入口| 26uuu欧美日韩| 亚洲在高跟鞋自慰久久在色线| 久久免费99精品久久久久久| 欧美一二在线| 人妻人人做人人澡人人爽欧美一区| 另类av综合久久| 亚洲一级性爱视频免费看| 天美传媒Av在线| 3d成人精品一区二区| 999熟女精品| 日韩精品在线观看网站| 96超碰网| 日韩熟女精品无码专区一区二区| 亚洲日韩在线a不卡99精品| 青青操在线亚洲视频观看欧美在线 | 国产女人成人精品视频| 亚洲天堂资源在线| 日本美女性生活久久久久久久 | 日韩精品99久久久久久中文字幕 | 强奸熟女一区二区三区 | 欲香欲色综合天天伊人| 中文字幕在线观看第二页| 亚洲精品一二牛牛| 狠狠色一区二区中文字幕| 3028国产精品| 97天天| 亚洲自拍欧美国产首页网曝| 亚洲欧洲日韩国产自在线| 黑人性欧美| 999久久久九| 草草影院最新网址| 欧美日韩亚洲天堂| 日日夜夜草草草| 日亚韩精品视频二区三| 伊人国产成人av网站| 狠综合网| 性色一线| 中文字幕成人理论在线| 日韩欧美亚洲自拍偷拍| 欧美淫乱视频| 国产精品 午夜福利| 成人福利视频网| 欧美激情综合| 亚洲色棕合| 国产精品国产自产拍高清AV| 天堂种子在线www网资源| 欧美不卡五十路| 日韩欧美久久婷婷网站| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 伊人97色天使| 九色婷婷| 亚洲啪啪视频一区二区| 色波多| 精品免费囯产一区二区三区| 91 亚洲情侣偷拍 久久| 密臀在线免费观看| 920日本午夜免费| 婷婷丁香五月天亚洲天堂网| 国产传媒午夜理伦精品| 蜜臀久久99精品久久久久| 天天操熟妇| 国产熟女精品区| 欧美少妇一区二区三区| 久久久爆乳翘臀一线天伦理视频| 久久香蕉综合一本到3atv| 老熟女搡BBBB搡BBBB视频| 屁股久久久久久久久久| 熟妇人妻丰满久久久久久久无码 | 曰韩av中文字幕专区| 国产AV毛片| 囯戸精品高潮呻吟旡码| 免费精品国偷自产在线在线| 亚洲 暴爽 AV人人爽日日碰| 亚洲不雅视频1区二区| 国产中文字幕在线观看| 日本中文字幕熟妇| 麻豆黄站| yazhouzaixian| 国产和美国毛片| 97在线观视频免费观看| 国产肏屁眼视频| 精品小视频在线| 97日视频| 亚洲无限观看| 丝袜色综合| 久热99999| 97欧美色| 96久久久久| 久久久蜜桃臀无码视频| 99久久99久久免费精品蜜臀| 欧美色亚洲| 精彩久久中文| 欧美激情欧美精品| 视频二区熟女人妻| 亚洲资源站| 性爱综合网| 夜夜免费视频| 一级片在线观看高清无码| 五月婷婷六月丁香| 日韩欧美日韩| 中文字幕在线免费观看视频| 国产毛片毛片4p懂色| 眼镜人妻101.com| 中文字幕精品免费一区二区| 婷婷99| 五月香婷婷| 91丨九色丨熟女高潮| 五月丁香亭亭| 国产精品久久久蜜臀| 九热大香蕉| 老司机午夜福利视频一区二区| 亚洲性少妇| 男人的天堂Va| 欧美片第一页| 强奸乱伦大香蕉网| 熟女精品一区二区三区| 亚洲精品丝袜| 97se综合| 久久国产乱子伦精品免费女,网站| 人妻夜夜爽天天爽三区麻豆AV网站| 中国AAAAAA黄色片| 天天做日日爱夜夜爽| 超碰免费在线| 9久久美女首页| 国产精品一区二区麻豆| 国产综合日韩伦理| 男人的天堂一区三区| 深夜啪啪啪视频免费| 区一二区日韩亚洲乱码av电影| 熟妇高潮精品一区二区三区下载| 99超碰碰| 成人a大片在线观看| 在线日韩视频| 亚洲一区二区 麻豆传媒| 青青操国产夫妻| 日本操逼视频不卡直接放| 91狼人| 四虎AV影视国产精品亚洲精品| 黄色交缠性感爆操91国产精品免费一区二区三区| 久久人妻熟女一区二区| 免费的很黄很污的全部视频| 亚洲色图久久成人| 免费男人的天堂| 亚洲性爱成人| 五月天综合网| 久超碰这里只有精品| 国产传媒午夜理伦精品| 久久亚洲不卡| 国产人妻久久精品一区二区三区| 曰韩操B| 蜜桃中文字日产乱幕4区| 麻豆熟妇乱妇熟色A片在线看| 一本精品日本在线视频精品 | 国产自偷自拍一区| 97爱b| 国产无码三级视频在线观看| 亚洲一区二区麻豆影院| 欧美天天影院| 日本精品第一视频在'| 亚洲91网站| 看免费的黄片| 97色论| 欧美性爱第一页久久| 91超碰人人| 亚洲国产精品无石码久久| 极品色www影院| 日本免费一区二区不卡| 超碰在线观看av不卡| 久艹伊人精品综合在线| 乱性AV| 亚洲精品丝袜| 日韩福利综合一区| 午夜天堂网| 100啪啪视频大全| 欧美天堂日韩三级国产传媒| 精品久久久av无码免费| 丰满翘臀美女影院视频| 国产高清成人免费视频| 久久9精品视频| 亚洲av噜噜噜噜噜噜| 天天淫人人妻日日色| 夜夜骑夜夜操| 色爱欲亚洲| 国产精品探花色| 九九九九欧美| 国产呦精品一区二区三区下载| 天天天操天天天爱| 亚洲欧洲综合视频在线| 94色色电影网| 欧美中文字幕一区 | 超碰地址97| 亚洲日韩美国人妻| 色天天野狼综合社区| 久久99视频| 亚洲色婷婷久久久综合日本| 亚洲色图a| 午夜120视频在线观看| 91男人综合| 久草成人福利导航| 色操逼网| 美女十八禁| 欧美日韩国产中文超碰| 三级AV入口| 91热色| oumeisetu综合| 在线播放成人高清免费视频| 久久久久久久久久久久欧美日| 色情五月综合婷婷| 国内毛片欧美香蕉精品| 97国产精品久久久久| 日本三级中国三级99人妇网站| 亚洲午夜未满十八勿入网站日本又色又爽又黄 | 久草久热| 粉嫩av在线一区二区| 2017天天插| 欲射影视| 久久精品人体AV| 手机在线A片| 国产精品网址| 久久高清无码夜夜操| 狠狠 91| 国产高清成人mv在线观看| 国产精品成人午夜福利| 性爱AV天堂| 天天色香欲综合网| 国产一区二区av综合| 2020久久免费视频| 综合熟妇一区二区三区| 欧美性暴力猛交XXXX| 五月丁香啪啪啪| 亚洲免费在线探花| 一级乱伦网站| 色欧美在线| 老女人碰碰在线碰碰视频| 一区二区三区在线资源| 免费操逼视频下载| 亚洲一卡二卡在线免费| rion磁力链接| 日日玩天天干| AV色五月天| 熟啊v色欧美热| 日本免费中文一区二区三区四区| 十八禁成人网站在线观看| 狠狠91| 亚洲a色| 天天操熟妇| 天天综合网~91综合网| 欧美性爱一区二区三区四区| 久久久久久中文字幕中文字幕最新| 日韩不卡a级视频专区| 亚洲欧美日韩免费电影| 国产精品久久久吖| 精品999999| 日韩有码专区| 欧美激情 亚洲色图| 欧美日本视频一区| 亚洲诱惑天堂| 欧美日韩精品青青| 亚州精品人妻一二三区| 青青草日韩免费观看高清在线| 亚洲棕合电彰| 九九久久99| 99久久综合| 欧美亚洲一区二区久久久婷精品大包诱| 久久久久久久一级黄色打同平台| 五月丁香影院| 人妻天堂综合网| 激情六月天| 久久一二三四五六七八九区区区 | 嗯嗯嗯嗯啊啊啊好紧好大| 992这里有精品| 志村玲子视频一区二区| 91久久久久免| 美女露胸露屁股| 日本熟人妻中文字幕在线|...久久国产精品-国产精品_日本一区二区三区中文字幕 | 精品大久久| 97超碰色屌| 欧美成人综合| 神马九九九| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | www.成人无码| 99夜夜操| 麻豆视频国产一区二区| 亚洲AV无码翔田千里网站| 日韩中文字幕人妻视频| 亚洲色图亚洲无码强奸乱伦| 亚洲第一在线视频| 啊啊啊啊一区| 99综合自拍| 九一性生活免费视频| 清纯唯美综合亚洲| 夜夜嗨视频| 92性色国产午夜福利在线661| 日本操大逼| 丁香五月婷婷色| 丝袜狠狠草尤物人妻av91| 中国黑人三级片网站上区| 亭亭在线资源| 亚洲牲交| 女人 A一级| 91日韩在线| 国产精品网站免费| 青青操日韩| 天天上日日上日韩精品| 风流老熟女一区二区三区l| 国产精品国产拍高清AV| 成人无码专区精品视频| 91色综合色| J?P?NESEHD熟女熟妇伦| 久久一级无码精品毛片6| 五月天婷婷色| 青娱乐手机日韩在线视频| 密臀在线视频| 91在线超高颜值国产| 99这里有精品| 蜜屁Av| 大JI巴好深好爽又大又粗视频| 黄色AAAAA欧美| www.狠狠干.coom | 亚洲成人综合在线| 日韩啪啪啪视频| 男女国产精品| 久久鲁干| 99国产精品免费| 亚洲国产精品无石码久久| 丝袜剧情| 欧亚久久偷拍视频| 色妇综合网| 亚洲aV无码成人在线观看| 国模不卡一本二本三电影| 97久久国产| 久久男女激情视频网站 | 91精品微拍福利| 情侣开房子拍 日韩无码 女的很漂亮| 天天日美女的B| 性饥渴少妇av无码毛片| 熟女人妻久久中文字幕一二区| 日日妻色网| 中文字幕日韩专区精品系列| 920日本午夜免费| 国产精品一二三| 成人性爱视频在线看| 国产精品对白内射| 婷婷爽人人婷婷爽视频| 十八禁啪啦拍视频无遮挡| 一直超碰| 人人妻人人爽 97人人看碰人免费公开视频| 95人妻爽爽人人做人人澡| 99热线麻豆| 69精品久久久久中文字幕| 日韩视频小说在线观看| 久久久精品电影| 久久的网站啊啊啊啊啊| 美國A片| 国精综合一二三区影视| 亚洲另类欧美精品| www老逼91| 日韩欧美性吧婷婷乱伦大香蕉 | 夜夜青青无码影院| 国产精品呦一区二区三区| 躁躁日曰躁2020| 99久久精品欧美国产| 美女97超碰| 91P0RNY大屁股人妻| 91人妻视频在线| 韩国一级做a久久久久| 毛片视频白嫩| 夜夜草我| 超碰这里只有精品| caoni国产亚洲av| 国产丝袜高跟美女av免费观看| 午夜福利精品| 欧美日韩系列| 色五月网址| 欧美少妇色图| 91色综合激情| www.av在线视频| 亚洲熟妇综合久久久久久| 亚洲Av无码成人精品国产| 日日爽熟女| 啊啊啊啊嗯嗯嗯用力好爽 | 60秒试看最爽10分钟网站| 日韩欧美午夜一区二区| 久久精品人妻一区二区| 日本肉体xxxx裸交| 97av在线观看| 大奶尤物鲍汁淫荡欧美视频粉嫩夜夜骚| 自拍偷拍草一草| 亚洲天堂电影网| 91久久久久久| 亚洲精品一区二区精华| 青青草字幕AV| 91久久99久久91熟女精品| 国产精品熟女一区二区三区| 天天亚洲综合| 人人操人人大香蕉| 中文字幕在线观| 好看的91视频| 爽 好舒服 无码刺激久久| AV中亚| 九九九精品一区二区无码| 精品-91人妻子系列| 91综合在线| 极品AV网站在线观看| 婷婷五月天av| 久久性生大片免费观看性| 91天射| 亚洲男人bt天堂| 日本黄色大片一级视频免费麻豆| 天堂av最新电影网| 亚洲97P| 久热九九| 黄色激情电影在线观看| 麻豆熟妇乱妇熟色A片在线看| 色女综合| 婷婷色色五月天| 九月丁香婷婷色| 78精品| 久久久九九九九| 色综合91| 欧美顶级黄片AAAAA在线免费看 | 久久久专区| 欧美三级不卡| 欧美一级A片在线看视频性色| 亚洲精品一二牛牛| 97ai亚洲| 岛国不卡超碰护士AV在线播放| 欧美熟爽综合| 久久女婷| 国产精品久久久久久 百度| 国产成人亚洲精品无码最新在线| 有码专区最新中文字幕有码| 久久久久网站-538在线视频-欧美永久乱码 | 色九九九| 亚洲情色电影网| 九九aV| 91爆操视频| 在线综合 亚洲 欧美中文字幕| 精品国产AV一区天美传媒| 超碰在线第一页| 天天舔九色婷婷| 婷婷三区| 色综合一区二区三巨| 丁香九月激情| a在线视频免费观看| 18禁的网站在线| av爱爱爱| 午夜男女爽爽爽影院视频| 色九久| sewuyueav| 四虎精品亚洲| 日日AAvv| 日日玩天天干| 久久中文字幕女同性恋一区| 亚洲凸凹超碰成人| 中文字幕视频免费| 九九九九精品一区| 91色色综合| 亚欧美综合网。| 精品成人女人久久| 校园春色中文字幕AV| 青青草成人视频在线观看二区| 99re9这里只有精品| 日日干日日操五月天伦理视频| 九九毛片这里只有精品| 奸色色 男人天堂 天天射| 黑丝内射一区二区三区| 亚洲有码 欧美精品| 96精品在线| 亚洲中文制服诱惑| 中文字幕乱碼在线| 九九九久久久久| 国产久久久久影院老熟女| 欧美论理片| 熟女露脸激情自拍视频| 四虎影视国产精品| 久9九综合在线| 欧美激情久操网| 最近2018中文字幕在线高清第一页| 精品国模无码| 久久riav中文精品| 破苞ⅩXXX性无码动漫无码| 久久98| 中文字幕日产av人| 蜜臀久久99精品| 亚洲怡春院| 久久超碰com| a片在线播放| 一区二区影院| 91狠狠综合久久| 在现视频女上位好爽| 91美女视频在线| 久久久久婷婷精品av电影| 9 1果冻精品视频| 人人性爱视频免费| 色yeye成人免费视频| 日韩免费性爱视频在线观看| 国产熟女少妇一区| 情色五月天网| 亚洲色图欧美色18直播在线| 日本成人在线不卡一区二区三区 | 啊啊啊啊啊操我视频| 亚洲一区亚洲天堂| 这里只有97精品| 欧美在线永久天堂| 日韩精品一区的| 国产天天骚| 中文字幕色AV| 午夜舔阴达高潮视频免费看| 操逼1区| 神马福利久草| 久欲AV| 国产成人91一区二区三区| 人人操人人大香蕉| 欧美最婬乱婬爆婬性视频| 97操综合| 呦呦影院| a网站免费观看| 污污污8888| 久久春色| 日韩中文字幕视频在线观看| 顶级少妇BT天堂| 色原狠狠天天天| 在线观看免费视频国产| 91在线色综合| 欧美色图自拍| 中文字幕奈奈美被公侵犯| 久久,精品一二三| 91熟女.com| 性暴力欧美猛交在线直播| 性吧在线视频| 国产91丝袜在线播放蜜月| 国产JDAV无码视频在线观看| 天天日天天爽| 久久久九九| 久久黄色性爱视频| 无码一区二区三区四区五区六区七区八区九区十区视频 | 欧美性天天影视| 91狠狠狠| 成人无码影片视频在线| 青青草啪啪网| 激情婷婷综合久久| 亚洲综合小说另类图欧美视频激情小说色五月天 | 国产有码一区| 色香AV| 人妻丝袜无 码视频专区| 大干人妻| 午夜精品久久久久久久99蜜桃一| 成人熟女区| AV一起草在线| 亚洲限制级在线| 久久六六| 少妇无码太爽| 色综91| 一区二区三区在线资源| 97日亚洲欧美| 婷婷久久综合久| 四虎精品永久在线观看| 8050午夜少妇无码| 亚洲国产中文字幕| 99久久e免费热视| 天堂网 主播 亚洲| 午夜一区二区三区国产| 久久爱超碰网| 久久精品国产亚洲AV无码做| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 色噜噜人妻丝袜AV资源| 91大神精品长腿在线观看网站| 久久久久久久久久久人妻| 加勒比综合| 夜夜夜久久| 干我久操| 少妇三P| av无码av无码专区| 老熟妇一区二区三区| 色色色99| 国产精品第一页国产大屁股视频免费区| 999久久久精品国产| 一级二级在线观看| 麻豆性爱视频在线播放| 国产日韩精品人妻久久久久色欲网站| 秋霞一区二区三区四区五区六区七区| 26uuu性物| 热热色综合网| 精品 码产区一区二-1080P高清在线www-B029AV| 伊人91| 色诱中文字幕| 亚洲国产精品无码AV在线| 亚洲天堂少妇| 艳美熟妇先锋一二三区| 欧美精品久久久久久久丰满| 亚州熟妇精品| 欧美一级色| 中文字幕av亚洲精品| 亚洲天堂情色| 欧美 亚洲 偷拍自拍| 久久久一区二区三区四区五区| 玖玖爱综合| 天天色综亚洲91污| 9久久久久| 超碰中文字幕人妻草一区| 日韩性爱电影一区| 97干色| 亚洲drav色图| 亚州精人品大香蕉| 午夜操逼不卡| 91美女精品| 白丝少妇一区二区| 免费观看啪视频| 2025年A片视频精品| 91美女高潮| 熟女在线视频| 唐山老熟妇露脸啪啪叫| 人人妻人人爱人人玩| 中文字幕78| 蜜臀久久99精品久久久久久久久| 黄色av网站在线播放| 久久久啊啊啊| 伊人aaa| 天天操av懂色| 白嫩国模丰满一二三区| 亚洲欧美高清无码| 亚洲欧美校园| 神马久久久久久久久久久久| 丁香五月婷婷五月| 久久黄色性爱视频| 国产60页| 97超碰伊人| 久久大精品乱码视频人妻熟女| 色蜜AV| 97人人模人人爽人人| 成人无码电影在线观看网| 人妻欧美| 深爱伊人影院| 操淫穴亚洲五月丁香| 岛国小电影| 尹人大香蕉视频在线| 亚洲美女自拍偷拍视频| 日韩欧美午夜一区二区| 国产97在线视频| 国产日韩美女小穴视频网站不卡| 欧美夜色| 午夜精品久久久99| 亚洲色图91欧美日韩| 国产超碰人人操| 欧美日韩操逼动图| 人人操人人操人人人操| 国产黄色影片在线观看| 日韩久久激情精品| 北约熟女超碰| 久久国产AⅤ| 96久久久久| 欧美色97| 影音资源男人日韩| 日韩精品大香蕉伊人在线| 亚洲人在线| 97久久久久久久精| 亚洲综合五月天婷婷丁香| 国产精品视频精品一二| 日韩欧美中文| 国产精品嫩草影院免费| 欧美一区二区福利在线| 欧美夜夜草视频| 91综合色噜噜| 日本熟妇浓毛hdsex| 久操精品| 激情五月天中文字幕色| 国产精品福利视频| 在线不欧美| 欧美91精品国产自产| 99人妻| 2024黄色视频| 成人午夜高潮av猛片| 国内偷拍精品一区二区| 无码精品久久久久久亚洲| 男人的天堂 在线一区| 天堂无码| 天堂v无码免费视频| 国产在线综合网| 被男人吃奶很爽的毛片| 少妇人妻太紧太深av| 日韩欧美tv一区二区在线观看| 看大黄色大片原件| 99久久婷婷丁香| 一级久久久久久久久久久| 日本一级性爱| 91啪啪| 天天香香欲综合| 中文字幕女同在线|