亚洲有码Av一区二区三区_国产高清啪啪免费视频_69色视频国产_国产成人人人爆出白浆_国产精品自在线拍国_一本久久伊人热热精品无码_午夜性刺激在线看免费带字幕_助力高品质欧美狂喷水_亚洲精品日韩无码_精品无码一区二区三区蜜臀_麻豆高清国产AV_熟妇人素无码中文字幕_亚洲a级片在线观看_国产欧美日韩三区_99国产成人高清在线观看

ARTICLE DETAIL

資訊詳情

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

iOS自定義相機(jī)實(shí)戰(zhàn):AVFoundation曝光補(bǔ)償與實(shí)時(shí)亮度分析

iOS自定義相機(jī)實(shí)戰(zhàn):AVFoundation曝光補(bǔ)償與實(shí)時(shí)亮度分析 之前做 iOS 拍攝類功能時(shí)我一直在吐槽 iPhone 原生相機(jī)在逆光場(chǎng)景下的體驗(yàn)明明陽(yáng)光很好取景器里卻黑成一片點(diǎn)一下亮處對(duì)焦整體畫(huà)面又過(guò)曝得厲害。后來(lái)在 Hacker News 上看到一個(gè)很有意思的項(xiàng)目叫 “Camera Sun”定位就是針對(duì) iPhone 相機(jī) App 的取景與曝光問(wèn)題進(jìn)行改進(jìn)。這讓我意識(shí)到單純吐槽原生相機(jī)不夠用不如自己動(dòng)手在 AVFoundation 層面做一套自定義相機(jī)方案把取景亮度分析、曝光補(bǔ)償、手動(dòng)輔助控件這些能力補(bǔ)全。本文將圍繞這個(gè)思路完整拆解一個(gè)名為Camera Sun的 iOS 自定義相機(jī)項(xiàng)目。先從原生相機(jī)的問(wèn)題場(chǎng)景入手再講清楚 AVFoundation 的采集架構(gòu)然后給出完整可運(yùn)行的 SwiftUI AVFoundation 案例代碼最后補(bǔ)充常見(jiàn)報(bào)錯(cuò)排查和工程化建議。無(wú)論你是 iOS 新手還是在做自定義相機(jī)、掃碼、AR 采集的開(kāi)發(fā)者都可以從中找到可以復(fù)用的內(nèi)容。1. 背景iPhone 原生相機(jī)在逆光場(chǎng)景下為什么“不好用”1.1 原生相機(jī)的“自動(dòng)”與“不夠自動(dòng)”iPhone 自帶相機(jī) App 的拍攝體驗(yàn)在大多數(shù)日常場(chǎng)景下是非常優(yōu)秀的白平衡、自動(dòng)曝光、智能 HDR 都做得足夠好。但一旦進(jìn)入逆光、大光比、強(qiáng)太陽(yáng)直射這類環(huán)境問(wèn)題就很容易暴露出來(lái)取景器畫(huà)面偏暗主體輪廓不清晰。點(diǎn)擊暗部對(duì)焦亮部直接過(guò)曝。點(diǎn)擊亮部對(duì)焦暗部又死黑一片。自動(dòng)曝光系統(tǒng)始終在“你想拍什么”和“天空很亮”之間搖擺。這本質(zhì)上不是相機(jī)硬件不行而是原生相機(jī)的自動(dòng)曝光策略更偏向“整體畫(huà)面均衡”在生產(chǎn)級(jí)拍攝中我們經(jīng)常需要的是“對(duì)某個(gè)區(qū)域精準(zhǔn)曝光”甚至需要手動(dòng)干預(yù) EV 補(bǔ)償值。1.2 “Camera Sun”項(xiàng)目想解決的問(wèn)題“Camera Sun”這個(gè)名字很直白——它面向的是“太陽(yáng)”這種極端光源場(chǎng)景。項(xiàng)目的核心目標(biāo)是把取景器中的畫(huà)面亮度信息用更直觀的方式呈現(xiàn)出來(lái)。提供手動(dòng)曝光補(bǔ)償EV控制。在強(qiáng)光或者逆光環(huán)境下幫助用戶先看清畫(huà)面再按下快門。用自定義相機(jī)方案替代原生相機(jī)在某些場(chǎng)景下的不足。放到開(kāi)發(fā)層面它背后的技術(shù)點(diǎn)其實(shí)就是幾個(gè)用 AVFoundation 自定義相機(jī)采集流程。實(shí)時(shí)獲取每一幀畫(huà)面的亮度數(shù)據(jù)。根據(jù)亮度分析結(jié)果調(diào)整曝光參數(shù)。在取景界面上疊加輔助控件比如亮度條、點(diǎn)測(cè)光框、EV 滑塊。本文的實(shí)戰(zhàn)項(xiàng)目會(huì)圍繞這四點(diǎn)展開(kāi)做一個(gè)能用模擬器跑通、可以在真機(jī)上體驗(yàn)的 Mini 版本。2. 環(huán)境準(zhǔn)備與項(xiàng)目結(jié)構(gòu)2.1 開(kāi)發(fā)環(huán)境說(shuō)明本文示例以常見(jiàn)環(huán)境為例版本需要根據(jù)你的項(xiàng)目實(shí)際情況調(diào)整項(xiàng)目說(shuō)明操作系統(tǒng)macOS 12 及以上IDEXcode 14 及以上語(yǔ)言Swift 5.7UI 框架SwiftUI系統(tǒng)框架AVFoundation、CoreImage、UIKit最低部署版本iOS 15.0調(diào)試設(shè)備建議使用 iPhone 真機(jī)需要特別說(shuō)明的是相機(jī)類功能在模擬器中會(huì)有很大限制尤其是采集會(huì)話、曝光參數(shù)調(diào)整、亮度回調(diào)這些能力模擬器只能模擬部分行為。所以本文的代碼在模擬器上可以運(yùn)行界面但完整功能建議在真機(jī)上驗(yàn)證。2.2 項(xiàng)目基礎(chǔ)結(jié)構(gòu)我們先在 Xcode 中創(chuàng)建一個(gè) SwiftUI App 項(xiàng)目工程名稱可以叫CameraSunDemo最終文件結(jié)構(gòu)如下CameraSunDemo/ ├── CameraSunDemoApp.swift ├── ContentView.swift ├── Models/ │ └── ExposureState.swift ├── Services/ │ └── CameraService.swift ├── Views/ │ ├── CameraPreviewView.swift │ ├── BrightnessIndicatorView.swift │ └── ExposureControlView.swift └── Info.plist后面所有代碼都會(huì)按照這個(gè)結(jié)構(gòu)給出文件路徑方便你對(duì)照創(chuàng)建。3. 核心原理AVFoundation 相機(jī)采集鏈路3.1 從 AVCaptureSession 說(shuō)起在 iOS 中實(shí)現(xiàn)自定義相機(jī)核心類是AVCaptureSession。它就像一條“數(shù)據(jù)管道”把相機(jī)硬件采集到的數(shù)據(jù)經(jīng)過(guò)輸入、輸出兩個(gè)端口連接起來(lái)。相機(jī)硬件 ↓ AVCaptureDeviceInput輸入 ↓ AVCaptureSession會(huì)話 ↓ AVCaptureVideoDataOutput輸出回調(diào) ↓ CMSampleBuffer單幀數(shù)據(jù)與直接調(diào)用UIImagePickerController相比使用 AVFoundation 自定義采集可以獲得對(duì)每一幀畫(huà)面做實(shí)時(shí)處理的能力。手動(dòng)控制曝光、對(duì)焦、白平衡的權(quán)限。更自由的界面定制。更低的延遲。3.2 曝光補(bǔ)償 EV 是什么曝光補(bǔ)償用 EVExposure Value表示單位為 eV簡(jiǎn)單理解就是“在你測(cè)光結(jié)果的基礎(chǔ)上人為地讓畫(huà)面更亮或更暗一檔”。iPhone 相機(jī)的 AVFoundation 提供了非常直接的控制接口device.setExposureTargetBias(completionHandler:)AVCaptureDevice上的exposureTargetBias屬性可以設(shè)置當(dāng)前曝光補(bǔ)償值范圍通常在minExposureTargetBias到maxExposureTargetBias之間iPhone 一般支持-8.0到8.0實(shí)際會(huì)根據(jù)設(shè)備能力有所差異。3.3 實(shí)時(shí)亮度分析思路在自定義相機(jī)中要判斷當(dāng)前畫(huà)面是不是“太黑”或“太亮”最直接的方法是讀取每一幀畫(huà)面的平均亮度。常用的實(shí)現(xiàn)路徑是AVCaptureVideoDataOutput輸出CMSampleBuffer。將CMSampleBuffer轉(zhuǎn)成CVPixelBuffer。使用 CoreImage 的CIAreaAverage濾鏡計(jì)算平均顏色。將平均顏色的亮度值映射到 UI 上。具體代碼如下func brightness(from pixelBuffer: CVPixelBuffer) - Float? { let ciImage CIImage(cvPixelBuffer: pixelBuffer) let extent ciImage.extent let filter CIFilter(name: CIAreaAverage)! filter.setValue(ciImage, forKey: kCIInputImageKey) filter.setValue(CIVector(cgRect: extent), forKey: kCIInputExtentKey) guard let outputImage filter.outputImage else { return nil } var bitmap [UInt8](repeating: 0, count: 4) let context CIContext(options: [.workingColorSpace: NSNull()]) context.render(outputImage, toBitmap: bitmap, rowBytes: 4, bounds: CGRect(x: 0, y: 0, width: 1, height: 1), format: .RGBA8, colorSpace: nil) let r Float(bitmap[0]) / 255.0 let g Float(bitmap[1]) / 255.0 let b Float(bitmap[2]) / 255.0 // 使用 Rec.709 亮度權(quán)重 let brightness 0.2126 * r 0.7152 * g 0.0722 * b return brightness }這里使用CIAreaAverage的原因是它由 CoreImage 底層優(yōu)化性能比自己遍歷像素要好很多。需要注意的點(diǎn)是CIContext建議復(fù)用不要每幀創(chuàng)建。CIAreaAverage的運(yùn)行耗時(shí)取決于圖像大小實(shí)際項(xiàng)目建議先縮小圖像再計(jì)算。3.4 AVCaptureVideoDataOutput 的像素格式設(shè)置要讓上面的亮度計(jì)算代碼正常工作需要確保輸出像素格式是 BGRA 或者 RGBA。在創(chuàng)建AVCaptureVideoDataOutput時(shí)建議顯式設(shè)置videoOutput.videoSettings [ kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA ]如果你不設(shè)置系統(tǒng)默認(rèn)可能輸出 420f也就是kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange這時(shí)候直接轉(zhuǎn)CIImage再走CIAreaAverage也可以但輸出顏色通道需要額外處理不夠直觀。所以我們統(tǒng)一改成 BGRA方便調(diào)試。4. 完整實(shí)戰(zhàn)實(shí)現(xiàn) Camera Sun 的取景亮度分析與曝光控制下面我們進(jìn)入核心實(shí)戰(zhàn)環(huán)節(jié)。這一節(jié)會(huì)逐步完成一個(gè) Mini 版 Camera Sun功能包括啟動(dòng)自定義相機(jī)并顯示實(shí)時(shí)預(yù)覽。分析每一幀畫(huà)面的平均亮度。用一個(gè)可視化的亮度條展示當(dāng)前亮度狀態(tài)。通過(guò)滑塊手動(dòng)調(diào)節(jié)曝光補(bǔ)償 EV 值。點(diǎn)擊預(yù)覽畫(huà)面進(jìn)行點(diǎn)測(cè)光對(duì)焦。4.1 創(chuàng)建相機(jī)服務(wù)類先創(chuàng)建相機(jī)采集服務(wù)類CameraService它負(fù)責(zé)整個(gè) AVCaptureSession 的生命周期。文件路徑Services/CameraService.swiftimport AVFoundation import CoreImage import UIKit protocol CameraServiceDelegate: AnyObject { func cameraService(_ service: CameraService, didOutput brightness: Float) func cameraService(_ service: CameraService, didFail error: Error) } final class CameraService: NSObject { private let session AVCaptureSession() private let sessionQueue DispatchQueue(label: com.camerasun.sessionQueue) private let videoOutput AVCaptureVideoDataOutput() private let ciContext CIContext(options: [.workingColorSpace: NSNull()]) private var currentDevice: AVCaptureDevice? weak var delegate: CameraServiceDelegate? var previewLayer: AVCaptureVideoPreviewLayer { let layer AVCaptureVideoPreviewLayer(session: session) layer.videoGravity .resizeAspectFill return layer } override init() { super.init() videoOutput.setSampleBufferDelegate(self, queue: DispatchQueue(label: com.camerasun.videoQueue)) videoOutput.alwaysDiscardsLateVideoFrames true videoOutput.videoSettings [ kCVPixelBufferPixelFormatTypeKey as String: kCVPixelFormatType_32BGRA ] } func start() { sessionQueue.async { [weak self] in self?.configureSession() self?.session.startRunning() } } func stop() { sessionQueue.async { [weak self] in self?.session.stopRunning() } } private func configureSession() { session.beginConfiguration() session.sessionPreset .high guard let device AVCaptureDevice.default(.builtInWideAngleCamera, for: .video, position: .back) else { delegate?.cameraService(self, didFail: CameraError.deviceNotFound) return } currentDevice device do { let input try AVCaptureDeviceInput(device: device) if session.canAddInput(input) { session.addInput(input) } } catch { delegate?.cameraService(self, didFail: error) return } if session.canAddOutput(videoOutput) { session.addOutput(videoOutput) } session.commitConfiguration() } func setExposureBias(_ value: Float) { guard let device currentDevice else { return } do { try device.lockForConfiguration() let clampedValue max(device.minExposureTargetBias, min(device.maxExposureTargetBias, value)) device.setExposureTargetBias(clampedValue) { _ in } device.unlockForConfiguration() } catch { print(鎖定設(shè)備配置失敗: \(error)) } } func focusAtPoint(_ point: CGPoint, in previewLayer: AVCaptureVideoPreviewLayer) { guard let device currentDevice else { return } let pointOfInterest previewLayer.captureDevicePointConverted(fromLayerPoint: point) do { try device.lockForConfiguration() if device.isFocusPointOfInterestSupported { device.focusPointOfInterest pointOfInterest device.focusMode .autoFocus } if device.isExposurePointOfInterestSupported { device.exposurePointOfInterest pointOfInterest device.exposureMode .autoExpose } device.unlockForConfiguration() } catch { print(設(shè)置對(duì)焦失敗: \(error)) } } } extension CameraService: AVCaptureVideoDataOutputSampleBufferDelegate { func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { guard let pixelBuffer CMSampleBufferGetImageBuffer(sampleBuffer) else { return } if let brightness brightness(from: pixelBuffer) { DispatchQueue.main.async { [weak self] in self?.delegate?.cameraService(self!, didOutput: brightness) } } } private func brightness(from pixelBuffer: CVPixelBuffer) - Float? { let ciImage CIImage(cvPixelBuffer: pixelBuffer) let extent ciImage.extent let filter CIFilter(name: CIAreaAverage)! filter.setValue(ciImage, forKey: kCIInputImageKey) filter.setValue(CIVector(cgRect: extent), forKey: kCIInputExtentKey) guard let outputImage filter.outputImage else { return nil } var bitmap [UInt8](repeating: 0, count: 4) ciContext.render(outputImage, toBitmap: bitmap, rowBytes: 4, bounds: CGRect(x: 0, y: 0, width: 1, height: 1), format: .RGBA8, colorSpace: nil) let r Float(bitmap[0]) / 255.0 let g Float(bitmap[1]) / 255.0 let b Float(bitmap[2]) / 255.0 return 0.2126 * r 0.7152 * g 0.0722 * b } } enum CameraError: LocalizedError { case deviceNotFound var errorDescription: String? { switch self { case .deviceNotFound: return 未找到可用的相機(jī)設(shè)備 } } }代碼說(shuō)明使用sessionQueue串行隊(duì)列執(zhí)行會(huì)話配置和啟停操作避免主線程阻塞。videoOutput.alwaysDiscardsLateVideoFrames true表示幀數(shù)據(jù)堆積時(shí)丟棄舊幀保證亮度回調(diào)的實(shí)時(shí)性。亮度計(jì)算使用 Rec.709 權(quán)重更接近人類對(duì)亮度的感知。setExposureBias方法會(huì)先做min/max范圍約束防止傳入非法值導(dǎo)致崩潰。4.2 創(chuàng)建預(yù)覽視圖在 SwiftUI 中接入AVCaptureVideoPreviewLayer最通用的方式是使用UIViewRepresentable包裝一個(gè)UIView。文件路徑Views/CameraPreviewView.swiftimport SwiftUI import AVFoundation struct CameraPreviewView: UIViewRepresentable { let previewLayer: AVCaptureVideoPreviewLayer func makeUIView(context: Context) - UIView { let view UIView() view.backgroundColor .black previewLayer.frame view.bounds view.layer.addSublayer(previewLayer) return view } func updateUIView(_ uiView: UIView, context: Context) { DispatchQueue.main.async { previewLayer.frame uiView.bounds } } }這里有一個(gè)容易忽略的細(xì)節(jié)makeUIView執(zhí)行時(shí)UIView的 bounds 可能還不是最終尺寸所以需要在updateUIView中持續(xù)更新previewLayer.frame否則預(yù)覽畫(huà)面可能顯示不全。4.3 創(chuàng)建亮度指示器亮度指示器是 Camera Sun 項(xiàng)目最有辨識(shí)度的 UI 之一。它用一條橫向的漸變條展示當(dāng)前畫(huà)面的平均亮度用戶一眼就能看出“現(xiàn)在畫(huà)面是偏暗還是偏亮”。文件路徑Views/BrightnessIndicatorView.swiftimport SwiftUI struct BrightnessIndicatorView: View { let brightness: Float let targetBrightness: Float private var normalizedValue: CGFloat { CGFloat(max(0, min(1, brightness))) } var body: some View { GeometryReader { geometry in ZStack(alignment: .leading) { Capsule() .fill(Color.black.opacity(0.6)) .overlay( Capsule() .stroke(Color.white.opacity(0.3), lineWidth: 1) ) // 亮度漸變條 Capsule() .fill( LinearGradient( colors: [.black, .gray, .white], startPoint: .leading, endPoint: .trailing ) ) .frame(width: geometry.size.width * normalizedValue) // 目標(biāo)亮度指示線 Rectangle() .fill(Color.yellow) .frame(width: 2) .offset(x: geometry.size.width * CGFloat(targetBrightness) - 1) } } .frame(height: 8) } } struct BrightnessIndicatorView_Previews: PreviewProvider { static var previews: some View { BrightnessIndicatorView(brightness: 0.5, targetBrightness: 0.6) .padding() } }這里的targetBrightness可以理解為我們“期望的畫(huà)面亮度”比如 0.5 代表中等亮度。當(dāng)指示條超過(guò)目標(biāo)線時(shí)畫(huà)面偏亮低于目標(biāo)線時(shí)畫(huà)面偏暗。4.4 創(chuàng)建曝光控制滑塊曝光補(bǔ)償是 Camera Sun 的核心交互這里用 SwiftUI 的Slider綁定 EV 值。文件路徑Views/ExposureControlView.swiftimport SwiftUI struct ExposureControlView: View { Binding var exposureValue: Double let range: ClosedRangeDouble var body: some View { VStack(spacing: 8) { HStack { Text(EV) .font(.caption) .foregroundColor(.white) Slider(value: $exposureValue, in: range, step: 0.1) .tint(.yellow) Text(String(format: %.1f, exposureValue)) .font(.caption.monospacedDigit()) .foregroundColor(.white) .frame(width: 50, alignment: .trailing) } HStack { Text(暗) .font(.caption2) .foregroundColor(.white.opacity(0.6)) Spacer() Text(亮) .font(.caption2) .foregroundColor(.white.opacity(0.6)) } } .padding(.horizontal, 16) .padding(.vertical, 12) .background(Color.black.opacity(0.5)) .clipShape(RoundedRectangle(cornerRadius: 12)) .padding(.horizontal, 20) } }4.5 組裝主界面現(xiàn)在把相機(jī)預(yù)覽、亮度指示器、曝光控制整合到一個(gè)界面中。文件路徑Views/ContentView.swiftimport SwiftUI import AVFoundation struct ContentView: View { StateObject private var viewModel CameraViewModel() var body: some View { ZStack { Color.black.ignoresSafeArea() if let previewLayer viewModel.previewLayer { CameraPreviewView(previewLayer: previewLayer) .ignoresSafeArea() } else { ProgressView(相機(jī)初始化中...) .foregroundColor(.white) } VStack { Spacer() // 亮度狀態(tài)卡片 VStack(alignment: .leading, spacing: 8) { HStack { Image(systemName: sun.max.fill) .foregroundColor(.yellow) Text(亮度分析) .font(.headline) .foregroundColor(.white) Spacer() Text(String(format: %.2f, viewModel.currentBrightness)) .font(.system(.body, design: .monospaced)) .foregroundColor(.white) } BrightnessIndicatorView( brightness: viewModel.currentBrightness, targetBrightness: viewModel.targetBrightness ) Text(viewModel.brightnessDescription) .font(.caption) .foregroundColor(.white.opacity(0.8)) } .padding(16) .background(Color.black.opacity(0.5)) .clipShape(RoundedRectangle(cornerRadius: 16)) .padding(.horizontal, 20) ExposureControlView( exposureValue: $viewModel.exposureValue, range: viewModel.exposureRange ) } } .onAppear { viewModel.start() } .onDisappear { viewModel.stop() } .gesture( DragGesture(minimumDistance: 0) .onEnded { value in viewModel.focusAtPoint(value.location) } ) } } final class CameraViewModel: ObservableObject { Published var previewLayer: AVCaptureVideoPreviewLayer? Published var currentBrightness: Float 0 Published var exposureValue: Double 0 Published var targetBrightness: Float 0.55 Published var exposureRange: ClosedRangeDouble -8.0...8.0 Published var brightnessDescription: String 等待數(shù)據(jù)... private let cameraService CameraService() private var isUpdatingExposure false init() { cameraService.delegate self preparePreviewLayer() } private func preparePreviewLayer() { // 這里延遲獲取 previewLayer確保 session 已經(jīng)初始化 DispatchQueue.main.async { [weak self] in guard let self self else { return } self.previewLayer self.cameraService.previewLayer } } func start() { cameraService.start() } func stop() { cameraService.stop() } func focusAtPoint(_ point: CGPoint) { guard let previewLayer previewLayer else { return } cameraService.focusAtPoint(point, in: previewLayer) } } extension CameraViewModel: CameraServiceDelegate { func cameraService(_ service: CameraService, didOutput brightness: Float) { DispatchQueue.main.async { self.currentBrightness brightness switch brightness { case ..0.2: self.brightnessDescription 畫(huà)面過(guò)暗建議增加曝光補(bǔ)償 case 0.2..0.4: self.brightnessDescription 畫(huà)面偏暗可適當(dāng)增加曝光 case 0.4..0.7: self.brightnessDescription 亮度正常無(wú)需調(diào)整 case 0.7..0.9: self.brightnessDescription 畫(huà)面偏亮可適當(dāng)降低曝光 default: self.brightnessDescription 畫(huà)面過(guò)亮建議降低曝光補(bǔ)償 } // 如果有手動(dòng)曝光調(diào)整不自動(dòng)干預(yù) if abs(self.exposureValue) 0.05 { self.autoAdjustExposureIfNeeded(brightness: brightness) } } } func cameraService(_ service: CameraService, didFail error: Error) { DispatchQueue.main.async { self.brightnessDescription 相機(jī)錯(cuò)誤: \(error.localizedDescription) } } private func autoAdjustExposureIfNeeded(brightness: Float) { guard !isUpdatingExposure else { return } isUpdatingExposure true defer { isUpdatingExposure false } let diff targetBrightness - brightness // 只有偏差超過(guò)閾值才調(diào)整避免頻繁抖動(dòng) if abs(diff) 0.1 { let adjustment Double(diff * 2) let newValue max(-8, min(8, exposureValue adjustment)) cameraService.setExposureBias(Float(newValue)) DispatchQueue.main.async { self.exposureValue newValue } } } }代碼說(shuō)明CameraViewModel作為中間層負(fù)責(zé)把CameraService的代理回調(diào)轉(zhuǎn)成 SwiftUI 可觀察的Published屬性。exposureValue被用戶手動(dòng)拖動(dòng)后自動(dòng)曝光調(diào)整會(huì)暫停避免“用戶想調(diào)系統(tǒng)又拉回來(lái)”的沖突。亮度描述文本使用區(qū)間判斷提示用戶當(dāng)前畫(huà)面狀態(tài)。4.6 配置權(quán)限在Info.plist中加入相機(jī)權(quán)限描述keyNSCameraUsageDescription/key stringCamera Sun 需要使用相機(jī)來(lái)分析和調(diào)整拍攝畫(huà)面/string不加這一條應(yīng)用啟動(dòng)相機(jī)采集時(shí)會(huì)直接崩潰。4.7 運(yùn)行驗(yàn)證將上述代碼編譯運(yùn)行到 iPhone 真機(jī)上預(yù)期效果如下啟動(dòng) App 后進(jìn)入自定義相機(jī)預(yù)覽頁(yè)面。預(yù)覽畫(huà)面顯示實(shí)時(shí)取景。頂部亮度指示條根據(jù)畫(huà)面亮度實(shí)時(shí)變化。手動(dòng)拖動(dòng) EV 滑塊后畫(huà)面亮度發(fā)生明顯變化。手指點(diǎn)擊預(yù)覽畫(huà)面任意位置相機(jī)自動(dòng)對(duì)焦并重新測(cè)光。在模擬器上運(yùn)行時(shí)預(yù)覽畫(huà)面可能是黑屏或者顯示模擬器桌面這是因?yàn)槟M器沒(méi)有真實(shí)相機(jī)采集能力。建議盡早使用真機(jī)調(diào)試。5. 常見(jiàn)問(wèn)題與排查思路5.1 相機(jī)權(quán)限彈窗沒(méi)有彈出問(wèn)題現(xiàn)象常見(jiàn)原因解決思路啟動(dòng)后直接崩潰Info.plist 缺少相機(jī)權(quán)限描述檢查NSCameraUsageDescription權(quán)限彈窗彈出后點(diǎn)擊允許仍然黑屏用戶之前選擇了“不允許”需要在系統(tǒng)設(shè)置中開(kāi)啟提示用戶前往系統(tǒng)設(shè)置開(kāi)啟權(quán)限模擬器上沒(méi)有彈窗模擬器不支持真實(shí)相機(jī)使用真機(jī)調(diào)試5.2 預(yù)覽畫(huà)面黑屏問(wèn)題現(xiàn)象常見(jiàn)原因解決思路預(yù)覽全黑但相機(jī)權(quán)限已開(kāi)啟AVCaptureVideoPreviewLayer沒(méi)有正確添加到視圖層級(jí)檢查previewLayer.frame是否更新預(yù)覽區(qū)域黑屏但亮度數(shù)據(jù)有回調(diào)previewLayer被釋放使用強(qiáng)引用保存 previewLayer從后臺(tái)返回后黑屏未在viewWillAppear重新啟動(dòng) session在scenePhase變化時(shí)重新startRunning()5.3 亮度數(shù)據(jù)不刷新如果cameraService(_:didOutput:)一直不回調(diào)優(yōu)先檢查AVCaptureVideoDataOutput是否成功添加到 sessionif session.canAddOutput(videoOutput) { session.addOutput(videoOutput) } else { print(無(wú)法添加 videoDataOutput) }另外AVCaptureVideoDataOutput需要強(qiáng)引用不要聲明為局部變量。5.4 EV 滑塊拖動(dòng)后畫(huà)面沒(méi)有變化可能原因當(dāng)前設(shè)備isExposureTargetBiasSupported為false。設(shè)備沒(méi)有成功lockForConfiguration()。EV 值沒(méi)有落在minExposureTargetBias...maxExposureTargetBias范圍內(nèi)。排查代碼print(曝光補(bǔ)償范圍: \(device.minExposureTargetBias) ~ \(device.maxExposureTargetBias)) print(是否支持曝光補(bǔ)償: \(device.isExposureTargetBiasSupported))5.5 性能問(wèn)題掉幀和發(fā)熱每幀都執(zhí)行CIAreaAverage在真機(jī)上通常不會(huì)有太大壓力但如果你的項(xiàng)目比較復(fù)雜可以考慮以下優(yōu)化方式降低采樣幀率比如每 3 幀計(jì)算一次亮度??s小計(jì)算區(qū)域使用CIImage的cropped(to:)只分析畫(huà)面中心區(qū)域。降低視頻輸出分辨率使用session.sessionPreset .medium。避免在主線程做任何 CoreImage 操作。降低采樣幀率的示例private var frameCount 0 func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { frameCount 1 guard frameCount % 3 0 else { return } // 亮度計(jì)算 }6. 最佳實(shí)踐與工程建議6.1 曝光控制的策略選擇Camera Sun 項(xiàng)目里我把曝光控制做成了兩種模式混合用戶不干預(yù)時(shí)系統(tǒng)根據(jù)亮度信息自動(dòng)調(diào)整 EV。用戶手動(dòng)調(diào)整后以用戶設(shè)置為準(zhǔn)。這種設(shè)計(jì)的核心思路是不跟用戶搶控制權(quán)。原生相機(jī)之所以在一些場(chǎng)景下給人“不聽(tīng)話”的感覺(jué)恰恰是因?yàn)樽詣?dòng)策略太強(qiáng)勢(shì)。在自定義相機(jī)中我們應(yīng)該把自動(dòng)策略看成“默認(rèn)值”而不是“唯一值”。在實(shí)際業(yè)務(wù)中還可以增加一個(gè)“自動(dòng)/手動(dòng)”切換開(kāi)關(guān)讓用戶明確知道當(dāng)前處于哪種模式。6.2 亮度分析的通用性CIAreaAverage計(jì)算的是全畫(huà)面平均亮度但在很多場(chǎng)景下它并不準(zhǔn)確。例如畫(huà)面左邊是太陽(yáng)右邊是陰影平均亮度可能正好落在 0.5。但用戶真正想拍的主體在陰影里需要的是“陰影區(qū)域”的亮度數(shù)據(jù)。更合理的方式是引入?yún)^(qū)域權(quán)重// 只分析畫(huà)面中心 60% 區(qū)域的亮度 let centerRect CGRect(x: extent.width * 0.2, y: extent.height * 0.2, width: extent.width * 0.6, height: extent.height * 0.6) let centerImage ciImage.cropped(to: centerRect)這樣在逆光場(chǎng)景下自動(dòng)曝光會(huì)更偏向畫(huà)面中心的主體。6.3 設(shè)備配置的邊界檢查AVFoundation 的 API 在不同 iOS 版本、不同設(shè)備上有很大差異。比如某些設(shè)備支持builtInDualCamera某些只有builtInWideAngleCamera。不同設(shè)備的minExposureTargetBias和maxExposureTargetBias范圍不同。某些設(shè)備支持autoFocusRangeRestriction某些不支持。所以在做設(shè)備配置時(shí)一定要先查詢能力再設(shè)置屬性if device.isExposurePointOfInterestSupported { device.exposurePointOfInterest point }6.4 線程模型的必要性在CameraService中我使用了三個(gè)隊(duì)列sessionQueue配置會(huì)話、啟停相機(jī)。videoQueue接收視頻幀回調(diào)。主隊(duì)列更新 UI。原因是相機(jī)配置操作耗時(shí)且阻塞不能放在主線程。視頻幀回調(diào)頻率高如果直接在里面更新 UI會(huì)導(dǎo)致卡頓。AVFoundation 的 delegate 回調(diào)不一定在主線程需要手動(dòng)切回主隊(duì)列更新 UI。6.5 內(nèi)存管理與生命周期在視頻幀回調(diào)中CMSampleBuffer和CVPixelBuffer是高頻創(chuàng)建的對(duì)象如果持有引用時(shí)間過(guò)長(zhǎng)內(nèi)存會(huì)快速增長(zhǎng)。建議亮度計(jì)算完成后不要保留CIImage或CVPixelBuffer的強(qiáng)引用。使用autoreleasepool包裹每幀處理邏輯。在 App 進(jìn)入后臺(tái)時(shí)調(diào)用stop()回到前臺(tái)再start()。示例func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) { autoreleasepool { // 幀處理邏輯 } }6.6 權(quán)限處理的工程化真實(shí)項(xiàng)目中相機(jī)權(quán)限不應(yīng)該只在啟動(dòng)時(shí)請(qǐng)求一次。更合理的方式是啟動(dòng)時(shí)檢查授權(quán)狀態(tài)。如果被拒絕在 UI 上展示引導(dǎo)頁(yè)面。引導(dǎo)用戶去系統(tǒng)設(shè)置中開(kāi)啟。從后臺(tái)返回時(shí)重新檢查授權(quán)狀態(tài)。switch AVCaptureDevice.authorizationStatus(for: .video) { case .authorized: // 已有權(quán)限直接啟動(dòng) case .notDetermined: // 請(qǐng)求權(quán)限 AVCaptureDevice.requestAccess(for: .video) { granted in // 處理結(jié)果 } case .denied: // 提示用戶去設(shè)置開(kāi)啟 case .restricted: // 家長(zhǎng)控制等情況 break }6.7 日志與調(diào)試建議相機(jī)模塊涉及硬件交互真機(jī)問(wèn)題往往只能在特定設(shè)備上復(fù)現(xiàn)。建議在關(guān)鍵路徑輸出日志// 設(shè)備信息 print(設(shè)備: \(device.localizedName)) print(曝光范圍: \(device.minExposureTargetBias) ~ \(device.maxExposureTargetBias)) print(當(dāng)前曝光: \(device.exposureTargetBias)) // 會(huì)話狀態(tài) print(session.isRunning: \(session.isRunning))在調(diào)試階段打開(kāi) AVFoundation 的日志會(huì)有大量輸出如果不好定位問(wèn)題可以先加一個(gè)全局日志開(kāi)關(guān)#if DEBUG let isDebugLogEnabled true #else let isDebugLogEnabled false #endif7. 總結(jié)與下一步方向Camera Sun 這個(gè)項(xiàng)目最核心的價(jià)值不是把原生相機(jī)的所有功能重寫一遍而是提供一種思路——在系統(tǒng)相機(jī)覆蓋不到的場(chǎng)景里用 AVFoundation 構(gòu)建更符合特定需求的拍攝工具。本文的示例已經(jīng)覆蓋了自定義相機(jī)采集、實(shí)時(shí)亮度分析、曝光補(bǔ)償調(diào)節(jié)、點(diǎn)測(cè)光對(duì)焦這些關(guān)鍵能力。你在自己的項(xiàng)目里可以直接復(fù)用CameraService和CameraViewModel的代碼結(jié)構(gòu)再根據(jù)需要擴(kuò)展。如果想在這個(gè)基礎(chǔ)上繼續(xù)深入以下幾件事值得優(yōu)先研究第一更精細(xì)的測(cè)光策略。目前的CIAreaAverage是全畫(huà)面平均亮度在復(fù)雜光線場(chǎng)景下不夠準(zhǔn)確??梢詫W(xué)習(xí)一下中心重點(diǎn)測(cè)光和點(diǎn)測(cè)光的算法思路并結(jié)合人臉檢測(cè)、主體識(shí)別來(lái)動(dòng)態(tài)選擇測(cè)光區(qū)域。第二手動(dòng)對(duì)焦與變焦控制。AVFoundation 提供了videoZoomFactor、focusMode、lensPosition等接口可以進(jìn)一步做成專業(yè)相機(jī)應(yīng)用那樣的手動(dòng)模式。第三RAW 格式與照片處理。如果要走專業(yè)方向需要學(xué)習(xí)AVCapturePhotoOutput的 RAW 輸出能力以及如何在拍攝后做 TONE MAPPING。第四視頻拍攝中的實(shí)時(shí)曝光調(diào)整。如果項(xiàng)目需要支持視頻錄制還要考慮曝光調(diào)整過(guò)程中畫(huà)面的平滑過(guò)渡避免錄制過(guò)程中亮度突變。相機(jī)類 App 的開(kāi)發(fā)門檻不在“能不能調(diào)起相機(jī)”而在“能不能把畫(huà)面效果調(diào)到用戶滿意”。希望這篇教程能幫你邁過(guò)第一道坎后續(xù)的優(yōu)化空間還很大。如果你在真機(jī)調(diào)試中遇到其他問(wèn)題歡迎在評(píng)論區(qū)交流討論。把代碼跑起來(lái)然后試著在夕陽(yáng)場(chǎng)景下拍一組對(duì)比照片你會(huì)發(fā)現(xiàn)——原來(lái) iPhone 的自定義相機(jī)比系統(tǒng)相機(jī)的可玩性高得多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
欧美色图色综合| 岛国大片在线观看网站入口| 欲色综合| 97青娱乐超碰久久| 亚洲精品视频在线播放| www.91逼逼.com| 日韩无限资源| 色九九九九九九| 熟女一区二区| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 国产探花精品在线| 99热导航| 日韩人妻无码不卡网站| 免费中文在线| 国产熟女二区| 密桃99999| 欧美三级中文字幕hd| 久久狠狠色噜噜狠狠狠狠97| 亚洲AV在线资源| 91 丝袜在线| 亚洲熟女乱色| 五月丁香网站| 婷婷久热| 欧美精品xxxwww| 欧美性爱第一页久久| 后入合集| 五月天欧美色图| 亚洲中文电影| 丝袜夫妻自拍| 丁香五月天激情| 麻豆国产视频精品观看| 激情久久日韩精品中文字幕麻豆| 国产精品一区二区在钱播放| 久久伊人亚洲AV无码网站| 黄呦呦在线| 操狠狠| 99精品无码| 香蕉免费一区二区三区不读| 97人人爱人人做人人乐| 亚洲91少妇| 亚洲高清无码免费观看视频| 欧美人妻精品一区二区| 久久久久人妻二区精品叶可怜| 欧美人黑A片无码免视费| 久久久久久久久一区二区三区| 日影院久久婷婷夜夜网| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 99后入| 操逼精品视频| 嗯嗯嗯啊啊啊干死我吧| 98福利在线视频| 99精品伊人| 亚洲综合性感在线| 伊人97色天使| 亚洲国产成人高清在线| 黄片不用下载在线观看| 91狼人| 成人乱码一区二区三少妇| 久久青青草原免费视频| 亚洲一区二区三区播放在线| 久久久亚洲| 一本久道久久综合狠狠爱一密臀精| 夜夜综合| 国产免费一区| www.acm成人黄色毛片| 国产第二页| 亚洲天天影视色综合| AV99热18这里只有精品| 内射中国少妇高清视频免费视频 | 第四色奇米影视777| 亚洲欧美第一页| 欧美激情五月天| 手机午夜电影神马久久| 日韩国产欧美伦理在线| 中文字幕精品区先锋资源| 都市久久精品激情亚洲| 人人操人人操人人操人人操人人操人人人11.CM | 蜜臀AV一区二区三区激情综合| 五月丁香啪啪| 天天干天天日天天射黄色| 91丨国产丨白浆| 视频在线观看一二三区| 亚洲AV成人无码久久精品播放| 日韩免费看在线黄色片| 99少妇| 午夜情侣自拍网站| 国产无马在线| 亚洲久9| 东京热综合久久一区二区| 欧美97超碰| 少妇久久久| 女人与公拘交酡2020视频| 日韩无码视频黄色| 国产高清MV操逼视频| 午夜男女爽爽爽在线视频| 亚洲第一页色| 96国产污污污丝袜| 亚洲色婷婷综合久久久久中文| 操熟女91| 亚洲性爱成人| 亚洲成人久久一区二区| 日韩av在线播放不卡| 久久草大香蕉| 亚州综合图片| 91美女在线视频| 观看免费区二区三区二| 东京热一区二区三区四区五区六区| 视频二区美腿丝袜制服人妻欧美| 欧美日韩*字幕一区| 国产女同视频在线播放| 91人人臊| 肉丝网站91| www被窝色com| 欧美亚洲天堂| 无码 黑人一区二区三区| 26uuu国产免费观看| 欧美在线干| 欧美久久草熟女| 婷婷精品国产一区二区三区日韩| 偷拍盗拍亚洲色图图片| 日韩精品免费高清视频在线| 五月丁香久久| 极品久久久久久久久久久久久久| 国产精品夜夜夜| 天美传媒av在线| 呦女网站| 中文AV制服乱伦| 草B在线| 99色网| 亚洲国产精品成人无码久久久 | 97亚洲国产| 青青在线视频日韩欧美| ..日韩av毛片精品久久久| 99色在线视频| 欧美亚洲se91| 日本综合色图| 国产人伦a片信息免费片| 91oumei| 九九夜精品九九在线| 日日骚一区二区三区| 蜜臀99久| 伊人网青青| 亚洲另类小说卡通动漫| 久久香蕉网| 亚洲综合113页| 六月丁丁香| 久久仑合| 毛片99-全集电影手机免费观看完整-B029AV | 中文一区二区三区影院| 国产AV超爽| 中文字幕av久久爽Av| 大色网久久| 收看日本人日bb| 色婷婷五月天| 色一区二区三区综合| 9丨亚洲一区二区在线| 9九九九九视频在线观看| 五月亭亭六月丁香| 冬京热男人的天堂| 九九九九九九综合| 免费一级a毛片久久久久久鸭绿欲| 中文字幕久久精视频久久大全| 91色爽欧美| 日韩无码第3页| 国产精品亚洲一级av第二区| 日本免费不卡二区| 亚洲丝袜综合| 亚洲婷婷五月天| 亚洲清纯唯美| 国产女人和拘做爰视频 | 国产AV色黄看到爽| 精品射1999| 91丰满| 色官网在线| 1204金沙人妻懂旧版免费| 夜草网站| 精品人妻1237| 欧美97爱| 亚洲激情网一二三四区| 天天操福利视频综合网站| 香蕉久久AⅤ...| 97欧美精品综合| 日本一区二区中文字幕久久| 99只有精品| 综合亚州欧美| 久久九九视频九九视频| 91麻豆天美传媒HD| 国产精品又黄又猛又粗| 人妻日日夜夜精品| 国产强奸乱伦第1页| AA丁香综合激情| 人妻少妇精品无码专区二区密桃| 99精品欧美一区二区三区桃色| 精品免费国产二区三区| 69少妇一区二区| 天天日天天舔东京热| A 天堂| 精品久久久av| 操逼视频国产无套| 另类综合另类| 中文字幕丰满人妻日本| 久久久久久亚洲精品中文字幕人妻| 97在线视频免费看| 久操热| 91n处女在线观看| www.色婷婷色综合| 69精品| 天天看综合网| 美国日韩黄片| 99青青草国产视频| www国产天美久久久| 伊人在线大香蕉二。| 午夜福利免费精品视频| 91男人综合| 婷婷五月花| 久久久久久久9| 五月婷婷大香蕉| 亚洲欧美清纯| 无码99| 日韩熟女无码| 在线情色电影 91大| 日韩欧美午夜视频在线| 欧美日综合| 无码色| 清纯唯美亚洲| 2017大香蕉国产精品久久| 国产精品一区二区亚洲人成毛片| 桃色人妻在线视频| 亚洲黄网在哪免费看| 久久精品99| 亚洲无码AV九九九| 97久久超碰亚洲| 欧美一级三级| 无码高清少妇久久| 亚洲交换| 爱干爱射网啊啊啊| 韩国一级做A片免费的| 日本国产二线女色| 欧美日不卡| yw尤物av无码点击进入麻豆| 日本黄色天堂| 女人爽到高潮久久久| 亚洲AV麻豆Aⅴ无码电影一| 欲射影视| 蜜臀少妇一区二区| 国产精品久久久久无码A√| 好一吊区二区| 神马久久久久眼| 国产精品国产自产高清AV| 色偷偷2020免费视频播放| 天美av在线观看| 国内偷自视频区视频综合| 9ⅰ久久久天天| 日韩人妻少妇中文字幕| 黑人狂躁日本妞一区二区三区| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 资源新线在线天堂| 欧美美女在线高潮999| 黄色片大香蕉| 熟女探花啪啪| 97操综合| 欧美aⅴ99久久黑人专区| 热九九精品| 很很操在线| 超碰无码五月97| 蜜臀国产AV中文字幕| 成人一级性爱| 天美传媒AV在线播放| 亚洲的天堂网| 午夜呻吟欧美| 久草视频分类在线| 无码精品久久| 天天欲望网| 日日夜夜青青草母狗| 欧美性爱系列| 黄色大片免费在线| 久久久久久综合久久伊人蜜月| 青久操| 屌逼传媒| 日本欧美一区二区三区免费| 四虎国产精品永久在线囯在线| 90后后入| 欲香欲色天天天综合和网| 天天色播| 一区二区三区免费岛国片| aa片毛片| 天天射天天色成人| 97资源免费视频| 国产视频三区四区| 五月丁香色情| 97人妻免费中文字幕| 国产熟妇 码视频户外直播| 日韩青久久| 黄色十八禁网站| 国产亲戚伦亲在线| 亚洲av综合伊人久久| 人人澡人人干| 中文字幕免费看| 中文97国产| 日日夜夜天天| 色婷婷丁香五月| 天天激情干| 中文字幕国产在线天堂| 啪啪自拍九九综合| 日本道人妻久久久在线不卡色视频| 试看福利| 久久蜜色情在线视频xxx免费观看| 大稥蕉免费视频这里只有精品| 久久久久国产精品片区无码直播 | www.久久99| 亚洲人妻中文高清| 人人操人人摸人人看人人干| 免费中文综合精品| 久久久97| 人妻激情视频| 中出20p| 啊啊啊啊啊好舒服视频| 97精品综合久久网| 99抽插| 日韩久久超碰色| 久久天天摸| 五月综合激情| www.99视频| 中文自拍欧美影视| 精品一二三区久久AAA片| 2020中文在线一区二区三区| 亚洲国产一区二区入口| 九色精品视频导航1| 久热在线精品免费观看| 家庭乱伦国产| 无码精品一区二区三区潘金莲| 国产成人欧美一区二区三区的国产| 精品无码一区二区三区| 激情小说图片亚洲首页| 超碰午夜| 伊人一区二区在线播放| 在线播放成人高清免费视频| 久久精品久久久久久久久| 亚洲啪啪视频免费| 91视频伊人| 蜜臀久久99精品久久久久| 日骚逼视频| 日日操夜夜操天天操免费观看麻豆| 欧美情色亚洲| 欧美天天综合网版| 69精品| 亚洲天堂男人天堂| 91人妻人人澡人人爽人人精品| 88xx成人精品视频| 国产乱伦性爱区| 女人与公拘交酡2020视频| 97精品国产| 91内射| 家庭乱伦麻豆| 欧美亚洲一级在线观看| 日日噜噜夜夜狠狠视频无| 第四色奇米影视777| 国产一区二区三区免费视频在性观看| 久久五十路熟女人妻| 欧美日韩操逼动图| 五月婷婷久久综合| 国产欧美日韩在线观看麻豆传媒公司| 蜜臀在线免费观看在线免费观看| 一二三四视频在线社区中文字幕| 日韩综合色网| 成人性交免费视屏| 久艾草在线精品视频在线观看| 亚洲日本激情| 搡老女人老妇女AAA一VU麻豆| 亚洲二区精品在线观看| 免费一级视频特黄色大片| 日本三级黄页| 人人妻人人色| 中文字幕午夜精品久久久| 九九精品网| 天天日天天干少妇日| 欧美性爽xyxOOOO| 色欲av一区二区三区蜜芽| 一区二区三区 日韩欧美| 国产激情片在线观看| 五月丁香成人网| 国产精品91一样| 色爱欲亚洲| 2000亚洲男人天堂| 久久久免费高清中文视频| 97超碰中文在线| 日韩中文字幕视频| 人人天天干干| 久99久视频精选| 粉嫩少妇自慰在线| 午夜视频久久久| 久久久久少妇| 日韩人妻中文视频| 日韩有码一区三区| ai欧美亚洲小说| 97操B| 亚洲精品自拍| 成人免费福利在线观看| 狼天天狼天天大香蕉| 精久久久91| 老司机午夜福利视频一区二区| 亚洲综合伊人无码久久| 国产强奸91| 欧美性生活综合| 熟女天天干| 美女91网| 都市久久精品激情亚洲| 激情综合五月婷婷| 天天插夜夜爽| 天天看天天日天天操| 插日本熟女视频| 欧美美女啪啪视频| 天天碰操中国年青熟妇| 天天射天天色成人| 国产亚洲性生活视频播放| 色综合久久久久| 中文字幕人妻色偷偷久久皮| 久热伊人| 久操网线| 欧色综合| 91性感在线| 亞洲久久直播| 青青草在线视频欧美| 99re视频在线播放青草| 在线国产福利网址导航| 欧美最婬乱婬爆婬性视频| 老鸭窝在线视频播放| yiqicaoav| www.伪伪| AV高清一区| 青青草导航在线视频| 人人摸人人入| 欧美精品99久久久| 久热大香蕉网站| 中文字幕av亚洲精品| 国产亚洲在线| 风月影院男女十八禁| 亚洲成人精品在线一区| 东北女人av| 91天天综合在线观看| 91操熟女| 欧美少妇熟女| 加勒比色99999| 美女熟妇色| 天天综合色电影| 天天日天天干天天摸天天操| 亚洲成人在线高清| Av色五月| 久久中文字幕在线观看| 国产亚洲禁久一区二区| 日日骚精品视频| 欧美一级美片在线观看免费| 乱日视频| 青青草好吊色| 1024日韩| 麻豆天天躁天天揉揉AV| 免费强奸av| 丝袜翘臀后入欧美校园亚洲自拍另类小说一区中文字幕少妇诱惑 | 国模吧 一区二区三区| 97超碰久久色| 九色精品视频导航1| AV高清一区| 天美精品原创av片国产| 色999人与兽| 夜夜欢天天干| 六月天婷婷| 欧美性第1页| www网站黄| 蜜桃臀一区二区aV | 男人天堂无码| 人人操人人摸人| 一区二区三区色综合| 高清无码一区二区三区| 亚洲五区熟女| AAAA级日本片免费视频| 天天摸,夜夜摸| 91热热色| 欧美在线视频99| 青青草五月份天| 国产欧美一区激情交| 精品国产乱码久久久影院| 亚洲国产成人高清在线| 91精品91久久久久77777| www成人啪啪18秘 免费| 亚洲欧美综合网| 国产精品电影| 91 丝袜在线播放| 天天综合网国产| 夜夜骑夜夜操| 亚洲综合小视频小说在线观看| 边做饭边操逼逼| 男人的天堂.com| 亚洲国产成人精品久久久国产成人一区二区| 野狼激情网| 欧美精品久久96人妻无码| 黑人天8A∨高清网站| 91美女视频直播| 六月丁香啪啪啪| 国产精品乱码久久久| 亚州伊人色综台| 欧美v日韩v亚洲v最新在线| 三级片大波波| 天天艹天天日| 久男人久久| 99人人干| 日韩欧美亚洲自拍偷拍| 超碰1024久久| 久久久久久国产精品免费网站| 超碰是碰在线观看| 99精品在线| 国产精品白丝| 国产精品丝袜久久亚洲不卡| 日韩中文字幕在线视频观看| 亚洲欧美骚| 久草久热| 探花一区二区三| 亚洲乱熟女一区二区| 丁香激情五月天| 久久久久久网址| 伦理弟一页| 手机看av网站在线看| 酒色综合网| 国产精品 午夜福利| 亚欧无码在线| 91爱| 亚洲欧美精品久| 黄色av一区二区在线| 国产后入| 超碰无码五月97| 日韩三级一区| 国产一区二区三区免费视频在性观看| 亚洲色9| 一区二区三区精品视频| 九九九色| 精人妻无码一区二区三区伊人直播| 日日夜夜天天| 人人操肉肉| 99re28在线观看| 国产精品久久久久久夜夜夜| 人、人、摸,人、人、草| 视频不卡中文字幕| 狠色婷婷久久一区二区三区_| 99久久9| 亚洲av国产av综合av卡| 午夜操一视频一区| 国产精品久久久久久久久久久久久久久久久久 | 一本一道vs波多野结衣| 人人操欧美风骚| 91天天c| 天天操天天插| 狼狼色丁香久久婷婷综合五月| 伊人97| 熟女欧美日韩综合婷婷| 8050无码八戒| 一区二区三区免费视频入口| av天堂加勒比| 日韩电影天堂视频二区三区| 国产91美女高潮| 久久久久久久国产视频| 久久产精品一区二区三区电影| 人妻美腿丝袜日韩| 美女97超碰| 九九热超碰| 中国国产精品一区视频| 99少妇精品视频| 亚洲国成人情色好看电影| 国产91av在线播放| 亚洲啪啪啪啪视香蕉| www.超碰| 亚洲国产精品有声| 97爱综合| 啊啊啊久久久视频| 成人影 天天操 亚洲| 日韩性爱高清免费视频| 大香蕉视频一二三区| 日本久久超碰| 热热色青青草| 青青欧洲黑| 夜夜操天天肏| 精品一区二区三区蜜桃臀赵总 | AV99热18这里只有精品| 99999精品视频| 亚洲精品亚洲人成人网| 国产精品一区二区三区,亚洲综合 性开放中文AV高清无码免费看 | 亚洲天堂男| 国产精品69久久久久孕妇欧美 | 曰本精品久久久| 一区在线观看中文字幕| 自拍视频一区在线观看| 自拍偷拍第26| 国产视频人人网| 日韩久射综合| 91无码人妻| 日韩欧美偷拍美女视频| 99天天超碰| 91精品国产综合久久久蜜臀| 狠狠干,狠狠操| 国产人妻天天干精品| 中文字幕丝袜国产第一页不卡| 精品人妻一区二区三区在| 黄页网站成人免费| 国产精品动态一区二区三区四四| 亚洲综合贴图91 | 九九九九一区| 欧美96交| 大香蕉综合在线| 久草毛片电影怡| 欧美色图亚州激情| 日韩美女久久一区二区三区| 蜜臀久久99精品久久久久久久久| 婷婷香蕉| 免费黄色视频网址| 我要看免费韩日黄片| 成人福利视频网| 色乱二区| 亚欧高清在线| 思思热免费视频观看| 日韩精品国产一区二区| 免费观看国产小粉嫩喷水精品午| 久久男人精品| 成全在线观看免费观看| 国产啊v在线免费播放| 麻花豆传媒剧国产MV出差| 吖在线不卡一区二区国产剧情| 中文字幕五月婷婷免费| 新久久AV| 亚洲啪啪视频一区二区| 国产92麻豆天美精品色欲5| 日本一区二区做爱的视频| 欧美日本中字另类在线| 国产高清成人mv在线观看| 男人高清无码一区二区| 成人网站 免费观看| 日本亚洲熟女视频| 婷婷综合激情| 亚洲精品一区中文字幕乱码| 混色激情av| 啊啊啊啊啊操我视频| 亚洲情色一区三区| 国产传媒美日韩av| 狠狠搞 亚洲91| 97精品国产手机| 亚洲色图美腿丝袜| 超碰到97情色| 婷婷丁香人妻 | 欧美午夜色妇色鬼| 国产精品久久久蜜臀| 欧美熟女妇同| 久久久成人免费av电影| JuliaAnnXXX888| 亚洲久久久久| 人妻干天天| 女人 A一级| 免费一级视频特黄色大片| 国产精品久久成人免费| 色色99| 色女综合| 蜜桃狠狠色伊人亚洲综合| 久久线上视频免费看| 91在线视频国产网站| AV天堂国产| 欧美久久伊人| 日本色色网| 香蕉综合网| 97WW精品| 青青草成人视频在线观看二区| 日韩欧美天堂| 亚洲极品| 啊啊啊想要| 欧美黄色大片在线观看 | 天天天干977| 中文字幕后石码三区四区| 国产一级舔足在线观看| 天天操夜夜嗨| 欧美日韩操逼嗦吊| 五月丁香| 欧美色图中文字幕| 视频二区熟女人妻| 青青青在线高清视频在线一二三四区| 欧美懂色综合网| 国产成人午夜视频网址| 婷婷五月在线视频| 超碰 av 女人天堂| 人妻夜爽夜夜爽| 中文乱码字字幕在线第5页| 免费作爱一级视频| 久久久999日本大片| 91爱看| 天天日夜干| 欧美老妇曰批的视频| 91在线无码精品秘 软件| 久久9久9久99久9久9| 成人精品水蜜桃久久久久久久| 久久一区二区三区四区五区| 久久久久久久亚洲Av无码| 亚洲天堂区| 欧美熟女丝袜| 97久久超碰| 欧美亚洲尤物久久| 中文啪啪视频| 熟女91网| 牛牛操视频逼| 爽爽淫人网| 青青草玖玖爱| 日韩国产精品人妻无码久久久| 亚洲色图欧美视频| 亚洲色图a| 男人天堂2019| 色情乱伦AV| 91狠狠综合久久久久久| 日本熟妇自慰性高潮一区二区三区| 欧美欧美啪啪视频| 丁香五月成人| 91在线国产后入风骚翘臀美女素人| a片久久久久久久久久久久 | 偷窥自拍亚洲色图| 91欧洲入口| 秋霞免费无码视频日韩A片| 97色色婷婷| 精品网站99999| 中国人高清www色视频免费| 91操人| 久久久久久九九九九-美女久久久久久久-成人AV | 人妻丰满熟妇一区二区三| 男人的天堂2019AV| 日韩欧美久久婷婷网站| 国产一区二区免费福利片| 久久草草欧美精品| 玖玖综合视频| 黄色操人| 啪啪视频mP4| 精产品久久| 尤物一级在线免费观看| 国产熟女二区| 岛国片在线视频网站| 婷婷四五区| 国产成人五月天丁香花| 亚洲福利中文字幕在线| 超碰97欧美日韩| 亚洲人妻在线一区| 丁香激情五月| 欧美日韩国产精品久久色婷婷| 激情网色| 青青草色插素人| 天堂无码| 天天狠| 97视频播放| 国产欧美亚洲精品a第2页| 裸体美女久久久| 亚洲 小说 欧美 激情 另类| 暖暖精品二区三区观看| 欧美AB在线| 五月天婷婷激情| 人人澡人人干| 婷婷色婷婷| 男生通女生屁股| 国产粉嫩出水在线播放| 九九九九九九九九九九九蜜桃| 国产一区二区三区视频在线看| 日韩在线人妻网站| 日韩欧美大片免费高清啪啪| 精品久久99| 啊啊啊好多水| 97网址www| 91香蕉国产尤物视频| 精品久久青青草| 91亚洲高清| 少妇超碰在线| 黄页av| 免费观看欧美日韩操逼视频| 欧美综合网A| 久久久无码国精品无码三区三区| 欧美淫乱视频| 欧美性爱在线无码| 国产乱码久久久| 综合激情婷婷| 亚洲色电影在线| 啊啊啊不要好疼视频| 亚洲激情综合另类| 婷婷五月天基地| 欧美东京热青青草| 操少妇很爽av| 亚洲一区日韩精品| 91九九九小逼| 永久免费av无码网站国产app| 欧美婷婷久久| 中文字幕一区二区免费在线| 使劲用力艹少妇视频一区二区| 日韩免费在线观看不卡| 在现视频女上位好爽| 日本αv| 色大香蕉97N| 26uuu国产成人综合| 操死我了啊啊啊| 国产精品视频精品一二| 久久精品视频一区三区小泽玛利亚| 国产乱人伦AVA麻豆软件.| 婷婷激情五月综合| 99热这里只有精| 国产精品久久久啊| 国产丰满少妇久久久精品影院| 18禁的网站在线| 久久久内射良家| 99热精品在线| 精品人妻一区二区三区四区不卡在| 人人爽夜夜操| 日本东京热加勒比久久| 精品国产综合久久福利,热99这里有精品综合久久,99热这里只有免费国产精品,精 | 亚州精人品大香蕉| 成人羞羞视频国产| 操人妻逼91| 在线无码操| 欧洲亚洲人妻无码高清久久三区四区| 丁香婷婷久久| 久久久久久久免费A片国产成a人亚洲精∨品无码 | 午夜天天碰综合视频| 伊人专区一区二区三区| 久久久精品视频欧州站| 夜色五月天| 99久久久无码精品国产人| 密臀国产在线| 人妻碰碰碰碰碰碰| 无码人妻一区二区三区免费九色| 青青草日本中文字幕| 亚洲成人久久美女| 日本操逼视频免费| 超碰在线97国产| 91艹B视频| 99re欧美| 超碰97最新人妻| 五月激情视频| 国产视频一区二区三区在线免费观看 | 成人一二三区| 亚洲男人天堂网久久| 丁香五月综合| 亚洲欧美综合| 日本一区二区三区精品| 91强热人妻| 久操视频在线观看| 天天色踪合| 999日韩中文精品观看视频。| 操逼国产免费| 久久久无码视频| 欧美在线色| 九九这里只有精品| 亚洲精美粉嫩嫩泬在线观看 | 热99re69精品8在线播放| 玖玖资源中文字幕制服丝袜| 99色在线| 97欧美性爱| 东北少妇高潮zzzz| 99这里只有精品| 九九十八精品| 99热这里是精品| 乱性AV| 九九九九精品在线| 今日头条成人一区二区三区四虎精品 | 成人精品久久| 国内精品久久国产,www香蕉久久五月丁香,亚洲欧美日韩精品永久在线,日本精品一 | 国产精品一区二区三区四区五区| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 国产AV毛片| 女人天堂av在线播放| 大干人妻| 精品一久久久| 色欲天天综合网| 亚洲91在线播放影院| 日韩一二三区| 免费亚洲国产精品久久一区| 亚洲色图 欧美热图 清纯唯美 另类自拍 | 亚洲熟妇自偷自拍另欧美| 无码WWW免费视频网站| a片在线播放| 友优传媒精品在线一区二区| 91 国产丝袜在线播放-百度| 亚洲综合影片| 99亚亚热| 粉嫩不卡一区二区性爱| 成人AV超碰免费在线| 热99re69精品8在线播放| 91熟女视频网| 亚洲鸥美色图| 久久、1234| 91九九九馒头| 久久久久久午夜男人的天堂| 免费看久久久性性| 亚洲国产ⅴ高清在线观看| 农村女一级毛卡片| 欧美综合色| 欧美在线视频播放| 九久久九精品视频| 欧亚在线视频| 国产69精品久久久久99尤物| 亚洲无码国产精品久久| se..亚洲欧美| 熟妇人妻精品一区二区| 中日992视频| 精品二区三四区五电影| 亚洲人码13| 国产欧美成人精品| 久久爽爽精品| 久久夜夜夜夜| 天天爽夜夜欢视| 日本三级韩三级99久久| 久热99| 另类在线| 久久久久亚洲Aⅴ无码| 97精品熟女少妇一区| 秋霞成人做爱| 777琪琪午夜免费A片| 国产精品美女| 亚洲毛片基地专区| 精品999一区二区| 九九热九九| 欧美 亚洲 在线| 天天肏天天干| 爱爱啊啊啊| 91精品国产91熟女| 亚洲综合伊人无码久久| 肥佬影院91| 99re黄| 麻豆AV一区二区天美传媒| 久久久极品| 外国免费性情大片| 国产白丝AV| 欧美九九九| 亚洲人妻爽爽爽| 亚洲毛片基地专区| 91国模| 精品无码秘 人妻一区二区| 国产精品人妻无码久久久互動交流 | 欧差乱伦二三| 亚洲欧洲日本精品中文a∨| 国产久久免费精品视频| 国产女同视频在线播放| 国产曰批免费观看久久久| 亚洲精品第一| 日韩AV熟女乱伦| 五月婷在线| baisiav| 亚洲 欧美 91| 日韩影片中文字幕一区二区三区| 婷婷五月天久久精品视频一区二区三区| 亚洲精品天天影视综合网| 婷婷伊人一区| 中文在线久久字幕| 成人精品一区二区三区| 中文字幕女同在线| 中文字幕、久久精品国产2020、久久综合久久自在自线精品自、亚洲 | 欧美视频在线第3页| 黑丝内射一区二区三区| 1024久久高清视频| 国产一区麻豆免费观看| 91日产欧美| 美女网站黄页| 91亚洲网站| 久久狠狠色噜噜狠狠狠狠97| 飘花国产午夜精品不卡| 操我无码| 伊人AAA| 欧美 亚洲 大香| av东京热男人的天堂| 加勒比东京热五月天天堂网| 精品二区三四区五电影| 屁股久久久久久| 少妇厨房愉情理伦片bd在线观看| 黄在线| www.久久爱| 人妻在线中出视频| h色99999| 国产精品久久泡妞网站| 囯产精品久久久久久久久久梁医生| 国产精品露脸在线观看| 自拍大香蕉乱插| 五月天激情国产综合婷婷婷| 99爱久久视频频| 欧亚揄拍偷拍精品视频| 欧美色综合网| 欧美性爱第一页久久| 亚洲偷拍自拍在线视频| 思思热免费在线视频| 亚洲欧洲日韩国产自在线| 偷拍 精品另类 凸凹了四区| 鸥美插入视频| 亚洲狠狠入| 欧美性第一页| 日本操嫩b网| 人妻加勒比东京热| 久干网| 91熟女网| 九九九热| 黄色欧美性爱视频| 久久久九九网站| 欧美日日网| 超碰久在线天天做| 亚洲欧美首页| 熟女精品va中文字幕| 啊a一区在线| 狠狠干2020| 亚洲欧美伦综合| 免费黄色片。| 五月丁香影院| 粉嫩小泬久久久一区二区| 职场同事知名国产国产精品久久欧美日韩| 一区二区无码视频| 欧美日韩另类在线播放| 五月天婷婷小说| 日日夜夜骚| 情色大香蕉| 另类图片欧美激情综合| 国产一级片| 欧美 日韩 婷婷 五月| 夜夜爽夜夜操| 国产三区免费在线观看| 久久免费看高潮毛片韩国| 亚洲黄色电影| 久操网址| 色色无码| 亚洲日韩黑丝| 久久亚州精品成人Av无| 99精品网| 人妻无码一区二区三区久久99| 久久九九97| 国产福利在线视频网站| 久久精彩视频9| 999热日韩精品| 91深夜夜| 人妻精品综合中文字幕在线 | 96精品在线| 九九人妻| 人人操我人人干| 3571色综合一区二区二区| 福利大香蕉| 成人无遮挡毛片免费看| 精品一区二区三区蜜桃臀赵总 | 亚洲国产熟妇综合色专区| 亚洲av乱伦色图网站| 欧美se亚洲| 视频不卡中文字幕| 婷婷六月色开| 国产精品在线一区二区| 无码区蜜乳| 免费观看有码高清视频| 综合熟妇一区二区三区| A一区片| 日韩丝袜人妻AV| 超碰久超碰久| 岛国精品视频在线观看| 偷拍色图| 中文字幕五月婷婷免费| 91粉芽高清在线一区二区| 欧美黑人168页欧美黑人167| 一区二区三区黄色片a| 91色黑人少妇| 久操视频在线观看| 99欧美| 四虎精品亚洲| 亚洲密乳AV| 亚洲第一页欧美| 国产农村妇女精品| 伊人五月天| 夜夜夜爽www精品视频| 蜜乳AV一区| 性色av一区二区| 极品欧美一区二区三区| 800zy一区二区| 少妇色| av优播| 在线视频97| 色妺妺在线视频| 一区二区影视| 色婷婷丁香五月| 亚洲无码一区成人免费午夜 | 欧美人人AAA| 国产中午字一暮区| 无码乱人伦中文视频| 91处女在线视频| 性开放中文AV高清无码免费看| 97bbn| www.91逼逼.com| 99操| 亚洲天天做日日做天天谢日日| 精品一区二区啪啪啪| 97亚洲精品超碰| 久久99网站| 99999国产| 超碰人人妻| 国产色产精品在线观看 | 亚洲日本加勒比在线| 午夜爽爽爽| 狠狠爱综合| 久久99国产精品| 性色一线| 欧美乱伦专区| 国产一级久久久| 久操91视频| 四虎免费看黄| 亚洲欧洲精品视频发布| 偷拍片久久| 俺去俺来也在线www| 久久风骚城市人| www.色婷婷| 神马久久久久久| 欧美日韩黄色片一区二区三区四区人与兽做爱| 综合亚洲欧美精品日韩?v| 91暧暧| 久久亚洲欧美中文字幕国语| 大香蕉92| 久操网无码在线| 伊人久久亚洲色欲综合网站| 亚洲成人久久美女| 大香蕉狠狠爱| 色噜噜人妻av 中文字幕| 精品国产一区二区三区在线播出| 精品一国2| 日日碰狠狠添天天爽超| 精品亚洲俞拍视频一区| 久久久蜜桃臀无码视频| 激情婷婷五月天| 另类图片综合| 久草婷婷| 蜜乳AV.COM| 九九九九一级| 婷婷五月色| 人妻精品一区二区三区| 97色插| 爽极品影院| 中文字幕欧美精品亚洲日韩蜜臀| 大香樵伊人网| 天天综合网日韩| 热久久99999| 18禁超污无遮挡无码免费网| 亚洲美女精品九九视频| 青青草十区九区爱夜| 美女写真| 成人性交免费视频| 色女99一级片在线观看| 无码逼| 精品人妻丰满熟妇一区二区三| 国产亚洲国产超碰| 精品人妻一区二区三区日产| 国产极品久久久| 蜜臀AV网站| 91视频综合网| 久久久久久夜夜夜夜夜| 综合网欧美| 啊啊啊好舒服视频在线观看| 综合欧美日本三级| 狠狠干91| 欧美伦乱爱| 99久久99九九99九九九| 亚洲中字幕日本一区二区三区| 97精品久久久久中文字幕| 丁香五月成人| 亚洲精品乱码线路中文字幕| 成人久久久精品| 国产av白丝| 亚洲国产精品成人无码久久久 | 欧美欲色| 久久久精品成人国产|