国产成人欧美一区二区三区vr_久久国产精品人人爽人人爽_国产精品永久免费播放_肉欲啪啪a∨无码精品一区二区_国产超短裙jk丝袜在线_亚洲AV片高清资源在线观看_国模无码一区二区三区久久_国产成年人未进视频_中文字幕无码精品夜_一区二区三区在线视频免费看_亚洲成AV人片在线观看网址_日本激情视频高清综合久久_亚洲午夜视频福利_国内大量揄拍人妻精品視_久久国产精品福利二区三区

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
返回資訊列表
黄色网址在线免费观看| www.久久超碰| 18禁中文字幕| 69视频入口| 九九人妻| 天天弄欧美| 中文字幕亚洲在线一区| 国产强奸乱伦xd| 抽插一区二区视频| 97欧美色| 日本不卡中文| 欧美色九九| 亚洲欧美一区二区不卡视频播放 | 五月天久久婷婷亚洲 | 老女人碰碰在线碰碰视频| 婷婷色影院| 一个国产在线综合网站| 精品人妻一区二区免费蜜桃视频| 老司机午夜精品福利视频一区二区 | 日韩性爱网址| 无套内射人妻在线播放| 欧美一区二区日韩三区| 99精品国产户外露出| 国产AV天美传媒一区二区三区 | 久久狠狠色噜噜狠狠狠狠97| 啊啊啊啊,啊啊好多水| 精品人妻无码一区二区三区不卡-精品人妻无码一区二区...|精品少妇一区二区三 | 成人色女网| 精精夜夜| 99热综合| 操狠狠| 亚洲精品日韩国产欧美| 欧美亚洲中文字幕| 香蕉久久国产AV一区二区| 多毛小伙内射老太婆| 国产无吗在线播放| 襙一襙| 青青色在线观看| 国产精品网址| 亚洲无码com| 久久九色| 欧美性爱精品七区| 乱欲一区二区| 91九色在线| 99热超碰| 无码视频一区二区| 欧美大战久久久伊人| 青青草久久一区网| 最新精品久久蜜桃| 91制服丝袜| 激情欧美97| 青青草原av| 青娱乐91| 亚洲中文日韩欧美大香蕉视频| 国产成人拍国产亚洲精品| 久久久久亚洲熟妇熟女| 欧美黄片免费在线观看视频| 久久丁香五月婷婷| 黑丝91视频| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 日日噜噜夜夜久久亚洲一区二区| 亚洲无码超碰免费| 国产精品999zyz| 中文字幕国产| 国产人妻天天干精品| 中文字幕av乱伦| 人人操av| 91老熟女老女人国产老太| 色老牛| 91天美免费| 欧美性爱第1 页| AV和黑人在线播放| 亚洲免费人妻在| 成人日韩欧美| 91最新综合| 男人天堂 天天射| 青青久草| 翔田千里AⅤHD无码| 成人网站 免费观看| 亚洲成人在线播放| 欧美 牲| 日韩人人精品| 370p日韩欧美亚洲精品| 超碰91在线| 啊啊好多水| 干b网| 欧美极品| 日韩不卡av一二三| 欧美亚洲se91| 国产超碰AV在线精品| 蜜乳av首页| 97视频620| 香蕉99秘 一区精品蜜桃臀| 成人五月天丁香激情综合| av最新免费中文字幕| 天天爽夜夜操| 伊人久久亚洲色欲综合网站 | 美女网站91| 超97在线精品视频| 国产精品亚洲四五区在线观看| 久久九九热| 啪啪啪精品| 中文高清一区二区的| 综合九九| 日韩性爱网址| 亚州九九九精品视频| 亚洲男人天堂AV| 国产人妻天天干精品| 99视频内射三四| 亚洲欧美天堂| 五月天丁香网| 久久久涩| 欧美日韩一区二区三区四区蜜桃| 国产精品久久久久久久久久久久久久久久| 中国AAAAAA黄色片| 久久综合av| 无码精品啪啪啪一区二区三区三州| 精品一区二区成人动漫| 亚州男人天堂| 亚洲情色1区| 九久9精品| 婷婷五月天福利| 性感美女91影视| 国岛片视频| 亚洲熟久久| 中文字幕一区二区三区高清| 97精品第3页| 亚洲 中文字幕 精品| 亚州色站 日韩电影| 人妻9117c| 亚洲情色第一页| 精品91| 天天插夜夜操| 亚洲天堂情色| 欧美人人AAA| 91麻豆天美国产欧美高潮| 日本视频一区二区三区| 天天操天天日天天干| 亚欧成人综合影院| 色欧美色交综合| 色色激情| 农村少妇久久久久久久| 91九色网| 国产一国产一级毛片古装| 91色情黑丝搞鸡在线观看一区二区三区三州| 舔人妻中文免费视频| 日韩九区| 老司机天天操| 欧美男人一区| 自拍欧美| 人人摸人人叼| 无码动漫av中文字幕| 91电影色诱| 狠久久| 国产精品99久久久www| 茄子社区国产精品| 美女露胸露尿口| 嫩草美女久久| 大香蕉视频啪啪啪啪| 欧美亚洲综合色| 日韩黄色片子| 亚州黄站| 久久色一区二区| 中国探花熟女| 高清国产无码av| 蜜桃色院一区久久| 亚洲丝袜色| 熟女激情综合网| 自拍啪啪视频| 人妻 欧美 中文| 黄片直播三级黄片两女一男| 欧美1区二区三区公司| 好爽要喷了| 116美女午夜| 欧美老妇曰批的视频| 天天射天天色成人| 色哟哟av网址| 国产传媒1234区| 综合激情婷婷| 国模少妇一区二区三区| 中文字幕一区二区三区蜜桃视频| 综合夜夜| 日韩欧美午夜视频在线| 国产精品久久| 色妇综合网| 疯操AV| 大香伊人在线一区| 囯产精品一区二区三区线|亚洲人成无码网WWW动漫|国产精品免费一级... | 婷婷综合五月天| 丰满岳乱妇一区二区三区| 日韩欧美加勒比| 久久日韩精品一区二区| 日本韩国国产精品一区| 97精| 经典丝袜一区| 日夜精品| 久草视频观看视频在线| 五十路人妻在线| 美女淫穴| 天天看特黄的免费网站| 综合网久久| 粘花网06av视频| 97干日韩| 东北夫妻性偷拍| 九九碰九九爱97| 在线观看av区| 国产精品一二三免费网站| 亚洲成人美女无吗| 在线观看精品国产免费| 天天干18禁| 五月天婷婷在线看| 97在线免费| 日韩Va亚洲va欧美Ⅴa久久| 亚洲成人福利电影免费| 热99这里只有精品| 天天爽天天| 中文字幕jul-617人妻熟女| 最好看的中文字幕在线2018| 免费公开人人操| 久久黄色视频一区二区三区| 色yeye成人免费视频| 91精品国产日韩欧美综合| 国产家庭乱伦性爱视频| 一级A啪啪啪啪| 国产女性无套 免费观看| 乱欲一区二区| 激情五月天色播| 九九色热| 精品国产自在在线99| 操香逼| 嗯嗯啊啊视频一区二区三区| 蜜桃在线观看一区二区三区 | 天堂亚洲精品久久老牛| 欧美日韩亚洲国产中文永久天天看| 亚洲素人综合| 精品女同一区| 中英熟女操女| 国产美女口爆吞精| 女人 A一级| 大香蕉碰碰| 久久精品免视看国产成人﹣蜜臀av一区. 久久精品免视看国产成人,蜜臀av一区 | 欧美综合色,www| 日本国产亚洲一区在线观看| 亚洲欧美91| 亚洲天堂男| 一级性爱视频免费观看 | 天美久久久久| 男人在线天堂| 午夜电影在线观看无码专区| 99精品久久| 青娱乐导航AV| 啊啊啊好疼| 91熟女视频网| 一本精品日本在线视频精品| 久久草在线综合视频| 神马精品视频| 蜜臀一二三| 欧美日本成人一区二区| 欧美疯狂做爰xxxx| 欧美 牲| 国产夫妻性生活视频| 久久久9999| 在线看片国产精品每日更新| 亚洲欧美性生活| 嗯嗯嗯啊啊在线观看| 亚洲国产成人精品久久久国产成人一区二区 | 亚洲色图大香| 国产亚洲色婷婷99精品91| 国产乱色国产精品免费视| 久9久9精品| 四虎免费在线播放| 嫩草一区二区在线观看| 欧美久久毛片基地| 操人妻视频| 国产欧美日韩一区二区三区| 91neishe| 国色综合天| www.伪伪| 日韩中文字幕宗合在线| 在线播放免费av福利片| 午夜啊啊啊| 亚洲日韩国产精品| 久久久无码国精品无码三区三区| 99热这里只有精品1| 秋霞网—男女啪啪亚洲免费体验区| 色婷婷亚洲婷婷| 久久久亚洲精品电影免费看| 九九九九精品一区| 日本成人A片网站| av72网| 亚洲色图综合网| av中文在线| 欧美日韩人妻婷婷一区| 豆花视频操逼网址| 亚洲第一页欧美| 91激情| 日韩欧美麻豆大片| 天天干一干| 成人开心网在线视频| 亚洲综合精品国产一区| 国产一区在线播放| 五月天春色激情网| 国产在线观看一区二区三区| 99re6久热只有精品6在线直播| 超碰日本97美女人妻人人玩人人爱| 99久在线精品99re8热视频在线| 丰满人妻一区二区三区大胸懂色| 婷婷操逼| 五月天婷婷色| 国产熟女无套内射| 国产免费一区二区在线A片视频| 国产性爱欧美性爱在线 | 狼人久草| 人人看黄色视频| 蜜桃久久久久久| 亚洲一区二区在线观看91| 蜜臀精品1区2区| 人人看黄色视频| 国产精品亚洲四五区在线观看| 日韩性爱小视频| 99RE在线视频精品,这里只有精品| JIZZJIZZ亚洲女人被躁| 成人一级二级| 成人亚欧免费视频| 99热在线播放| www九九热| www五月| 亚洲瓯美色图| 黄污污污污| 91亚州| 黄网站黄视频网站进入口 | 大屁股xxxxx| 夜夜欧美 | 久久久久久久97| 好吊色一区| 91成人在线免费视频| 久久亚洲欧美一区二区三区-亚洲国产精品第一区二区 | 亚州宗合另类| 高清国产成人无码| 后入国产| 国产第11页| 精品成人av一区二区三区在线| 欧美成人性活片| a人欧美综合天堂麻豆| 国产91久久九九免费精品无码| 九九热精品| 久久一留热品黄| 十八禁啪啦拍视频无遮挡| 亚洲熟女av中文字幕| 日韩天堂av电影在线观看| 一区二区三区黄色片a| 中国和日本人色哪个不下载能放| 超碰综合色| 日本三级黄页| 人妻aa| 青娱乐福利99| 人妻熟女一区二区三区视频| 超碰97欧美日韩| 欧美 亚洲 综合 制服| 国产精品久久久久中文字幕| 无码人妻一区二区三区色欲aⅴ| 人妻色情天天操| 精品人妻视频一区二区三区蜜桃视频| 日韩草久视频| 亚洲欧美国产日本一区二区三区| www.yeyecao| 男人天堂网址| 青草一区二区| 少妇熟女视频一区二区三区| 国产精品电影推荐| 一区 欧美 日韩 麻豆| 精品色色| 婷婷午夜| 99色色网| 五月丁香影院| 欧洲色| 无套内射性感少妇视频| 十八禁的黄污污免费网站| 一区二区三区免费视频入口| 国产精品久久久久久久久久久久久久吹| 9长久久精品| 歐美性天天| 97色97好| 欧美成人色| 亚洲淫乱骚妇AV| 国产精品乱码久久久久久久久久久久| 东京日日夜夜| 台湾佬激情综合| 亚洲不卡AV在线| 91美女中出| 色色亚洲| 91久久精品美女高潮喷水| 欧美日韩婷婷中文| 中国黄色特级精品一区二区三区片| 亚洲91亚洲| 五月婷婷hd| 欧美熟妇人体| 97网址97| 欧美日韩中文字幕不卡| 青青草好吊色| 欧洲性爱无码区| 国产在线视频午夜精华在| 91综合网| 伊人久久在线视频观看| 亚洲免费在线探花| 亚洲高清无码免费观看视频| 婷婷亚洲综合| 亚洲精品蜜桃久久久一区二区三区| 欧美中文字幕男人天堂久久精品| 1区2区3区中文字幕日韩| 日韩图区| 青青草一区二区高清无码视频| 91综合天天| 久久国产在线一区二区| 曰韩操B| 天天日天天色| 激情亚洲天堂| 大逼色网站| 久久国产AⅤ| 91爆操视频| 久久久无码国精品无码三区三区| 7月婷婷综合| 国产亚洲精品美女| 九九热av| 天堂а√在线最新版在线| 久久久久国产一区二| 日韩在线AB| 欧美青青视频| 97啪啪| 精品国产乱码久久久久久口爆网站 | 中文字幕一区 二 区 三 四 五 区日 日 骚| 2011国产精品| 很狠操| 欧洲在线性爱视频| 岛国片在线观看视频亚洲| 97国产色综合| 91九色丰满高潮| 欧美性xxxxx狂欢| 精品一二三区久久AAA片| 精品四五区| 亚洲男人天堂视频| 亚洲无码太久| 啊啊啊啊啊啊啊国| 97人人夜| 屁屁影院一区二区三区国产| 欧美日韩人人精品| 一起草视频在线| 国产区91柔拿会所技师| 欧美有码亚洲中文字幕一区二区三区四区 | 午夜精品久久久| 这里都是精品在线观看| 国产亚洲色婷婷99精品91| 超碰97国产欧美| 亚洲乱码国产乱码精网站| 性色乱AV一区二区| 91精品91久久久久77777俄罗斯老妇姓x| 国产免a费看黄片在线| 最新AVzaixian| 欧美啪啪啪91| juliaann精品熟女一区| 性生活性生大爱77AV国产| 久久成人午夜精品影院| 东京热av男人的天堂| 中文字幕三四区| 成人夜夜爽| 欧美激情 一区| 欧美性爱一级操| 夜夜爽爽夜夜精品视频| www.91人妻.com| 色女99一级片在线观看| 久久这里只精品免费福利| 天天添天天干电影| 少妇久久久久久| 黑丝内射一区二区三区| 78超碰| 国产999精品久久久久久| 久久大黄片| 亚欧日韩成人| 吊色| 偷看洗澡一二三区美女| 国产精品久久久久久久久久二区三区| 日韩色欲久久一二三四区| 欧美曰韩国产精品| 强奸乱伦亚洲第一页| 熟女一区二区三区| 99色在线| 97操| 人人操人人操人人操人人操人人操人人人11.CM | 欧美激情综合| 欧美另类自拍| 92午夜免费福利视频| 欧美淫乱视频| 91精品丝袜在线观看| 国产一区二区精品久久99| 91在线限制级| 亚洲字幕一区二区| 国产精品一区二区三| 我爱搞逼综合网| 欧美性爱第一页久久| 青青草久久一区网| 91在线免费精品视频| 亚洲天天操| 97超碰色屌| 亚洲av无线观看| 欧亚第一综合网| 99在线精品视频| 亚洲欧美综合| 欧美一级专区免费大片| www…国产操逼| 伊人国产成人av网站| 97国产天堂岛| 大香交伊人网| 高清无码一区二区三区| 青青草影视蜜久久| 精品人妻一区二区免费蜜桃| 婷婷亚洲五月***久久| 成人性生活高清视频在线播放| 图色综合网| 女人双腿搬开让男人桶| 亚洲色婷婷久久91| 蜜桃天美传媒AV一区二区三区| 91美女高潮| 97超碰国产精品| 超碰人妻天天干| 亚洲日韩电影| 破处bbq| 69视频福利导航| www.91色| 人人插人人摸人人| 精品无码欧美三级| 欧美性色欧美| 色天使AV天堂| 欧美 亚洲 另类 综合| 天天欧美欧美亚洲网| 亚洲国产一级精品毛一级精品看免费视频 | 精品十三区| 亚洲欧洲另类| 国产一区二区三区精品观看啪| 亚洲欧美日韩制服另类| 伊色久人大在线| 国产精品色| 美日韩在线不卡人妻| 白嫩嫩一区| 色色色色网站| 视频分类 国内精品| 在线播放免费av福利片| 黄片视频观看| 蜜臀久久99精品久久久久| 日韩精品三级| 日1区2区3区2020| 91丝袜美腿片| 韩日精品福利视频一区不卡在线免| 久久女人视频| 日本韩国一本产品小视频日本韩国一本产品久久久产品小视频日本韩国一本产品久 | 亚洲成人精品在线一区| 亚洲欧美日韩免费观看| 97超碰久久| 97久久国产| 超碰九7免费| 丰满人妻-区二区三区免费看| 久久欧美激情| 婷婷10月天青娱乐| 欧美男人的天堂| 亚洲熟妇白浆无码AV| 色网综合网| 嗯嗯啊啊好大好爽| AV久日| 久九9精品| 看看日B真人视频| 美女好片色日本| 蜜臀99999| 99re6久热只有精品6在线直播| 久久国产精品,久久国产| 中文字幕一二三av| 日韩成人色图| 日韩色图 一区二区| 亚洲麻豆av一区二区| av在线一区二区三区| 欧美色棕合| 蜜乳性色无码专日粉嫩骚逼AV| 91人妻中文| 五月天精品| 国产精品视频精品一二| 精产品久久| 蜜臀久久一区二区| 正宗无毛一线天嫩逼| 中文幕97| 97人肏| 九九九九九九免费视频| 91在线一起| 国产99热| 日逼逼免费看| 欧美性爱五月天| 四虎永久在线精品免费网址 | 久久久精品国产亚洲伊人| 蜜桃久久久久久久| 人妻少妇久久| 中文字幕av片| 六九九九| 午夜久久无码1000合集| 可免费观看的av毛片中日美韩| 高凊专区人人操| 91av天美性媒精品视频| 亚洲熟妇综合久久久久久| 欧美丝袜中文字幕07在线| 亚洲天天综合| 国产精品无码av| 日韩高潮一区| 五毛骚逼极品美女怕怕| 天天噜| 国产精品视频一区二区三区八戒| 天堂精品在线| 最新9久久久9免费视频| 中文操逼字幕| 九九色精品| 欧美aⅴ99久久黑人专区| 亚洲 欧美 日韩另类 麻豆| 被窝影院午夜看片无码| 国产又爽又黄| 小草av不卡亚洲二区| 亚洲资源一区| 无码聚合| 夜夜 中文视频rt| 婷婷婷婷婷婷久久久久| 强奸a片网| 1204av韩国| 91处女在线观看| 国产粉嫩出水在线播放| 91爰爱欧美| 中文一区二区三区影院| 午夜福利成人免费视频| 青女在线| 日韩免费福利在线观看| 青青草视频这里只有精品| 另类老少妇| 日韩不卡在线一区二区| 妇女视频网站| 精品久久无码午夜福利| 大香蕉在线视频15| 91天堂| 婷婷五月成人| 久久9久久| 一区在线国产播放| 91天天美女| 日本五十路熟女一区二区| 1区2区3区中文字幕日韩| 日韩福利电影网| 欧美极品女人的天堂| 久久线上视频免费看| 亚洲一区二区精品福利| 视频二区熟女人妻| 93人人操人人| 91爱看| 国产精品宅男免费| 久久视频,这里只有精品| 激情网色| 99这里只有精品| 九九久久综合| av天堂加勒比| 欧美综合综合| 97精品人妻一二三四| 欧美色图亚洲色| 天天影视综合色| 国产精品九九九| 人妻 制服 日韩 中文 在线| 国产精品一二三区18| 岛国小电影| 国产精品久久久无码aV去| 97在线欧洲| 成年女人黄网站| 囯产精品强| 乱伦熟女区| 另类欧美色| 2025亚洲男人天堂| 一区二区三区黄色片a| 久久视频少妇美女| 五月丁香婷婷色| 加勒比综合| 超碰碰激情97+久| 国人欧美精品一区二区| 亚洲情色 欧美| 91在线免费观看处女| 午夜操逼不卡| 亚洲女优有码无码高清| 青青国产精品在线| 欧美性爱第一区| julia国产在线 | 久久精品国产亚洲AV成人直播| 少妇高潮九九九九九九九| 很很干很很操| 国产成年免费大片黄在线观看| 欧美在线|亚洲| 亚洲午夜免费狠狠干| 91伊人久| 中日韓欧美高清| 久久久久网站-538在线视频-欧美永久乱码| 国产熟女乱论| 国产偷拍自拍在线视频| 99久久婷婷丁香| 性爱AV天堂| 强奸乱伦资源| 美女黄页| 色色色日本| 欧美中字二区| 日韩不卡毛片Av免费高清| 18禁久久| 欧美激情色婷婷花野真衣一区二区| 免费人成在线观看网站品爱网| 夜夜国自区| 91殴美大片| 婷婷久久综合久| 中文字幕五月婷婷免费| 夜夜欧美 | 麻豆伊人网| 日韩三级久久久| 黑人黄片在线免费观看| 老司机天天操| 国产h小视频在线观看免费| 99re6在线视频精品免费完整版安卓版| 中文字暮97| 午夜丁香| 国产精品熟女丝袜一区二区| 日韩欧美日韩| 不卡二三区人妻少妇| 欧美国产日韩清纯唯美| 国产家庭乱伦网址| 亚洲黄片免费在线播放| 最近二区三区视频大全 | 蜜臀久久99精品久久久久久成人小说 | 老子午夜伦不卡影院| 欧美桃色网| 婷婷久草| 天美传媒av一区二区| 性老妇一区二区三区| Av色五月| 91亚·色| 人妻天堂综合网| 国产性爱欧美性爱在线| 亚洲棕合电彰| 亚洲日韩青青草色月| 肉丝网站91| 中文字幕av久久爽Av| 亚洲熟妇乱女区二区三区| 亚洲男人天堂Av| 看日韩美女二区三区免费操逼视频 | 香蕉99秘 精品一区丁香| 99久在线精品99re8热| 成人性爱电影网| 日韩中文字幕视频在线观看| 免费观看的黄色的网站| 一区二区三区四区免费视频| 国模不卡| 欧美很很操视频| 综合网色| 欧美午夜精品久久久久久超碰| 啊灬啊灬啊灬好深灬快高潮了动漫-国产字幕国产在线观看-B049AV | 日韩精品国产一区二区| 亚洲无码一二三区| 日本超碰在线国产一区| 国产毛片毛片4p懂色| 啊啊啊在线观看| 免费观看日本操逼视频| 岛国在线国产| 99久久e免费热视| 黑人精品成人一区二区三区| 五月丁香综合激情| 亚洲天堂综合AV| 青青草原狼av| 亚洲欧美在线综合| 国产日韩美女小穴视频网站不卡| 亚洲综合伊人无码久久| 毛片一区二区| 97在线观看播放视频| 秋霞欧美性爰视频| 色婷婷综合久久久久中文国产精品一区中文字幕,国产福利电影一区二区三区 | 天堂av2019| 91骚妇| 亚洲精品久久久久久| 夜夜爽夜夜操| 精品日韩中文在线| 狠狠色婷婷777| 日产国产精品中文久久婷婷| 高清肉丝中文无码| 无套后入双马尾| 超碰97人人cao| 在线啊v一区| 精品人妻一区二区三区-国产精品 一个人在线看的黄色电影网站 | 色香在线| 夜色91| 九月丁香综合网| 九色 人妻 大香蕉| 伦理日韩国产久久| 草草草视频在线免费看| 留下AⅤ黄色片| 亚洲综合113页| 欧美第五页| 桃花色综合影院| 免费看日本操逼视频| 久久亚洲天天做| 日本 情色 1区| 九九干| 国产四虎在线| 清纯唯美第一页| 二男一女成人A片| 天美麻豆精品视频99| 久草久日| 久久性生大片免费观看性| 日本精品高清一二区一本到| 欧美色九九九| 国产欧美另类久久久精品课程| 婷婷丁香九月| 不卡九肏| 69精品| 五月丁香激情综合网| 嗯嗯啊啊好大好爽| 性久久久| 18一区二区三区| 亚洲高清综合网| 色牛牛AV| 亚洲。天堂。日本在线观看| 久久超碰国产一区二区三区| 精品 码产区一区二-1080P高清在线www-B029AV | 午夜一区| 色一情一乱一乱一区91Av| 99re在线视频国产| 中文字幕五月婷婷免费| 日韩中文字幕熟妇人妻| 啊啊啊啊啊啊好多水| 婷婷五月色| 欧美亚洲系列| 大香蕉黄色一区| 亚洲另类色综合网站| 久久三| 秋霞福利网| 日韩亚洲中文字幕在线| 极品粉嫩少妇视频| 亚欧毛片基地国产毛片基地| 日韩一区二区熟女| 小说区 图片区色 综合区| 超碰97爽| 男插女青青影院| 天天日日本| 免费成人在线观看91| 无码粉嫩白虎一线天b区| 色一色综合网| 91M一社| 五月天婷婷成人网| 日韩精品人妻一区二区| 67914亚洲精品| 久久久久久精| 91丝袜美女| 无码久久国产| 青青欧洲黑| 国产精品视频白浆免费| 欧美日综合| 婷婷五月在线视频| 2021国产成人精品久久| 国产人伦精品一区二区三区 | 蜜臀久久在线视频| 天堂俺去俺来也www久久婷婷| 亚洲 另类 丝袜 自拍 动漫| 久久久久无码一妻区| 操逼网站视频漫画国产| 欧洲亚洲天堂精品| 日本超碰在线国产一区| 性爱综合网| 特级大荫道BBwBBwBBW| 中文字幕超碰CAO| 另类成人首页一区| 男人的天堂一区| 女性91网站| 精品人妻一区二区三区日产| 亚洲男人的天堂网| 久草新在线| 精品国产91av一区二区三区| 亚洲老司机123专区| 亚洲中文字幕一区二区| 亚洲国产欧美中日韩成人综合视频| 伊人AAA| 日韩兔费看黄片| 综合色拍| 丁香五月电影| 操www| 91丝袜人妻| 久久av网| 9+1视频网址| 免费av在线播放二区| 91日韩网站| 成人综合网 欧美| 国产精选三级在线观看| 成人午夜高潮av猛片| 后入式五六区| 日日干夜夜操视频h| 国产亚洲精品自在线亚洲情侣| 人人爱人人乐人人操| 亚洲系列欧美| wwe 天天干.com| 天天干,天天日| 日本www操操操| 黑人娇小av在线播放| 久久久久幕乱码| 国产传媒美日韩av| 97资源制服丝袜| 欧美 亚洲 偷拍自拍| 51久久夜色精品国产麻豆| 天天干18禁| 97国产精品在线观看| 国产乱人妻精品入口| 日韩人妻操B| 中文字幕成人| 日本操BAV| 尤物网址| 亚洲密乳AV| 日本成a人v网站在线观看| 精品美女少妇一区二区| 人澡逼| 精国久久一区二区三区98| 青青草吊丝| 超碰三级秋霞| 精品一区二区三区蜜桃臀赵总 | 国产欧美伊人| 国产精品大香蕉| 韩国一级婬片A片AAAAA| 亚洲天堂7777| 午夜偷拍久久熟女| 日韩欧美tv一区二区在线观看| www.亚洲黄色| av爱爱爱| 日韩免费高清大片在线| AⅤ片水多多| 97超碰磁| 中文人妻av高清一区| 少妇高潮流水av免费| 成人精品在线免费视频| 欧美激情激情xxxx欧美专区| 男人在线天堂| 国产一级内射高清视频| 少妇久久久| 日本一区二区不卡| 四虎影视精品| 91亚洲综合在线| 久久久久久久综合,国产| 日韩高清一二三| 伊人在线大香蕉视频久久| 蜜臀亚洲综合一二三四区| 狠狠2050在线观看| 夜色97| 欲色啪| 亚洲 欧美 日韩另类 麻豆| 欧美国产日韩清纯唯美| 人人操人人色人人摸| 91欧美另类| 97硬碰| 在线啊啊啊| 91亚洲丝袜熟女| 亚洲诱惑| 婷婷五月天_亚洲小说欧美激情另类_精品久久国产字幕 | 亚洲国产精品有声| 超碰人人操97碰| 啪一啪免费视频| 91久热| AA丁香综合激情| 小草三级久久观看| 欧美视频第二页| 久久久久久波多野吉衣高潮| 欧美高潮| 五月开心久久AV官网| 亚洲中字慕不卡| 日韩在线观看三级电影| 亚洲中文字幕熟女| 日本丝袜人妻内射| 欧美色婷婷| 色综合中文字幕不卡| 久久久禁| 啊啊啊好舒服视频| 翔田千里A片一区二区| 在线欧美69V免费观看视频| 亚洲夜夜欢无码一区二区 | 久久婷婷一区| 2017天天拍大香蕉| 蜜乳Av成人片网站| 婷婷色综合| 天天干天天日天天射黄色大片| 夜夜 中文视频rt| 自拍欧美| 国产精品久久泡妞网站| 丁香五月天啪啪| 丰满熟女一区二区三区在线播放| 国产精品嫩草影院午夜两性| 思思视频免费看网站| 日韩不卡在线一区二区| 精品国产乱码久久久久久久久1| 中文字幕av色| a人片中文字幕一区二区| 伊人91| 久久久久久日韩| 久久,精品一二三| 国产欧美成人精品| 91精片| 亚洲人妻中文高清| 国产精品2020| 日韩精品-原创伙伴| 国产第12页| 麻豆国产97在线| 超碰国产精品无码| 亚洲一区二区三区AV无码| 欧美日本一区二区a人| 丁香五月天堂| 五月丁香| 91美女視頻| 国产真实子伦对白| 插欧洲美女欧美精品| 啊啊啊97视频| 亚洲欧美洲综合| 五月丁香社区婷婷日韩欧美精品影院 | 日日夜夜骑| 亚洲天堂AV在线播放| 亚洲欧洲小说图片视频| 超碰97伊人| 日欧操屄| 久久色一区| 久久夜夜| 九九综合| 超碰到97情色| 欧美色性爱| 小骚逼被操的爽不爽| 97综合国产| 亚洲高潮少妇| 色97干| 日韩999| 男人的天堂com| 五月香婷婷| 欧美高清在线| 婷婷中文网| 超碰 国产熟女精品一区| 色欲久久久久综合网| 高清不卡视频| 四虎国产精品永久在线囯在线| www九九热| 中国熟妇| 超91综合网| 亚洲国产精品久久AV| 久久丁香五月天| 欧亚 另类 久| 五月婷在线| 九色黄站| 九色 人妻 大香蕉| 中文字幕精品探花视频| 精品久久在线区一区| 九九九九九九视频免费| 免费看美国人人爽,人人操| av黄图片在线观看| 麻豆黄四叶草网站| 久久综合九色综合欧洲98| 欧美日韩理论一区| 免费自拍三级综合| 亚洲视频一二区| 一级黄色性爱A级片| 国产精品高朝久久久久久久| 精品人体无圣光凹凸| 97视频在线视频| 97香蕉碰碰人妻国产欧美| 人妻熟女一区二区三区在线| 色色色欧美| 一区二区三区一亚洲中文字幕、综合区灬 | 91暧暧| 国产精品自拍xxxx| 国产成人精品一区| 日韩AV熟女乱伦| 美女诱惑一区| 欧美A√综合网| 国产精品女久久久久av爽| 色婷婷日韩精品一区二区三区| 亚洲天堂,男人| 中文字幕久久婷婷丁香五月天| 美欧老女人97| 色婷久久| 黄片免费视频2019| 很很很很操| 婷婷五月丁香五月| 久久中文字幕一区不卡| 久久宗合亚洲| 丝袜AV一二三区| 91人妻做a观看视频| 久9九综合在线| 亚洲熟妇无码一区二区三区| 久久性爱网站| 亚洲色欧美| 亚洲国产丝袜熟女av| 日日夜夜青青草母狗| 日韩欧美经典在线观看| 毛片一区二区| 9久精品视频在线观看| 五月丁香六月激情| 秋霞久久亚洲精品成人| 天堂亚洲精品| 亚州综合AⅤ| 69精品少妇一区二区三区蜜桃| 国产操逼视频在线观看| 精品少妇人妻一区二区三区| 国产免费大片| 国产99热| 国产一级内射无挡观看| 97干在线视频| 男人天堂网手机版婷婷| 哈哈操电影AV| 天天操天天干一区二区 | 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 中日韩久久久免费看| 美骚妇av高清在线| 操逼视频亚洲| 国产精品99精品视频网站| 婷婷人妻激情| 欧美高潮| 欧美亚洲丝袜美女电影| 91美女中出| 日韩另类| 国产一区二区在线电影| a片在线播放| 久久免费少妇| 国产一级黄色片在线观看| 五月天综合| 操逼操操操91| 丝袜人妻av一区二区| 97中文字幕九区| 97伦乱| 久久只有精品一区二区三区| 欧美熟女少妇| 九九黄色网| 久久婷婷综合国际产色怕| 日韩激情电影中文字幕| 我要色综合网| 搡老女人老91二区| 夜夜欧美| 亚洲色综网| 超碰欧美97资源| 午夜操操操| 久久久久久人| 亚洲欧美综合网站| 日韩人妻丝袜美腿中文| 伊人久久大香线蕉亚洲五月天,青草青草欧美日本一区二区,欧美日产欧美日产国产 | 91九色首页| 91色色色| 99∨VTV| 婬女免费一二三区A片| 91肉片| 超碰在线人人射| 黄片视频观看| 久久成人国产精品| 偷拍亚洲熟女视频播放| 久96热在线观看视频| 性无码专区2020| 麻豆国产视频精品观看| 日韩中文字幕视频| 另类亚洲一区二区三区| 中字幕人妻一区二区三区| 日韩精品国产一区二区| 国产精品免费久久久久久久久久| 人妻丝袜日本| 欧美成人性爱视频在线播放|