免费国产精品自在自线-91精品国产色综合久久久浪潮-99热久久免费频精品-国产精品国模在线观看-久久亚洲国产精品成人?V秋霞-久久国产一级A片免费播放-亚洲国产欧洲综合97久久-久久国产白嫩美女呻吟高潮

ARTICLE DETAIL

資訊詳情

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

iOS開發(fā)實(shí)戰(zhàn):利用AVFoundation與Photos框架實(shí)現(xiàn)視頻轉(zhuǎn)Live Photo

iOS開發(fā)實(shí)戰(zhàn):利用AVFoundation與Photos框架實(shí)現(xiàn)視頻轉(zhuǎn)Live Photo 你是不是也遇到過這種情況手機(jī)里存了一段特別有感覺的短視頻想把它設(shè)置成 iPhone 的 Live Photo實(shí)況照片讓鎖屏壁紙動起來卻發(fā)現(xiàn)系統(tǒng)自帶的“實(shí)況”功能只能拍照不支持視頻導(dǎo)入網(wǎng)上找的轉(zhuǎn)換工具要么收費(fèi)要么有水印要么操作復(fù)雜得讓人頭疼。今天我們不談那些復(fù)雜的商業(yè)工具而是帶你從零開始親手打造一個(gè)屬于你自己的、完全免費(fèi)的“視頻轉(zhuǎn) Live Photo”App。整個(gè)過程你不需要是 iOS 開發(fā)大神甚至不需要懂復(fù)雜的圖像處理算法。我們將借助兩個(gè)強(qiáng)大的“外掛”image2和Codex。image2是一個(gè)能理解圖像內(nèi)容的 AI 模型而Codex則是 OpenAI 推出的代碼生成模型GPT-3 的編程特化版。聽起來很高深別怕我們的核心思路是用自然語言描述你的需求讓 Codex 生成大部分代碼再用 image2 處理視頻關(guān)鍵幀最后由 Xcode 打包成 App。這篇文章就是一份詳細(xì)的“地圖”告訴你每一步怎么走坑在哪里如何避開。讀完本文你將獲得一個(gè)可運(yùn)行的、將 MP4 視頻轉(zhuǎn)換為 iPhone 可識別的 Live Photo.mov .jpg的完整 iOS App 項(xiàng)目。一套利用 AI 輔助進(jìn)行應(yīng)用開發(fā)的實(shí)戰(zhàn)方法論而不僅僅是調(diào)用某個(gè) API。對 Core Media、AVFoundation 等 iOS 多媒體框架關(guān)鍵操作的理解。從設(shè)計(jì)、編碼、調(diào)試到最終打包上架或自簽的完整流程體驗(yàn)。我們開始吧。1. 這篇文章真正要解決的問題很多教程教你“如何使用某個(gè)庫”但很少告訴你“如何從想法到產(chǎn)品”。本文要解決的遠(yuǎn)不止技術(shù)實(shí)現(xiàn)而是三個(gè)層面的問題1. 功能實(shí)現(xiàn)問題如何將一段普通的 MP4 視頻轉(zhuǎn)換成 iPhone 系統(tǒng)相冊能正確識別、播放和設(shè)置為壁紙的 Live Photo這涉及到對 Live Photo 本質(zhì)一個(gè)短視頻一張封面圖元數(shù)據(jù)的理解以及對 iOS 媒體庫操作 API 的掌握。2. 開發(fā)效率問題對于不熟悉 iOS 多媒體開發(fā)的開發(fā)者或者想快速驗(yàn)證想法的產(chǎn)品經(jīng)理、設(shè)計(jì)師從頭閱讀蘋果冗長的文檔效率太低。我們能否利用 AICodex來理解我們的意圖并生成大部分“樣板代碼”和“復(fù)雜邏輯代碼”我們只負(fù)責(zé)核心業(yè)務(wù)邏輯的串聯(lián)和調(diào)試3. 工程化與踩坑指南網(wǎng)上搜索“Live Photo 轉(zhuǎn)換”你會找到很多零散的代碼片段但缺乏一個(gè)完整的、可編譯運(yùn)行的 Xcode 工程更缺少對權(quán)限申請、內(nèi)存管理、文件格式兼容性、真機(jī)調(diào)試等實(shí)際問題的系統(tǒng)性講解。本文將提供一個(gè)完整的項(xiàng)目腳手架并重點(diǎn)標(biāo)注那些官方文檔語焉不詳、但實(shí)際開發(fā)中一定會遇到的“坑”。適合誰讀iOS 開發(fā)新手想通過一個(gè)有趣的項(xiàng)目快速上手 AVFoundation 和 Photos 框架。全?;蚯岸碎_發(fā)者對移動端開發(fā)感興趣想了解一個(gè)完整 iOS App 的構(gòu)建流程。獨(dú)立開發(fā)者或創(chuàng)業(yè)者有一個(gè)小工具 App 的想法希望用最低成本快速實(shí)現(xiàn)原型。對 AI 輔助編程感興趣的人想看看 Codex 在實(shí)際項(xiàng)目開發(fā)中到底能幫到什么程度。2. 基礎(chǔ)概念與核心原理在動手寫代碼之前我們必須搞清楚幾個(gè)關(guān)鍵概念這是避免后續(xù)走彎路的基礎(chǔ)。2.1 Live Photo 到底是什么很多人誤以為 Live Photo 就是一個(gè) GIF 或者短循環(huán)視頻。其實(shí)不然。一個(gè) Live Photo 在文件系統(tǒng)層面是兩個(gè)獨(dú)立文件加上一套元數(shù)據(jù)視頻文件一個(gè)時(shí)長約 3 秒的.mov格式視頻文件包含了畫面和聲音。這是“動起來”的部分。封面圖片文件一張.jpg或.heic格式的靜態(tài)圖片通常是從視頻中間截取的一幀。這是你預(yù)覽時(shí)看到的部分。配對標(biāo)識符一套元數(shù)據(jù)存儲在PHAsset或文件系統(tǒng)的AssetResource中將上述兩個(gè)文件關(guān)聯(lián)起來告訴系統(tǒng)“這個(gè) .mov 和這個(gè) .jpg 屬于同一個(gè) Live Photo”。所以轉(zhuǎn)換的核心任務(wù)就是從輸入視頻中提取一段短視頻和一張封面圖生成這兩個(gè)文件并創(chuàng)建正確的關(guān)聯(lián)關(guān)系最后導(dǎo)入到系統(tǒng)相冊。2.2 image2 與 Codex 在本項(xiàng)目中的角色這里容易產(chǎn)生一個(gè)誤解認(rèn)為 image2 是直接處理視頻的。其實(shí)不然我們需要明確分工image2 的角色視覺內(nèi)容理解與處理關(guān)鍵幀提取從長視頻中智能選擇最具代表性、畫質(zhì)最好的一幀作為 Live Photo 的封面圖。這比簡單取第一幀或中間幀效果更好。畫面分析可選未來可以擴(kuò)展功能例如分析視頻內(nèi)容自動添加相關(guān)標(biāo)簽或者根據(jù)內(nèi)容推薦合適的封面幀。在本項(xiàng)目中我們可以將 image2 視為一個(gè)“智能截圖工具”。雖然我們最終會使用AVFoundation的AVAssetImageGenerator來實(shí)際截取幀但 image2 的選幀邏輯思想可以借鑒。Codex 的角色代碼生成與輔助開發(fā)生成樣板代碼例如創(chuàng)建UIViewController、設(shè)置UITableView的DataSource、編寫文件選擇器的標(biāo)準(zhǔn)代碼。這些重復(fù)性工作可以交給 Codex。解釋復(fù)雜 API當(dāng)你對PHLivePhoto、PHAssetCreationRequest等 API 的用法不熟悉時(shí)可以用自然語言向 Codex 提問讓它生成示例代碼。調(diào)試助手將錯(cuò)誤日志貼給 Codex讓它幫你分析可能的原因。在本項(xiàng)目中我們將主要用 Codex 來生成文件管理、權(quán)限申請、相冊寫入等模塊的初始代碼加快開發(fā)速度。核心原理流程圖用戶選擇MP4視頻 - App讀取視頻 - 使用AVFoundation截取3秒片段 - 生成.mov文件 | - 使用AVFoundation/借鑒image2思想選取關(guān)鍵幀 - 生成.jpg文件 | - 使用Photos框架將.mov和.jpg配對 - 創(chuàng)建Live Photo - 保存至相冊3. 環(huán)境準(zhǔn)備與前置條件工欲善其事必先利其器。以下是開發(fā)本應(yīng)用所需的全部環(huán)境。3.1 硬件與系統(tǒng)Mac 電腦必須是 macOS 系統(tǒng)用于運(yùn)行 Xcode。iPhone 或 iPad可選但強(qiáng)烈推薦用于真機(jī)調(diào)試和功能驗(yàn)證。模擬器無法測試相冊寫入等部分功能。操作系統(tǒng)macOS Monterey (12.x) 或更高版本。建議使用最新穩(wěn)定版。3.2 軟件與工具Xcode從 Mac App Store 下載并安裝最新穩(wěn)定版本如 15.x。這是 iOS 開發(fā)的唯一官方 IDE。Apple Developer Account一個(gè)免費(fèi)的 Apple ID 即可用于真機(jī)調(diào)試。如果需要上架 App Store則需要加入付費(fèi)的 Apple Developer Program年費(fèi) 99 美元。本文以真機(jī)調(diào)試為目標(biāo)。Python 環(huán)境可選用于模擬 image2 邏輯如果你打算在服務(wù)端或本地腳本中實(shí)現(xiàn)更復(fù)雜的關(guān)鍵幀選取算法可以安裝 Python。但在本文的純客戶端實(shí)現(xiàn)中非必需。3.3 知識預(yù)備基本的 Swift 語法了解變量、函數(shù)、類、閉包等概念。對 iOS 開發(fā)有初步認(rèn)識知道什么是ViewController、Storyboard/SwiftUI、IBOutlet。如果這些你都不熟沒關(guān)系跟著步驟做Codex 生成的代碼會有詳細(xì)注釋你可以邊做邊學(xué)。4. 創(chuàng)建 Xcode 項(xiàng)目與基礎(chǔ)配置讓我們打開 Xcode從零開始。4.1 新建項(xiàng)目打開 Xcode選擇 “Create a new Xcode project”。模板選擇 “App”點(diǎn)擊 Next。填寫項(xiàng)目信息Product Name:LivePhotoConverter(或其他你喜歡的名字)Team: 選擇你的 Apple ID 賬戶如果沒有點(diǎn)擊 “Add Account…” 添加。Organization Identifier: 通常使用反寫域名格式如com.yourname。Interface: 選擇SwiftUI更現(xiàn)代代碼更簡潔。如果你想用 UIKit也可以但本文以 SwiftUI 為例。Language: 選擇Swift。不要勾選“Use Core Data”, “Include Tests” 等選項(xiàng)保持項(xiàng)目簡潔。選擇項(xiàng)目保存的位置點(diǎn)擊 Create。4.2 配置項(xiàng)目權(quán)限Live Photo 轉(zhuǎn)換需要訪問用戶的相冊寫入和文件讀取視頻。必須在Info.plist中添加相應(yīng)的權(quán)限描述。在項(xiàng)目導(dǎo)航器中點(diǎn)擊LivePhotoConverter項(xiàng)目藍(lán)色圖標(biāo)選擇Info標(biāo)簽頁。在 “Custom iOS Target Properties” 區(qū)域點(diǎn)擊號添加以下兩項(xiàng)KeyTypeValuePrivacy - Photo Library Usage DescriptionString需要訪問相冊來保存生成的 Live Photo。Privacy - Photo Library Additions Usage DescriptionString需要向相冊添加新的 Live Photo。為什么需要兩個(gè)第一個(gè)是“讀取和使用”相冊的權(quán)限第二個(gè)是“僅添加”權(quán)限。對于只寫入不讀取的場景使用第二個(gè)更合適系統(tǒng)提示對用戶更友好。4.3 初始項(xiàng)目結(jié)構(gòu)創(chuàng)建完成后你的項(xiàng)目應(yīng)該包含以下主要文件LivePhotoConverterApp.swift: App 的入口文件。ContentView.swift: 主視圖文件我們將在這里構(gòu)建界面。Assets.xcassets: 資源文件夾可以放應(yīng)用圖標(biāo)。Info.plist: 配置文件。5. 核心功能模塊設(shè)計(jì)與實(shí)現(xiàn)我們將功能拆解為四個(gè)模塊1. 用戶界面2. 視頻選擇與讀取3. 視頻處理與文件生成4. Live Photo 合成與保存。5.1 模塊一構(gòu)建用戶界面 (SwiftUI)我們將創(chuàng)建一個(gè)簡單的界面一個(gè)按鈕用于選擇視頻一個(gè)顯示選中視頻名的文本一個(gè)進(jìn)度條一個(gè)轉(zhuǎn)換按鈕和一個(gè)顯示狀態(tài)的文本。打開ContentView.swift將其替換為以下代碼。這里就是 Codex 可以大顯身手的地方。你可以嘗試在 ChatGPT具備 Codex 能力或 GitHub Copilot 中輸入“用 SwiftUI 寫一個(gè)視圖包含一個(gè)選擇視頻的按鈕一個(gè)顯示視頻名的文本一個(gè)轉(zhuǎn)換按鈕一個(gè)進(jìn)度條和一個(gè)狀態(tài)文本?!?它會生成非常接近的代碼。我們在此基礎(chǔ)上進(jìn)行調(diào)整。// 文件ContentView.swift import SwiftUI import PhotosUI // 用于選擇視頻 struct ContentView: View { // 狀態(tài)變量 State private var selectedVideo: PhotosPickerItem? nil State private var selectedVideoURL: URL? nil State private var videoName: String 未選擇視頻 State private var isConverting: Bool false State private var conversionProgress: Double 0.0 State private var statusMessage: String 準(zhǔn)備就緒 var body: some View { VStack(spacing: 30) { Image(systemName: livephoto) .font(.system(size: 80)) .foregroundColor(.blue) .padding(.top, 50) Text(視頻轉(zhuǎn) Live Photo) .font(.largeTitle) .fontWeight(.bold) // 視頻選擇區(qū)域 VStack { PhotosPicker( selection: $selectedVideo, matching: .videos, // 只允許選擇視頻 photoLibrary: .shared() ) { Label(選擇 MP4 視頻, systemImage: video.fill) .frame(maxWidth: .infinity) .padding() .background(Color.blue) .foregroundColor(.white) .cornerRadius(10) } .onChange(of: selectedVideo) { newItem in Task { // 當(dāng)用戶選擇視頻后加載其 URL if let loadedURL try? await newItem?.loadTransferable(type: URL.self) { selectedVideoURL loadedURL videoName loadedURL.lastPathComponent statusMessage 已選擇: \(videoName) } else { statusMessage 視頻加載失敗 } } } Text(videoName) .font(.caption) .foregroundColor(.gray) .lineLimit(1) } .padding(.horizontal) // 進(jìn)度條 ProgressView(value: conversionProgress, total: 1.0) { Text(isConverting ? 轉(zhuǎn)換中... : 等待轉(zhuǎn)換) } .progressViewStyle(.linear) .padding(.horizontal) .opacity(isConverting ? 1.0 : 0.5) // 轉(zhuǎn)換時(shí)才高亮 // 轉(zhuǎn)換按鈕 Button(action: { convertVideoToLivePhoto() }) { Text(開始轉(zhuǎn)換) .frame(maxWidth: .infinity) .padding() .background(selectedVideoURL ! nil ? Color.green : Color.gray) .foregroundColor(.white) .cornerRadius(10) } .disabled(selectedVideoURL nil || isConverting) // 未選擇視頻或轉(zhuǎn)換中時(shí)禁用 .padding(.horizontal) // 狀態(tài)信息 Text(statusMessage) .font(.body) .foregroundColor(.secondary) .multilineTextAlignment(.center) .padding() Spacer() Text(提示生成的 Live Photo 將保存到系統(tǒng)相冊) .font(.footnote) .foregroundColor(.orange) .padding(.bottom) } .padding() } // 轉(zhuǎn)換函數(shù) - 核心邏輯將在下一步實(shí)現(xiàn) private func convertVideoToLivePhoto() { guard let videoURL selectedVideoURL else { return } statusMessage 開始處理視頻... isConverting true conversionProgress 0.1 // TODO: 在這里調(diào)用視頻處理函數(shù) // 為了演示我們模擬一個(gè)處理過程 DispatchQueue.main.asyncAfter(deadline: .now() 2.0) { conversionProgress 1.0 statusMessage 轉(zhuǎn)換完成請到相冊查看。 isConverting false // 實(shí)際完成后需要重置進(jìn)度 DispatchQueue.main.asyncAfter(deadline: .now() 1.5) { conversionProgress 0.0 } } } } #Preview { ContentView() }代碼解釋使用了 SwiftUI 的PhotosPicker來訪問用戶相冊選擇視頻。State屬性包裝器用于管理視圖狀態(tài)。onChange修飾器監(jiān)聽視頻選擇事件并異步加載視頻的 URL。轉(zhuǎn)換按鈕在未選擇視頻或正在轉(zhuǎn)換時(shí)會被禁用。convertVideoToLivePhoto函數(shù)目前是模擬的我們將在后續(xù)步驟填充真實(shí)邏輯。5.2 模塊二視頻處理核心類我們需要創(chuàng)建一個(gè)專門處理視頻的類。在 Xcode 中新建一個(gè) Swift 文件File-New-File...選擇 “Swift File”命名為LivePhotoConverter.swift。這個(gè)類將包含所有核心功能提取視頻片段、抓取封面圖、生成配對文件。這部分涉及AVFoundation框架如果你不熟悉可以嘗試向 Codex 提問“用 Swift 和 AVFoundation 從視頻 URL 截取中間一幀作為 UIImage” 或 “用 AVFoundation 裁剪視頻的前3秒”。以下是完整的LivePhotoConverter.swift代碼// 文件LivePhotoConverter.swift import Foundation import AVFoundation import UIKit import Photos class LivePhotoConverter { // 錯(cuò)誤枚舉 enum ConverterError: Error { case invalidVideoURL case assetLoadFailed case videoTrackNotFound case failedToExportVideo case failedToGenerateImage case failedToSaveToPhotoLibrary case livePhotoCreationFailed } /// 將視頻轉(zhuǎn)換為 Live Photo 并保存到相冊 /// - Parameters: /// - sourceVideoURL: 源視頻文件的本地 URL /// - progressHandler: 進(jìn)度回調(diào) (0.0 - 1.0) /// - completion: 完成回調(diào)返回成功或錯(cuò)誤 static func convertToLivePhoto( from sourceVideoURL: URL, progressHandler: escaping (Double) - Void, completion: escaping (ResultVoid, Error) - Void ) { // 1. 準(zhǔn)備工作定義輸出路徑 let fileManager FileManager.default let tempDirectory fileManager.temporaryDirectory let outputVideoURL tempDirectory.appendingPathComponent(livephoto_video.mov) let outputImageURL tempDirectory.appendingPathComponent(livephoto_image.jpg) // 清理可能存在的舊文件 try? fileManager.removeItem(at: outputVideoURL) try? fileManager.removeItem(at: outputImageURL) // 2. 異步處理避免阻塞主線程 DispatchQueue.global(qos: .userInitiated).async { do { progressHandler(0.1) // 3. 裁剪視頻為3秒Live Photo標(biāo)準(zhǔn)長度 let croppedVideoURL try cropVideo(sourceVideoURL, toDuration: 3.0, outputURL: outputVideoURL) progressHandler(0.4) // 4. 從裁剪后的視頻中提取封面圖這里模擬image2的“智能選幀”取中間幀 let coverImageURL try extractCoverImage(from: croppedVideoURL, outputURL: outputImageURL) progressHandler(0.7) // 5. 將視頻和圖片配對成Live Photo并保存到相冊 try savePairedFilesAsLivePhoto(videoURL: croppedVideoURL, imageURL: coverImageURL) progressHandler(1.0) // 6. 清理臨時(shí)文件可選但建議 try? fileManager.removeItem(at: croppedVideoURL) try? fileManager.removeItem(at: coverImageURL) DispatchQueue.main.async { completion(.success(())) } } catch { // 清理臨時(shí)文件 try? fileManager.removeItem(at: outputVideoURL) try? fileManager.removeItem(at: outputImageURL) DispatchQueue.main.async { completion(.failure(error)) } } } } // MARK: - 私有方法 /// 裁剪視頻到指定時(shí)長 private static func cropVideo(_ inputURL: URL, toDuration duration: TimeInterval, outputURL: URL) throws - URL { let asset AVAsset(url: inputURL) // 創(chuàng)建導(dǎo)出會話 guard let exportSession AVAssetExportSession(asset: asset, presetName: AVAssetExportPresetHighestQuality) else { throw ConverterError.failedToExportVideo } // 設(shè)置輸出文件類型 exportSession.outputURL outputURL exportSession.outputFileType .mov // Live Photo 要求視頻為 .mov 格式 exportSession.shouldOptimizeForNetworkUse true // 計(jì)算裁剪時(shí)間范圍取視頻的前duration秒如果視頻更短則取全部 let videoDuration CMTimeGetSeconds(asset.duration) let cropDuration min(duration, videoDuration) let startTime CMTime(seconds: 0, preferredTimescale: 600) let endTime CMTime(seconds: cropDuration, preferredTimescale: 600) let timeRange CMTimeRangeFromTimeToTime(start: startTime, end: endTime) exportSession.timeRange timeRange // 異步導(dǎo)出 let semaphore DispatchSemaphore(value: 0) var exportError: Error? exportSession.exportAsynchronously { switch exportSession.status { case .completed: break // 成功 case .failed, .cancelled: exportError exportSession.error ?? ConverterError.failedToExportVideo default: break } semaphore.signal() } // 等待導(dǎo)出完成 _ semaphore.wait(timeout: .distantFuture) if let error exportError { throw error } guard fileManager.fileExists(atPath: outputURL.path) else { throw ConverterError.failedToExportVideo } return outputURL } /// 從視頻中提取封面圖取中間幀 private static func extractCoverImage(from videoURL: URL, outputURL: URL) throws - URL { let asset AVAsset(url: videoURL) let duration CMTimeGetSeconds(asset.duration) // 取視頻中間時(shí)刻 let middleTime CMTime(seconds: duration / 2.0, preferredTimescale: 600) // 創(chuàng)建圖像生成器 let imageGenerator AVAssetImageGenerator(asset: asset) imageGenerator.appliesPreferredTrackTransform true // 應(yīng)用視頻方向變換 imageGenerator.requestedTimeToleranceBefore .zero imageGenerator.requestedTimeToleranceAfter .zero // 精確抓取 var actualTime CMTime.zero var cgImage: CGImage? do { cgImage try imageGenerator.copyCGImage(at: middleTime, actualTime: actualTime) } catch { throw ConverterError.failedToGenerateImage } guard let cgImage cgImage else { throw ConverterError.failedToGenerateImage } // 將 CGImage 轉(zhuǎn)換為 UIImage 并保存為 JPEG let uiImage UIImage(cgImage: cgImage) guard let jpegData uiImage.jpegData(compressionQuality: 0.9) else { throw ConverterError.failedToGenerateImage } do { try jpegData.write(to: outputURL) return outputURL } catch { throw ConverterError.failedToGenerateImage } } /// 將視頻和圖片文件作為 Live Photo 保存到系統(tǒng)相冊 private static func savePairedFilesAsLivePhoto(videoURL: URL, imageURL: URL) throws { // 這是一個(gè)異步操作我們使用信號量將其轉(zhuǎn)換為同步為了簡化示例 let semaphore DispatchSemaphore(value: 0) var saveError: Error? PHPhotoLibrary.shared().performChanges({ // 創(chuàng)建 Live Photo 資源請求 let creationRequest PHAssetCreationRequest.forAsset() // 添加視頻資源 let videoOptions PHAssetResourceCreationOptions() videoOptions.shouldMoveFile true // 移動而非復(fù)制節(jié)省空間 creationRequest.addResource(with: .pairedVideo, fileURL: videoURL, options: videoOptions) // 添加圖片資源 let imageOptions PHAssetResourceCreationOptions() imageOptions.shouldMoveFile true creationRequest.addResource(with: .photo, fileURL: imageURL, options: imageOptions) }) { success, error in if !success { saveError error ?? ConverterError.livePhotoCreationFailed } semaphore.signal() } _ semaphore.wait(timeout: .distantFuture) if let error saveError { throw error } } private static var fileManager: FileManager { return FileManager.default } }關(guān)鍵點(diǎn)解析錯(cuò)誤處理定義了詳細(xì)的錯(cuò)誤枚舉便于定位問題。異步操作所有耗時(shí)操作導(dǎo)出視頻、保存到相冊都在后臺線程進(jìn)行并通過閉包回調(diào)結(jié)果避免阻塞 UI。視頻裁剪使用AVAssetExportSession將視頻裁剪為前 3 秒Live Photo 標(biāo)準(zhǔn)時(shí)長。presetName: AVAssetExportPresetHighestQuality保證了輸出質(zhì)量。封面圖提取使用AVAssetImageGenerator在視頻的中間時(shí)刻抓取一幀。appliesPreferredTrackTransform確保了圖片方向正確。Live Photo 保存這是最核心的一步。使用PHAssetCreationRequest的addResource(with:fileURL:options:)方法分別添加類型為.pairedVideo和.photo的資源。shouldMoveFile true非常重要它會在保存成功后刪除我們創(chuàng)建的臨時(shí)文件避免占用額外空間。臨時(shí)文件管理所有中間文件都創(chuàng)建在系統(tǒng)的臨時(shí)目錄 (NSTemporaryDirectory()) 中并在處理完成后及時(shí)清理。5.3 模塊三整合與調(diào)用現(xiàn)在我們需要回到ContentView.swift將模擬的convertVideoToLivePhoto函數(shù)替換為真實(shí)的轉(zhuǎn)換邏輯。更新ContentView.swift中的convertVideoToLivePhoto函數(shù)private func convertVideoToLivePhoto() { guard let videoURL selectedVideoURL else { statusMessage 錯(cuò)誤未選擇視頻 return } statusMessage 開始處理視頻... isConverting true conversionProgress 0.0 LivePhotoConverter.convertToLivePhoto(from: videoURL) { progress in // 更新進(jìn)度條在主線程 DispatchQueue.main.async { self.conversionProgress progress self.statusMessage String(format: 處理中... %.0f%%, progress * 100) } } completion: { result in // 處理完成在主線程 DispatchQueue.main.async { self.isConverting false switch result { case .success(): self.statusMessage 轉(zhuǎn)換成功Live Photo 已保存到系統(tǒng)相冊。 self.conversionProgress 0.0 // 成功后可重置選擇 self.selectedVideo nil self.selectedVideoURL nil self.videoName 未選擇視頻 case .failure(let error): self.statusMessage 轉(zhuǎn)換失敗: \(error.localizedDescription) self.conversionProgress 0.0 } } } }6. 運(yùn)行結(jié)果與效果驗(yàn)證代碼已經(jīng)完成讓我們運(yùn)行并測試它。6.1 在模擬器中運(yùn)行基礎(chǔ)功能測試在 Xcode 頂部的 Scheme 選擇器中選擇一個(gè) iPhone 模擬器如 iPhone 15 Pro。點(diǎn)擊Cmd R運(yùn)行。應(yīng)用啟動后點(diǎn)擊“選擇 MP4 視頻”按鈕。注意模擬器的相冊可能是空的。你需要先手動拖拽一個(gè).mp4或.mov視頻文件到模擬器窗口中系統(tǒng)會詢問是否保存到照片選擇“保存”。這樣視頻就會出現(xiàn)在模擬器的相冊里。選擇視頻點(diǎn)擊“開始轉(zhuǎn)換”。你會看到進(jìn)度條變化和狀態(tài)更新。重要在模擬器上PHPhotoLibrary.shared().performChanges可能會成功但你無法在模擬器的“照片”App 中看到生成的 Live Photo模擬器對相冊的支持不完整。狀態(tài)提示“轉(zhuǎn)換成功”僅代表代碼流程走到了保存步驟。6.2 在真機(jī)上運(yùn)行完整功能驗(yàn)證這是必須的一步因?yàn)橄鄡詫懭牍δ苄枰谡鏅C(jī)上才能完全驗(yàn)證。連接 iPhone用數(shù)據(jù)線將 iPhone 連接到 Mac。配置簽名在 Xcode 項(xiàng)目導(dǎo)航器中選擇你的項(xiàng)目藍(lán)色圖標(biāo)。選擇Signing Capabilities標(biāo)簽頁。在 “Team” 下拉框中選擇你的 Apple ID 個(gè)人團(tuán)隊(duì)。Xcode 會自動為你創(chuàng)建臨時(shí)的開發(fā)證書和配置文件。選擇真機(jī)設(shè)備在 Scheme 選擇器中選擇你連接的 iPhone。信任開發(fā)者首次在真機(jī)上運(yùn)行自簽名的 App 時(shí)需要去 iPhone 的設(shè)置-通用-VPN與設(shè)備管理或設(shè)備管理找到你的開發(fā)者證書點(diǎn)擊“信任”。運(yùn)行點(diǎn)擊Cmd R。Xcode 會將應(yīng)用安裝到你的 iPhone 上。授予權(quán)限首次點(diǎn)擊“選擇 MP4 視頻”時(shí)系統(tǒng)會彈出權(quán)限請求選擇“允許訪問所有照片”或“選中的照片”。保存 Live Photo 時(shí)系統(tǒng)會再次彈窗請求“允許‘LivePhotoConverter’添加照片”點(diǎn)擊“允許”。測試流程選擇一個(gè)手機(jī)相冊里的短視頻最好時(shí)長大于3秒。點(diǎn)擊“開始轉(zhuǎn)換”。觀察進(jìn)度條和狀態(tài)。轉(zhuǎn)換成功后打開系統(tǒng)自帶的“照片”App。你應(yīng)該能在“最近項(xiàng)目”或“所有照片”中看到一個(gè)新項(xiàng)目。長按這個(gè)照片它應(yīng)該會動起來并伴有聲音如果原視頻有聲音。這就說明 Live Photo 創(chuàng)建成功了你還可以嘗試將其設(shè)置為鎖屏壁紙?bào)w驗(yàn)動態(tài)效果。7. 常見問題與排查思路在實(shí)際開發(fā)和使用中你幾乎一定會遇到下面這些問題。這里提供了詳細(xì)的排查指南。問題現(xiàn)象可能原因排查方式解決方案編譯錯(cuò)誤Cannot find ‘PhotosPicker’ in scope項(xiàng)目目標(biāo)版本低于 iOS 16。PhotosPicker是 iOS 16 的 API。檢查 Xcode 中項(xiàng)目的Deployment Target。將Target-General-Minimum Deployments設(shè)置為iOS 16.0或更高?;蛘呤褂门f的UIImagePickerController替代。真機(jī)運(yùn)行時(shí)點(diǎn)擊選擇視頻按鈕無反應(yīng)或崩潰權(quán)限描述 (Info.plist) 未配置或配置錯(cuò)誤。檢查Info.plist中是否已添加Privacy - Photo Library Usage Description。確保按照4.2章節(jié)正確添加了兩個(gè)權(quán)限描述。描述文本不能為空。轉(zhuǎn)換失敗錯(cuò)誤信息包含NSPhotoLibraryAddUsageDescription缺少“僅添加照片”的權(quán)限。檢查Info.plist。添加Privacy - Photo Library Additions Usage Description鍵值對。轉(zhuǎn)換進(jìn)度卡住長時(shí)間無響應(yīng)1. 視頻文件過大或格式特殊。2.AVAssetExportSession導(dǎo)出失敗但未觸發(fā)錯(cuò)誤回調(diào)。3. 主線程被阻塞。1. 查看控制臺 (Console.app) 有無 AVFoundation 相關(guān)日志。2. 在cropVideo和extractCoverImage函數(shù)開始和結(jié)束處添加print語句。3. 檢查是否在后臺線程執(zhí)行耗時(shí)操作。1. 嘗試換一個(gè)小的、標(biāo)準(zhǔn)的 MP4 視頻測試。2. 為exportSession設(shè)置timeout處理或檢查exportSession.status和error屬性。3. 確保所有文件 IO 和媒體處理都在DispatchQueue.global中。轉(zhuǎn)換成功但相冊里看不到 Live Photo或看到的是兩個(gè)獨(dú)立文件一個(gè)視頻一個(gè)圖片1. 保存 Live Photo 的 API 調(diào)用失敗。2. 視頻和圖片文件格式或元數(shù)據(jù)不符合要求。3.僅在模擬器上出現(xiàn)模擬器相冊功能不完整。1. 檢查PHPhotoLibrary.shared().performChanges的完成回調(diào)success是否為falseerror是什么。2. 確保視頻輸出格式為.mov。3.在真機(jī)上測試。1. 根據(jù)錯(cuò)誤信息調(diào)整代碼。2. 確保使用PHAssetResourceCreationOptions()并設(shè)置shouldMoveFile true。3.務(wù)必在真機(jī)上進(jìn)行最終功能驗(yàn)證。生成的 Live Photo 沒有聲音AVAssetExportSession的預(yù)設(shè)可能丟失了音頻軌道。檢查源視頻是否有音頻軌道檢查導(dǎo)出配置。確保AVAssetExportSession的presetName是包含音頻的如AVAssetExportPresetHighestQuality??梢燥@式檢查asset.tracks(withMediaType: .audio)。封面圖模糊或方向不對1.AVAssetImageGenerator未設(shè)置appliesPreferredTrackTransform。2. 壓縮質(zhì)量太低。檢查extractCoverImage方法中的生成器配置。1. 確保imageGenerator.appliesPreferredTrackTransform true。2. 調(diào)整jpegData(compressionQuality:)的參數(shù)例如提高到0.95。Codex/Copilot 生成的代碼有語法錯(cuò)誤或使用了過時(shí) APIAI 模型基于舊代碼訓(xùn)練或上下文理解有偏差。仔細(xì)閱讀 Xcode 的錯(cuò)誤提示和警告。1. 將錯(cuò)誤信息反饋給 AI讓它修正。2. 自己查閱蘋果官方文檔 (developer.apple.com/documentation)。3. 利用 Xcode 的 Fix-it 建議。8. 最佳實(shí)踐與工程建議將這個(gè) demo 升級為一個(gè)健壯的、可發(fā)布的 App你還需要考慮以下幾點(diǎn)8.1 性能優(yōu)化內(nèi)存管理處理高清視頻時(shí)AVAsset和AVAssetExportSession會占用大量內(nèi)存。確保在后臺線程操作并在使用后及時(shí)釋放資源。對于大視頻可以考慮分片處理。磁盤空間使用shouldMoveFile true來移動而非復(fù)制臨時(shí)文件。處理完成后務(wù)必清理所有臨時(shí)文件 (FileManager.default.removeItem)。用戶體驗(yàn)在轉(zhuǎn)換過程中禁用相關(guān) UI 控件并提供取消操作的功能。可以通過保存exportSession的引用來實(shí)現(xiàn)取消。8.2 錯(cuò)誤處理與用戶體驗(yàn)更友好的錯(cuò)誤提示將ConverterError轉(zhuǎn)換為用戶能看懂的文字而不是直接顯示localizedDescription。網(wǎng)絡(luò)視頻支持當(dāng)前僅支持本地相冊視頻??梢钥紤]支持從 iCloud 或網(wǎng)絡(luò) URL 下載視頻但這需要處理下載過程和額外的錯(cuò)誤如網(wǎng)絡(luò)中斷。格式兼容性除了 MP4測試 MOV、AVI 等格式。使用AVURLAsset的compatibleTrack進(jìn)行檢查對不支持的格式給出明確提示。8.3 擴(kuò)展 image2 的“智能”能力本文只是簡單截取中間幀。真正的“智能選幀”可以使用 Vision 框架利用 iOS 自帶的VNDetectFaceRectanglesRequest或VNDetectRectanglesRequest來識別人臉或主體確保封面圖不截到黑屏或無關(guān)背景。多幀評分每隔 0.1 秒取一幀計(jì)算其清晰度例如拉普拉斯方差、亮度、對比度選擇綜合評分最高的一幀。服務(wù)端處理如果視頻處理非常耗時(shí)可以將視頻上傳到服務(wù)器利用更強(qiáng)大的 image2 類模型進(jìn)行分析將最佳幀的時(shí)間點(diǎn)返回給 App。但這需要網(wǎng)絡(luò)和后端支持。8.4 上架 App Store 注意事項(xiàng)加入 Apple Developer Program支付年費(fèi)。完善 App 元數(shù)據(jù)圖標(biāo)、截圖、描述、關(guān)鍵詞、隱私政策鏈接。處理 App Store 審核指南功能明確說明 App 的核心功能是視頻轉(zhuǎn) Live Photo。不要誤導(dǎo)確保生成的是真正的 Live Photo而不是偽動態(tài)圖。隱私在Info.plist中準(zhǔn)確聲明照片庫權(quán)限并考慮在 App 內(nèi)再次解釋為何需要此權(quán)限。版權(quán)在用戶協(xié)議中聲明用戶應(yīng)僅轉(zhuǎn)換其擁有版權(quán)的視頻。測試在各種型號、系統(tǒng)版本的 iPhone 和 iPad 上進(jìn)行充分測試。9. 總結(jié)與后續(xù)學(xué)習(xí)方向通過這個(gè)項(xiàng)目我們完成了一次從設(shè)計(jì)到實(shí)現(xiàn)的完整旅程。你不僅得到了一個(gè)可用的工具更重要的是掌握了一套方法問題拆解將“視頻轉(zhuǎn) Live Photo”這個(gè)模糊需求拆解為文件讀取、視頻裁剪、圖像抓取、相冊寫入等具體技術(shù)任務(wù)。AI 輔助開發(fā)合理利用 Codex/Copilot 等工具生成樣板代碼、解釋復(fù)雜 API將你的精力集中在核心業(yè)務(wù)邏輯和架構(gòu)設(shè)計(jì)上。框架深度使用深入使用了AVFoundation媒體處理和Photos相冊交互這兩個(gè) iOS 核心框架了解了關(guān)鍵類如AVAssetExportSession,AVAssetImageGenerator,PHAssetCreationRequest的用法。工程化思維考慮了錯(cuò)誤處理、異步編程、內(nèi)存管理、臨時(shí)文件清理、權(quán)限申請和用戶體驗(yàn)。下一步你可以做什么美化 UI使用更精美的 SwiftUI 組件添加視頻預(yù)覽、封面圖預(yù)覽功能。增加高級功能讓用戶手動選擇視頻片段范圍、自定義封面圖、調(diào)節(jié) Live Photo 的靜音/有聲狀態(tài)、批量轉(zhuǎn)換。探索 Core ML將簡單的中間幀選取替換為使用 Core ML 運(yùn)行一個(gè)輕量級圖像質(zhì)量評估模型實(shí)現(xiàn)真正的“智能選幀”??缙脚_思考這個(gè)想法在 Android 上如何實(shí)現(xiàn)Android 有類似 Live Photo 的“動態(tài)照片”嗎產(chǎn)品化如果你對這個(gè)工具感興趣可以按照8.4的指南完善它并嘗試上架 App Store看看用戶的反饋。開發(fā)的過程就是不斷將想法拆解、搜索、學(xué)習(xí)、實(shí)驗(yàn)和整合的過程。這個(gè)項(xiàng)目是一個(gè)完美的起點(diǎn)。希望你能在此基礎(chǔ)上創(chuàng)造出更棒的作品。建議收藏本文在遇到類似的多媒體處理需求時(shí)可以回來參考這里的實(shí)現(xiàn)思路和避坑指南。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
丁香五月天成人网站| 欧美精品999| 91九色精品女同系列| 一本久久亚洲五月婷婷| 一级AV片| www.亭亭五月天| 欧美成人AAA片一区国产精品| 婷婷久久综合久| 99色婷婷视频| 久久 这里只有精品1| 操91| 婷婷情色激情| 超碰97人人操| 五月婷婷久久久久| 中文字幕永久在线| 97综合在线| 欧美性爱五月天| 亚洲久热| 一起草性爱不卡视频| 五月丁香婷色| 国产成人精品一区二三区熟女在线| 综合五月天亚洲婷婷| 婷婷成人视频| 丁香五月天堂网| 天天狠狠婷婷在线| 激情丁香久久| 九九色网专区| 国产超碰在线| 五月婷婷激情综合| 色五月婷婷在线| 久热这里只有精品性色AV| 亚洲无AV在线中文字幕| 婷婷射综合| 看黄的网站18禁| 日韩AV在线免费| 中文成人在线| 久久99成人性爱高清视频| 日韩淑女人妻luan伦激情精品一区二 | 婷婷五月丁香综合亚洲| 99re热精品视频国| 97婷婷丁香五月天激情图片| 激情婷婷在线中文字幕| 久久婷婷青青| 午夜精品人妻无码一区二区三区| 五月天婷婷基地| 色永久| 色婷婷香蕉| 成人五月丁香花| 色五月色五天色情网| 亚洲精品乱码久久久久久按摩观| 久婷久婷| 激情婷婷丁香色五月| 九九99精品视品| 人人摸人人操人人爽| 欧美色小说婷婷| 91日本在线观看| 999九九九久久久99HD| www.夜夜操| 色色性爱视频| 26uuu欧美日本| 五月四色婷婷| 五月天啪啪啪| 五月婷丁香| 思思热在线视频99| 开心综合激情综合| 操逼视频一区| 超碰色综合| 天天肏天天肏天天肏| 伊人丁香花综合影院| 九九热欧美| 一区=区操屄高清大全av| 97色五月丁香婷婷| 色黄啪啪| 婷婷六月综合基地| 亚洲美女高潮久久久久久69| 极品少妇高潮啪啪AV无码| 超碰九九热| 婷婷操婷婷干婷婷射| wwwC0maV五月花| 五月丁香色婷婷伊人| 激情婷| 天天操五月天| 爱操人妻| 五月丁香花婷婷玉莉AV| 思思热视频| 99热超碰在线| 九 九九九AV| 开心五月婷婷婷美女| 天天操天天日天天爱| er99免费视频在线| 亚洲狠狠干| 五月天伊人综合| 天天爱天天狠天天透| www婷婷| 国产免费一区二区在线A片视频| 五月婷婷大香蕉| 99免费视频| 久久婷婷六月综合综合| 国产免费av在线| 久久这里只有精彩| 综合99综合久久久久久久| 激情五月天小说网| 黄色AAAAAAA| 九九自拍网| 色优久久| 久久婷婷亚洲| 婷婷色五月大香蕉在线| 久久久www| 噜噜噜色噜噜| 丰满女老板BD高清A片| 久久国产高潮白浆免费观看99| 超碰超碰在线| 色情一区二区播放| 欧美操人| 99精品国产在热久久| 在线观看熟女少妇| 91丨九色丨东北熟女| 色婷婷色综合久久精品V| 99热加勒比| 色10月婷婷视频| 欧美性色五月天| 丁香色六月婷婷| 久久久婷婷五月天| 九九热这里只有国产精品| 99热在线播放| 六月婷婷AV| va中文资源在线观看| 99色一| 超碰91在线| Av在线资源| 婷婷永久在线| 亚洲激情另类| 天天拍夜夜撸 | 国产精品久久..4399| 久色精品| 五月天久久婷婷| 丁香五月婷婷俺也要去| 99只有精品| 五月天堂色| 婷婷五月天激情免费在线观看| 亚州美女| 婷婷五月天成人网| 激情视频综合| 亚洲精品成人| 99这里有精品| 色婷婷影音| 天天日天天插| 婷婷五月天99| 久草视频大香蕉99| 五月丁香亭亭| 色久播播| 91九色偷拍| 五月丁香六月婷婷免费| 丁香婷婷激情网站| 五月婷婷丁香五月婷婷丁香| 182TV亚洲| 涩涩网五月天| 久草嫩草在线观看| www婷婷| 另类A片| 久久综合丁香| 婷婷丁香五月天欧美| 色五月激情综合网| 丁香色五月直播| 五月激情六月综合| 99热9| 日韩aaa| 日本老女人黄页在线播放| 久久久久婷婷| 色婷激情网| 秋霞少妇AV网站| 五月丁香成人| 天堂A∨在线| 97碰| 欧美日韩成人综合9| 色五月激情综合网| 国产日产亚系列精品版优势| 深爱婷婷色| 亚洲黄色网址| 婷婷中文在线| 操嫩逼电影| 91亚洲视频| 五月丁香六月色| 综合久久婷婷99| 色婷婷综合视频| 欧美操逼天堂| 狠狠搞狠狠操| co超碰在线观看| 青青草成人网| 丁香六月婷婷高清| 超碰在线免费| 超极99精品| 九九干视频| 丁香亭亭久久| 五月天婷婷操逼视频| 日本熟女视频一区二区| 亚洲一级AV在线免费播放| 五月停停色色丁香| 色色COm| 色99热| 色噜噜狠狠色综无码久久合欧美| 极品另类| 五月停停激情网| 亚洲av免费在线| 丰满少妇猛烈A片免费看观看| 开心婷婷五月天激情网| 成人在线观看一区| 亚洲色五月婷婷| 夜夜爽天天日| 天天激情夜夜干| 91综合视频丁香| 国产婷婷五月| 大学生高潮无套内谢视频| 五月天狠狠草| 26UUU亚洲欧美| 九色在线五月婷婷网址| 五月开心网| 99免费| 五月丁香美女| 1024你懂的欧美曰韩| 思思re99视频在线观看| 亚洲色图五月丁香| 婷婷五月激情六月| 精品亚洲VA网站| 五月丁婷香| 色月丁| 欧美槡BBBB槡BBB少妇| 激情图片五月天| 激情五月综亚网| 51XX午夜影福利| 日韩人人操| 丁香五月婷婷视频| 日日夜夜爽| 五月天无码视屏播放| 色婷婷97| 五月激情视频| 天天艹天天综合网| 激情综合啪啪啪| 七七九色| 五月天激情亚洲| 99热网址| 中文字幕人妻在线| 色欲天天综合网| 五月丁香成人视频| 久热91精品| 天天爽天天操| 国产成人AV在线| 五月天婷婷丁香基地在线观看| 天天久久综合| 婷婷五月六月丁香综合| 亚洲视频99| 99热这里只有精品无码| 五月六月婷| 天天日天天爱天天噪| 91seav| 婷婷丁香成人五月天| 最近韩国日本免费高清观看| 92久久精品一区二区| 色区久久| 丁香情色五月| 97超碰欧美中文字幕| 97干在线免费| 五月丁香大相交| 99人人干人人| 99人这里只有精品| 激情另类综合| 亚洲激情网站| 婷婷刺激综合| 国产亚洲在线| 超碰啪啪网| 888久久久| 丁香熟女乱| 色婷婷久久视屏| 婷婷色五月大香蕉在线观看| 色综合色综合婷婷热| 深爱五月婷婷开心中文字幕| 国产精品久久7777777精品无码| 日日日天天干| 婷婷五月天久久久| 久久色大香蕉| 二色AV| 色丁香五月婷婷婷| 直接看的AV| 99久精品视频| 国产精品扒开腿做爽爽爽A片唱戏| 九九日伊人| 日本wwww在线| 噜噜色五月| 激情五月六月丁香| 丁香花五月天激情| 中文字幕丰满乱孑伦无码专区 | 狠狠五月激情丁香六月| 月月AV| 影音先锋一区二区三区| 九九草热在线观看| 99九九99九九九视频精彩| 五月亭亭开心网| 天天色综网| CAoub青青超碰| 青青草Avb在线| 99在线视频播放| 五月丁香网站在线播放| 91狠狠综合久久| 久久黄色片| AV动漫不卡无码免费| 日本无va视频| 99色婷婷| 色色网91| 人妻 性久久久久久| 99热碰碰| 亚洲最大视频网站| 另类国产综合| www.超碰在线| 色五月成人| 99热99re6国产在线播放| 玖玖爱资源站| 久久精品天| 激情综合五月激情XXXX| 丁香五月另类色婷婷麻豆| 五月天激情色色| 国产成人综合在线| 亚洲成人网站在线播放| www.91AV.com| 99热这里只有精品最新网址| 国产做爰视频免费播放| 五月丁香好婷婷姑娘综合网| 性爱综合网| 婷婷伊人綜合中文| 大香蕉啪啪啪| 五月婷婷影院| 另类激情五月| 99热国内精品| 综合99久久| 停停五月丁香| 少妇2做爰HD韩国电影| 久久婷婷啪啪视频| 99日在线视频| 99在线视频播放| 丁香色综合| 777影视理论片大全在线观看| 婷婷涩五月| 激情婷婷五月| 狠狠色大香蕉| 久久天堂| 99色综合网| 婷婷五月天社区| 色五月色五天色情网址| 五月天狠狠| 99九九这里有免费视频| 色婷婷激情五月天| 天堂久久大香蕉| 十月丁香九月婷婷综合| 99碰在线视频| 婷婷九月综合| 99精品在线观看| 99综合网| 99er免费在线观看| 久久91久久精品久久| 99在线视频精品| 亚洲精品一区中文字幕乱码| 99re这里有精品手机在线| 日韩成人无码| 日日夜夜爽| 色综合久久8| 毛片色五月| www.久久99精品| 99热这里只有精品最新| 金品在线视频99| 99热成人| 午夜丁香丁香婷婷| 婷婷丁香熟女| www.色婷婷| 五月丁香婷草| a久久| 99热久只有| 少妇搡BBBB搡BBB搡毛茸茸| 天色综合网站| 91丨九色丨老农村| 九九热免费视频| 国产99精品免费视频| 极品少妇XXXX精品少妇偷拍| 久色欧美| 色婷婷手机在线| 日韩成人网址| 亚州操人在线视频| 色 免费网站视频| 亚洲操逼网| 午夜电影网VA内射| 99久久国产综合精品五月天喷水\| 色播丁香婷婷五月激情| 激情爱爱网站超大免费| 国产欧美日韩综合精品一区二区| 激情五月六月婷婷| 99这里只有精品视频免费| 丁香五月大香蕉| 色五月丁香伊人| 182TV亚洲| 99色色网| 色情久久久| 夜夜骑日日操| 九九色色色| 久久久天堂国产精品女人| 色婷婷a三区麻| 玖玖色资源| 久久九色| 九热免费视频| 可以直接看的AV网站| 亚洲小电影在线观看黄999| 色五月激情网| 激情五月天色网站| 五月婷婷六月丁香在线视频| 免费色色色| 日韩天堂久久| 精品人妻午夜一区二区三区四区| 五月天丁香网站| 婷婷中文字幕版| 欧美三级黄色片久久| 成人午夜视频精品一区| 色婷婷电影| 91精品综合久久久久久五月丁香| 99人这里只有精品| 色色婷婷丁香| 欧美色色色色色色色色色色| 婷婷五月日本| 7777国产盗摄农村女人| 99∨VTV| 99在线热| 99.N在线视频| 亚洲操B| 亚洲五月丁| 久久久WWW| 9色免费网| 99精品偷自拍| 色五月婷婷五月天| 99人人干| 人人操AV| 五月丁香香蕉| 久久九九国产精品怡红院| 五月丁香成人小说| 99无码黄色视频| 九九热在这里只有精品| 伊人在线婷婷草| 亚洲精品色色| site:xiongshengzz.com| 狼人婷婷综合| 91婷婷搞| 黄色AV日韩| 91人人操| 91九色熟女| 欧美久人人| 久热精品9999| 色情五月天导航| 思思干精品| 久久九九激情五月天 | 亚洲色就是色色色| 免费看成人AA片无码视频吃奶| av人人干| 噼里啪啦在线观看免费完整版视频 | 五月天激情小说| 99无码视频| 中文字幕在线不卡| 99热97| 五月激情六月综合| 这里有精品| 99爱精品| 日韩啪啪视品| 激情丁香久久久久久| 韩日AV片| 成人网在线视频| 六月婷婷啪啪| 天天情天天狠天天透| 啪啪啪大香蕉| 99精品视频在线| 天天综合天天玩夜夜玩天天玩夜夜玩 | 婷婷五月激情五月激情| 免费黄色片子| 色五月婷婷在线观看第一页舔| 欧美情色一区| 日本99视频精品免费播放| 五月天社区婷婷丁香社区| 婷婷九月综合| 久热这里有精品视频| 五月香蕉婷婷| 天干夜夜操| 丁香六月激情综合| 婷婷操逼| 国产免费av网站| 九九综合网色全集 | 99九九精品视频| 一级性爱视频| 俺去也五月天| 激情电影五月婷婷| 91久久久久久久| 爱之国产色情综合| www.五月.com| 91色久| 成人久碰| 五月丁香成人网| 婷婷在线午夜| 91操片| 婷婷99狠狠躁天天躁| 婷婷伊人综合| 五月丁香久人妻中文| 激情综合婷婷| 国产免费一区二区三州老师F1F1| 国产肥白大熟妇BBBB视频| 日本97人人| 99热久| 五月花亭亭| 色久女| 国产美女无遮挡裸体毛片A片| 日韩无码亚欧无码| 99成人精品六| 91人人网| 婷婷狠狠爱| 热九九在线| 综合久久五月天| 丁香五月天婷婷激情| 日韩有码一区| 婷婷综合成人五月天| 激情图片久久| 五月丁香天堂| 丁香花五月天| 欧美黄色AA片哗啦啦啦| 99在线热视频| 这里精品| 国产看真人毛片爱做A片| 美欧日韩国产成人在战| 午夜婷婷五月天| 日本三级韩三级99久久| 久久久五月五丁香| 色色亚洲视频| 色情网综合| 在线区区区| 久99视频在线观看| 亚洲第一av| 天天操夜夜玩!| www.操.com| 色婷婷丁香九月| 四月婷婷丁香| 色五月色综合| 天天日日天天| 五月天激情小说网| 九九黄色网| 五月天成人在线播放| 狠狠婷婷日韩| 天天操天天日天天操| 99性爱| 色碰碰| 久色大| 美女xx不卡| 色五月丁香五月婷婷五月成人网| 五月天丁香婷婷视频网址| 77799热| 中文字幕 中文字幕明步| 中文字幕,综合,91| 色五月婷婷基地| 99久久五月婷婷| 开心五月综合| 久久99免费视频| 色久五月天| 色婷婷av综合网| 丁香婷婷成人在线播放| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 天天色域综合网| 激情五月丁香五月色| 天天操九九插| A短视频免费在线观看| 激情五月综合免费| 九九9久九9国产视频| 九九热区一区二区三区| 色九九中文字幕| 欧美激情-区二区三区| 婷婷丁香中文字幕| 丁香五月五月婷婷| 亚洲综合无码| 99热这里只有精品8| 五月丁了香蕉综合| WW婷婷五月天com| 九九色视频| 日韩精品无码AV| 91久久五月天| 影音先锋xfplay资源男人网| 天天射影院| 综合激情深爱| 人伦30P| 天天爽天天操| 米奇影视五月天| 成人网站高清无码| 久热九九| 婷婷狠狠五月综合| 综合五月丁香97| 91色噜噜狠狠狠狠色综合| 蜜臀丁香黄色婷婷五月天| 丁香六月激情综合| 九九精品在线网| 操久久精| 中文字幕丰满孑伦无码专区| 99热99热在线| 激情五月丁香五月| 激情五月深爱五月观看| 激情婷婷丁香五月| 丁香久月| 综合久久丁香婷婷,五月婷婷六月丁香,开心激情综合网,六月丁香在线观看,婷婷丁 | 4438国产免费看| 五月色网| 97luluse| 五月丁香人妻| 婷婷五月天色综合| 综合久| 香蕉AV777XXX色综合一区| 六月激情婷婷| 操操操av| 9久热在线视频精品| 丁香六月天| 人人草开心五月天| 天天在线久久综合| 外国碰视频网站97| 欧美,日韩成人在线| 超碰在线成人| av性爱网站| 天天搞夜夜叫| 91在线操| 精品热青草| 午夜五月天| 岛国AV网站| 五月婷婷 欧美| 婷婷五月天丁香激情| 99色色网| 人人爱操| 99无码| 99色播| 大香蕉520| 五月丁香中文婷婷中文| 成人 在线观看国产| 色播婷婷大香蕉| 亚洲综合婷婷六月丁香五月| 开心深爱五月天| 五月香蕉婷婷| 九九综合88| 午夜天堂一区人妻| 99爱在线精品视频免费观看| 99热这里都是精品| 五月天激情亚洲| 丁香色播五月天| 色性综合| 成人日韩欧美| 中文无码婷婷| 九九热视频99| av激情在线| 九热视频在线伦| 青草青草视频2免费观看| 大香网伊人久久综合| 久久久久久久人妻| 色五月婷婷小说亚洲中文字幕组| 99爱在线视频观看| 欧美婷婷丁香社区在线播放| 婷婷97狠狠成人网站| 色99网站| 99热这里只有精品首页| av大香蕉| 深爱激情六月天| 国产综合色婷婷精品久久| 99综合网| 九热精品| 大香蕉人妻| 91啪啪| 五月丁香六月婷婷久久| 婷婷丁香五月天激情| 色婷婷电影| 丁香五月播播| 在线不卡视频| 成人无码精品1区2区3区免费看| 丁香五月天激情综合| 色婷婷丁香五月天| 免费看欧美成人A片无码| 午夜天堂一区人妻| 万月丁香狠狠爱| 日本黄色一级| 热久91| 日本毛片内射| 久久色天堂| 婷婷五月色播网| 欧美久草在线日本一级特黄大片做受9在线观看韩国电影《两个女人》未删减-毛片 | 色五月综合在线| 色视频五月天| 婷婷丁香花五月天| 色五月五月婷婷| 99色色| 播丁香五月婷婷欧美| 久久婷五月影院| 九月av在线| 欧美综合五月丁香六月婷| 99久久久久| 免费精品66| 激情激情激情网| 九九这里都是精品| 五月丁香综合激情| 免费观看欧美成人AA片爱我多深| 天天综合网~91| 啪啪操操| 精品色情一区二区三区四区| 99热在线观看这里只有精品| 激情九九六月激情免费视频| 久久久中文| 亚洲六月色| 天堂爱啪啪| 综合亚洲色色| 日本色色色| 深爱激情六月天| 99免费超碰在线| 欧美日韩成人高清在线| 激情五婷精品网在线观看网址| 国产精品久久久久久五月天加勒比| 亚洲精品大片| 成功精品影院| 九九色院| 开心激情久久久久久久| 在线成人网址| 久久这里只有精品视频15 | 中文字幕丰满乱孑伦无码专区| 青青草婷婷综合五月| 激情人妻综合| 天堂呦 呦百度搜索-百度搜索| 日韩 中文 欧美| 成人狠狠成人狠狠成人狠狠成人狠狠 | 天堂草在线看www| 激情五月丁香五月| 色婷婷文字幕| 婷婷五月激情欧美大胆视频| 99久久婷| 极品少妇婷婷五月| 就爱操www com| 激情综合九月| 日韩成人无码片| 综合在线网| 五月丁香花视频| 波多婷婷久久| 蜜桃婷婷丁香五月天狠狠久久综合| 人妻久久久| 婷婷大香焦| 婷婷成人综合| 日本一级一片免费视频 | 91视频精品99| 婷婷六月丁香欧美视频在线| 亚洲精品又粗又大又爽A片| 丁香六月婷婷综合激情欧美| 亚洲视频色婷婷| 91 影音先锋| 天天综合激情| 色综合色| 欧美综合五月丁香六月婷| 五月天色婷婷网| 欧美性生交XXXXX无码小说| 狠狠干综合| 九热...av| 日韩AV中文字幕在线| 亚洲色A| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 狠狠色丁香久久久婷| 五月天丁香婷| 欧美人久久| 99视频在线| 热久久婷婷| 俺去啦综合网| 欧美一级a | 五月 丁香 欧美| 五月大香蕉| 人妻射精AV| 久色视频| 天天激情综合| 天天干天天做| 婷婷五月丁香激情色情| 国产国产乱老熟女视频网站97| 色五月丁香五月五月婷婷| 激情五月天综合| 午夜婷婷丁香| 综合色播| 99精彩视频在线观看| 中文字幕 中文字幕明步| 深爱激情五月天色婷婷| 日本一级淫| 色婷婷五月天综合网| 激情影院69| 五月天激情www| 五月亭大香蕉| 大香蕉啪啪| 婷婷五月天国产精品| 色色热| 狠狠狠狠狠狠狠狠狠狠狠色宗合图片| 国外亚洲成AV人片在线观看 | 丁香五月成人| 五月天婷婷爱丁香中文字幕| 五月天激情美女久久| 婷婷五月18永久免费视频| 丁香五月WWW| 日韩av在线电影| 色婷婷五月开心六月综合| 操碰91| 亚洲婷婷激情888精品久| 人妻有码乱操| 丁香五月手机在线| 好吊操这里只有精品| 欧美激情综合五月色丁香| 五月丁香六月婷婷的女人| 99精品女人天堂| 五月色综合| 色五月天成人在线| 色婷婷综合在线| 丁香五月天堂| 婷婷天天综合| 9999热在线免费观看| 99久热| 蜜臀嫩草| 97碰| 色婷婷丁香女女| 婷婷的色色五月天| 另类综合激情| 一本色道久久综合狠狠躁小说| 久热9| 激情九九综合网| 综合色影| 色www久视频| 五月天社区| 天天草婷婷五月| av免费在线网站| 狠狠色婷婷| 99热久| 九九九九九无码| 十区av| 成人国产欧美大片一区| 五月丁香六月婷婷激情网| 五月丁香婷婷无码中文| 伊人热婷婷| 激情久久久| 人妻少妇色综合| 五月丁香婷婷激情久久| 玖玖爱综合网| 涩丁香91| 99无码视频| 欧美99视频| 色综合网综合| 色久播播| 五月婷婷丁香啪啪| 色欲AVV| 婷婷色六月| 日本丁香五月| 亚洲va欧美va国产综合久久久| 婷婷伊人綜合中文字幕小说| 五月丁香888| www,黄色在线,con| 思思热视频在线| 狠狠色成人影片| 婷婷射图五月天| 激情六月下句是什么| 久操干| 五月婷婷先锋| 日本视频不卡123区| 狠狠干夜夜干| 97碰久久| 日本久久人| 91婷婷五月天嫩女| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | www.色婷婷| 大香蕉久久| 激情五月天综合网| www.日日夜夜.com| 色综色五月天婷婷| 天天综合色综合| 精品一二三区视频立| 五月丁香综合在线| 婷婷色六月| 婷婷九九色| 丁香六月婷婷基地| 国精产品一区一区三区免费视频| 五月婷在线观看| 九九RE视频在线精品| 99热网址| 大香蕉伊人99| 涩综合网| 97久久久久| 99热在线精品观看| 婷婷色在线视频| 97色色网| www.黄色片-久久成人国产精品在线播放-999AV| 影音先锋777xfplay色资源网站| 丁香五月六月欧美| 丁香五月天BBw| 亚洲 小说 欧美 激情 另类| 亚洲综合色丁香五月天| 九九热这里只有精品12| 天天碰天天插天天操| 久久久精久人妻| 欧美激情-区二区三区| 天天夜夜六月丁香五月婷婷老师| 亚洲综合婷婷五月天| 婷婷五月激情欧美大胆视频| 丁香五月激情视频在线| 欧美婷婷五月| 亚洲激情五月天| 六月婷婷色综合| 91丨九色丨熟女| 色婷婷综合网站| 五月婷婷色| 成人无码髙潮喷水A片| 日韩一区二区A片免费观看 | 日日射天天射| 九九热这里只有精品在线观看| 久久成人人妻| 久色激情| 天天插天天干| 丁香六月在线综合| 99久久色| 97操在线视频| 精品婷婷五月天| 久久婷婷五月综合色丁香| 五月激情婷婷国产精品久久久久久 | 六月婷婷日| 91精品久久久久久综合五月天| 日日撸夜夜操| 97人人射| 婷婷丁香日韩五月| 懂色av蜜臀av粉嫩av永陈冠希| 久久多色| 五月社区婷婷激情| 五月天婷婷激情在线色图| 亚洲天堂爱爱| 荫道BBWBBB高潮潮喷| 综合精品啪啪| 丁香婷婷人妻| 国产色99| 婷婷伊人网| 综合福利网| 97干在线观看| 亚洲综合网激情小说| 天天久综合| 一级性爱视频| 婷婷99狠| 亚洲小视频免费观看| 色婷婷色人人射| 丁香五月区| 午夜不卡久久精品无码免费| 1区2区视频| 蜜乳.comcom| 久久丁香五月| 五月天婷婷色| 久艹大香蕉| 婷婷四色五月| 久久婷婷伊人| 婷婷五月激情小说| 激情五月婷黄版| 天天干狠狠| www.色婷婷| 色综合狠狠色| 亚洲性爱99在线| 久久香蕉影院| 超碰中文字幕在线| 丁香五月婷婷亚洲综合精品在线| 色色色色色色色色色色色色色97| 国产精品日本一区二区在线播放| 香蕉婷婷色五月| 色色综合视频| 欧美操人| 欧美三级欧美一级| 天天舔天天操| 色狠狠色噜噜AV天堂五区| 伊人激情综合网| 色色性爱视频| 色六月 婷婷| 99re这里只有精品9| 狠狠干婷婷| 日逼影音先锋男人资源站| 九九爱这里只有精品| 婷婷午夜精品久久久| 丁香九色不卡aaa| 日本成人噜噜噜噜噜| 九九热在线观看视频| 月婷婷婷婷五月| 综合色在线| 79亚洲精品少妇| 久操操| 久久刺激网| 丁香五月在线观看| 色婷婷久久9.com| 伊人五月人妻精品| 99热色精品| 五月6香色婷婷视频| 少妇搡BBBB搡BBB搡毛茸茸 | 国产免费av网站| 激情小说之五月| 内射人妻视频国内| 丁香五月AV综合| 深爱激情综合网| 久久刺激网| 亚州操操| 久综合| 久久9精品视频| 丁香五月婷婷五月| 五月婷婷av| 五月婷婷,六月婷婷| 性色视频| 久久久久久久,99精品视频| 色婷婷六月开心中文字| 日本熟妇乱妇熟色A片蜜桃| 99热久只有精品首页| 97操操| 婷婷五月丁香五月丁香| 精品色色| 精品一二三区视频立| av九九| 久久婷婷五月草视频在线播放| 亚洲激情av| 激情五月婷婷网在线观看| 99热66| 开心日韩丁香婷婷五月| 大香蕉色婷婷伊人在线| 婷婷丁香激情五月天色色| 天天色中文字幕女优AV| 色五月天视频| 9色操| 99热精品在线在线| 97精品在线| 激情五月天在线视频| 天天日天天添| 久久久GOGO无码啪啪艺术| 91婷婷五月天综合视频| 99热草草| 人人草人人舔| 久久婷婷五月天激情新地址| 欧美大片免费播放器| 色色色色色色综合| 亚洲久艹| 久久99精品视频| 99激| www.cao.com久久| 九九热免费视频| 伊人激情| 日本eVa一区=区视频| 亚洲色情网站| 久久五月激情| 少妇性BBB搡BBB爽爽爽电影| 可以观看的AV| 97婷婷狠狠| 搡BBBB搡BBB搡18| 99re最新地址| 亚洲无线视频| 亚洲精品白浆高清久久久久久| 可以免费看AV网站| 丁香六月婷婷久久高清| 婷色五月| 色婷婷婷婷| 午夜婷婷丁香| 区欧美日韩成人| 成人五月天丁香| 综合在线丁香五月| 五月婷婷综合性爱噜噜| 婷婷五月色| 99re思思热久久| 五月婷婷深深的爱| 色综合77777| 黄色五月婷婷| 色五月六月婷婷| www.91九色| 婷婷丁香九色| 五月婷久久| 这里只有精品9| 精品久热| 97ai婷婷| 五月丁香六月激情| 色婷久久| WWW五月天| 久操干| 日韩在线看AV| 另类视频一区| 久色欧美| 欧美丁香六月在线观看视频| 99人人操人人操人人精| 五月丁香婷婷啪啪综合网| 99资源在线视频| 激情小说色五月| 五月婷婷AV| 99热这里只有精彩| 性 色 婷婷| 久久精品4| 五月激情婷婷四射| 欧美交换配乱吟粗大25P| www.久久久久久久| 狠狠五月激情丁香六月| 99re热| 国产成人网站在线观看| 婷婷中文字暮| 激情婷婷丁香五月| 亚洲午夜AV| 六月婷婷激情图片| 九九婷婷网五月天| 婷婷五月色综合| 激情5月婷婷狠狠干| 97人人看| 99色在线观看视频| 激情综合另类| 综合欧美五月婷婷| 激情六月天| 天天狠天天叉| 色婷婷综合久久久久| 99re这里只有| 久久A V无码视频| 五月丁香伊人网| 天天人人天天爽| 亚洲艹网| 日本久久99| 99色干| 婷婷激情六月综合| 亚洲成人九九九| www亚洲无码| 亚洲成人av在线观看 | 99啊精典免费视频| 六月丁香开心婷婷欧美| 高清免费在线视频| 热热色色五月天婷婷| 精品欧美一区二区三区久久久| 色色a| 思思久久精品| 婷婷爱五月天| 99热国产免费| 五月婷婷丁香| 丁香六月激情综合| 婷婷色综合| 成人无码髙潮喷水A片| 久久丁香| 成人精品视频99在线观看免费 | 亚洲精品444久久久久久| 婷婷久久欧美| 色色丁香色五月| 色久99| 亚洲无码yw| 六月色播| 99 热国产在| 亚洲综合激| renre人人操国产超碰在线| 6080av| 色色网五月激情| 婷婷五月天综合久久| 91无码高清| 五月婷婷av| 伊人婷婷五月天| 亚洲视频一区| 中文不卡av| 久久一级片| 久色网址| 婷婷久久夜| 成人九九视频| 色综合色| 婷婷久久综合久| 国产精产国品一二三在观看| 99国产精品久久久久久久久久久| 日本V在线观看不卡视频网站| 久久久亚洲成人无码A片| 六月丁香激情| 亚洲激情AV| 五月色婷婷综合丁香精品无遮挡| 国语精品探花| 大香蕉久热| 99久视频| 日韩国产AV播放| 婷婷综合视频| 六月激情婷婷色| 欧美VA在线观看| 91丨九色丨熟女| 午夜激情久久| www.久久久久久久| 色色色色网站| 日韩AV中文在线观看| 亚州第一A片| 成人午夜无码视频| 九九热这里只有精品12| 五月婷婷亚洲| 饮料下药迷倒漂亮女同事强干| 国产精品久久久爽爽爽麻豆色哟哟| 久久99日本精品视频免费观看| 久久九九爽| 欧美猛片| 五月丁香久| 内射在线CHINESE| 亚洲黄3级片网站欧美| wWwCom夜操wwW| 天天天天天久久久久久| 久久综合五月天| 亚洲精品一二三| 婷婷欧美综合| 99久久99热这里只有精品| 99人妻碰碰碰久久久久视| 性做久久久久久久免费看| 一区二区三区XXXXXX| 夜夜躁狠狠| 天天做天天爱天天高潮| 少妇性BBB搡BBB爽爽爽电影| 无码动漫av| 婷婷五月精品在线| 丁香五月婷婷激情网| 99综合色色色| 99色色热热| 亚洲激情婷婷| 国产69久久久欧美黑人A片 | 成人五月丁香社区| 97日本在线播放| 91chinese在线| 丁香婷婷深情五月亚洲| 亚洲精品字幕在线观看| xx久久| 天天操夜夜爽| 91久久婷婷| 97在线/亚洲| 97丁香五月| 亚洲国产无线乱码在线观看| 五月天久久www| 99色免费观看全部| 国产精品人成A片一区二区| 色天堂A| 色婷婷成人五月| 亚洲国产精品VA在线看黑人| 丁香五月天堂网| 五月天色五月| 丁香狠狠色婷婷久久无码视频| 丁香六月天婷婷在线| AV在线观看网站| 久久一级片| 丁香六月天堂| 日本一级淫| 怕怕av| 婷婷六月激情| 天堂久久精品| 超碰人人干| 中文字幕在线资源| 亚洲婷婷丁香五月| 性生活久久朋友人妻| 熟女人妻一区二区三区免费看| 性韩日色婷婷五月天激情啪啪XXX| 超碰网站在线观看| 996热re视频在线观看视频| 天天狠狠色噜噜| 国产欧美日韩综合精品一区二区| 天天操天天爱天天日| www婷婷| 婷婷97碰碰| 六月色播| 欧美日本国产欧美日本韩国99| 五月丁香六月情| 久草视频大香蕉99| 色五月丁香伊人| 99热国产在线| www久热com| av婷婷丁香| 五月天激情AV| 超碰永久在线| 丁香六月色婷婷| 五月天婷婷丁香人人操91| 中文在线视频久1| 9精品国产在热久久| www.久久av.com| 区啪精品| 色色色综合| 日本在线视频播放91| 亚洲AV网站| 五月婷丁香花| www.五月天| 人人看人人摸人人|