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

ARTICLE DETAIL

資訊詳情

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

Flutter 2.8.1下官方video_player插件集成與踩坑完整指南

Flutter 2.8.1下官方video_player插件集成與踩坑完整指南 很多人一提到“Flutter播放視頻”第一反應(yīng)就是去翻第三方庫(kù)但其實(shí)官方插件video_player已經(jīng)能覆蓋絕大多數(shù)業(yè)務(wù)場(chǎng)景。我這次在一個(gè)舊項(xiàng)目里用的是Flutter 2.8.1Dart版本還停留在2.15左右沒(méi)有空安全之外的新特性加持很多新版本插件根本不敢升。所以干脆把video_player在這個(gè)版本下從集成到踩坑完整走了一遍這篇就把整個(gè)過(guò)程記錄下來(lái)供同樣被老版本鎖住手腳的開(kāi)發(fā)者參考。先交代一下背景項(xiàng)目是一個(gè)帶視頻播放的資訊類(lèi)App不需要直播、不需要復(fù)雜的DRM核心訴求是能穩(wěn)定播放MP4和HLS流支持橫豎屏切換在列表頁(yè)能復(fù)用播放器實(shí)例。選video_player的原因很簡(jiǎn)單官方維護(hù)、API穩(wěn)定、2.8.1版本兼容性沒(méi)問(wèn)題而且它內(nèi)部是基于各平臺(tái)原生播放器封裝Android底層是ExoPlayeriOS底層是AVPlayer性能和系統(tǒng)適配都交給原生層處理Flutter層只做狀態(tài)同步這對(duì)一個(gè)維護(hù)成本不高的小團(tuán)隊(duì)來(lái)說(shuō)是最合理的選擇。1. 為什么2.8.1這個(gè)版本值得單獨(dú)聊老版本的典型困局先說(shuō)版本問(wèn)題。2.8.1是2021年底發(fā)布的版本放到現(xiàn)在看確實(shí)不算新但很多存量項(xiàng)目就是跑在這個(gè)版本上原因無(wú)非是業(yè)務(wù)代碼量大、不想冒險(xiǎn)升級(jí)或者第三方SDK還沒(méi)適配新版Flutter。這個(gè)版本有幾個(gè)特點(diǎn)直接影響視頻播放方案的選擇。第一個(gè)特點(diǎn)是Dart 2.15不支持最新的空安全語(yǔ)法演進(jìn)很多插件的最新版本已經(jīng)放棄了對(duì)它的支持。video_player目前最新的2.x版本需要更高的Flutter版本但2.8.1對(duì)應(yīng)的video_player版本大概在2.2.x左右這個(gè)版本號(hào)區(qū)間內(nèi)API基本穩(wěn)定功能足夠用。挑版本的時(shí)候不能無(wú)腦拉最新要看插件的pubspec.yaml里聲明的environment約束。第二個(gè)特點(diǎn)是2.8.1時(shí)代的熱重載對(duì)原生播放器狀態(tài)恢復(fù)并不完美。如果你在播放視頻時(shí)改了Dart層的代碼觸發(fā)熱重載經(jīng)常會(huì)出現(xiàn)畫(huà)面黑屏但音頻還在播放的詭異狀態(tài)。這不是你代碼的問(wèn)題是插件內(nèi)部的原生播放器實(shí)例沒(méi)有跟著Flutter框架一起重建導(dǎo)致的。后面我會(huì)專(zhuān)門(mén)講這個(gè)坑。第三個(gè)特點(diǎn)是你需要用apply方式在老版本里配Gradle插件?,F(xiàn)在新建Flutter項(xiàng)目默認(rèn)用pluginsDSL2.8.1的項(xiàng)目還是apply腳本式配置一旦要改Android端的構(gòu)建腳本很多新文檔里的寫(xiě)法直接抄會(huì)報(bào)錯(cuò)。所以這篇博文不是寫(xiě)給“最新版Flutter用戶(hù)”看的而是寫(xiě)給那批和我一樣被2.8.1鎖定、又想穩(wěn)定播放視頻的開(kāi)發(fā)者。如果你用的是3.x以上版本有些操作可以簡(jiǎn)化但整體思路依然通用。2. 從pubspec到第一個(gè)能出畫(huà)面的播放器完整搭建過(guò)程2.1 版本鎖定與依賴(lài)引入在pubspec.yaml里加依賴(lài)的時(shí)候我建議直接鎖版本不要用^符號(hào)放開(kāi)上限。因?yàn)镕lutter 2.8.1對(duì)video_player的具體兼容版本是有邊界的我用的是2.2.10這個(gè)版本在2.8.1上實(shí)測(cè)穩(wěn)定Android和iOS的端上都沒(méi)有出現(xiàn)編譯錯(cuò)誤。dependencies: flutter: sdk: flutter video_player: 2.2.10加了依賴(lài)之后執(zhí)行flutter pub get如果網(wǎng)絡(luò)環(huán)境不太好可能會(huì)卡在解析依賴(lài)階段。這里有個(gè)老版本的項(xiàng)目級(jí)小技巧優(yōu)先檢查本地的pubspec.lock里是否已經(jīng)有兼容版本緩存如果有可以用flutter pub get --offline快速完成拉取實(shí)測(cè)在CI環(huán)境里能省不少時(shí)間。2.2 Android端的必要配置video_player在Android上要求最低API 212.8.1默認(rèn)生成的項(xiàng)目模板里minSdkVersion是16如果不改編譯階段就會(huì)報(bào)錯(cuò)。必須在android/app/build.gradle里把minSdkVersion提到21。android { defaultConfig { minSdkVersion 21 // ... } }這個(gè)改動(dòng)不涉及業(yè)務(wù)代碼但漏掉的人特別多因?yàn)閳?bào)錯(cuò)信息往往要到flutter build apk的階段才會(huì)暴露出來(lái)而且錯(cuò)誤提示是Gradle構(gòu)建失敗第一眼根本想不到是minSdkVersion的問(wèn)題。另外AndroidManifest不需要額外加網(wǎng)絡(luò)權(quán)限因?yàn)関ideo_player的Android實(shí)現(xiàn)已經(jīng)在插件清單里聲明了INTERNET權(quán)限。但如果你的項(xiàng)目在release包里去掉了插件的清單合并就要自己確認(rèn)一下。2.3 iOS端的Info.plist配置iOS端只做本地視頻播放的話(huà)不需要特殊配置如果播放網(wǎng)絡(luò)視頻則需要確保App Transport Security允許HTTP明文請(qǐng)求。我在調(diào)試階段經(jīng)常用局域網(wǎng)內(nèi)的測(cè)試視頻源很多是HTTP協(xié)議的所以需要在ios/Runner/Info.plist里臨時(shí)加上NSAppTransportSecurity的NSAllowsArbitraryLoads。keyNSAppTransportSecurity/key dict keyNSAllowsArbitraryLoads/key true/ /dict上線前如果視頻源全部是HTTPS這段配置可以刪掉否則App Store審核會(huì)有風(fēng)險(xiǎn)提示。2.4 一個(gè)最小可用的播放器頁(yè)面下面這段代碼是能跑起來(lái)的最短實(shí)現(xiàn)包含創(chuàng)建控制器、初始化、播放、暫停、銷(xiāo)毀的完整生命周期。我用的是StatefulWidget因?yàn)榭刂破鞅仨毟鳶tate的生命周期走。import package:flutter/material.dart; import package:video_player/video_player.dart; class SimplePlayerPage extends StatefulWidget { final String url; const SimplePlayerPage({Key? key, required this.url}) : super(key: key); override StateSimplePlayerPage createState() _SimplePlayerPageState(); } class _SimplePlayerPageState extends StateSimplePlayerPage { late VideoPlayerController _controller; late Futurevoid _initializeFuture; override void initState() { super.initState(); _controller VideoPlayerController.network(widget.url); _initializeFuture _controller.initialize(); } override void dispose() { _controller.dispose(); super.dispose(); } Futurevoid _togglePlay() async { await _initializeFuture; if (_controller.value.isPlaying) { await _controller.pause(); } else { await _controller.play(); } setState(() {}); } override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text(視頻播放)), body: FutureBuilder( future: _initializeFuture, builder: (context, snapshot) { if (snapshot.connectionState ! ConnectionState.done) { return const Center(child: CircularProgressIndicator()); } if (snapshot.hasError) { return Center(child: Text(加載失敗: $snapshot.error)); } return GestureDetector( onTap: _togglePlay, child: Center( child: AspectRatio( aspectRatio: _controller.value.aspectRatio, child: VideoPlayer(_controller), ), ), ); }, ), ); } }這段代碼有一個(gè)細(xì)節(jié)很多人會(huì)忽略_togglePlay里必須先await _initializeFuture因?yàn)槿绻脩?hù)在網(wǎng)絡(luò)較慢時(shí)快速點(diǎn)擊畫(huà)面控制器還沒(méi)初始化完成就去調(diào)play()底層原生播放器會(huì)直接拋異常。把FutureBuilder和點(diǎn)擊事件里的await結(jié)合起來(lái)可以保證任何操作都在初始化完成之后執(zhí)行。3. 核心API的調(diào)用邏輯與播放器狀態(tài)機(jī)搞懂這幾個(gè)方法就夠用video_player的API其實(shí)不復(fù)雜核心對(duì)象就是VideoPlayerController它內(nèi)部通過(guò)一個(gè)VideoPlayerValue對(duì)象承載當(dāng)前播放狀態(tài)。你在頁(yè)面上做的所有操作本質(zhì)上都是修改這個(gè)Value然后觸發(fā)notifyListeners讓VideoPlayer控件重建渲染紋理。3.1 控制器的創(chuàng)建選型創(chuàng)建控制器有三條路network、file、asset。大部分業(yè)務(wù)場(chǎng)景用的是network它的初始化會(huì)異步完成視頻源的探測(cè)和首幀加載。這里有個(gè)關(guān)鍵點(diǎn)initialize()返回的Future一旦完成value.isInitialized就會(huì)變成true同時(shí)value.duration、value.aspectRatio才會(huì)被正確填充。所以在FutureBuilder里判斷初始化狀態(tài)是最穩(wěn)妥的做法。file模式用于本地文件播放比如下載到應(yīng)用沙盒里的視頻。注意file模式傳的是File對(duì)象路徑必須是應(yīng)用可訪問(wèn)的目錄asset模式打包在安裝包里適合放一些引導(dǎo)視頻、說(shuō)明視頻。3.2 播放控制與進(jìn)度監(jiān)聽(tīng)play()和pause()都是異步方法這也意味著調(diào)用后的狀態(tài)變化不是立即生效的。如果想要精確控制UI建議通過(guò)監(jiān)聽(tīng)VideoPlayerValue而不是在調(diào)用后立刻讀狀態(tài)。系統(tǒng)提供了addListener回調(diào)我一般會(huì)在頁(yè)面里加一個(gè)setState來(lái)刷新進(jìn)度條。_controller.addListener(() { if (!mounted) return; setState(() {}); });這里的mounted判斷極其重要因?yàn)榭刂破髟诓シ磐瓿珊笥锌赡芤呀?jīng)進(jìn)入dispose流程異步回調(diào)觸發(fā)的setState會(huì)導(dǎo)致“setState called after dispose”的運(yùn)行時(shí)錯(cuò)誤。我見(jiàn)過(guò)很多線上崩潰都發(fā)生在頁(yè)面已關(guān)閉但播放器的監(jiān)聽(tīng)還在回調(diào)的場(chǎng)景。進(jìn)度條通常需要當(dāng)前播放位置和總時(shí)長(zhǎng)從controller.value.position和controller.value.duration里取。position是Duration類(lèi)型長(zhǎng)時(shí)間播放后精確到毫秒直接顯示沒(méi)必要一般格式化成mm:ss。3.3 橫豎屏切換的正確姿勢(shì)視頻播放頁(yè)最常見(jiàn)的一個(gè)需求是旋轉(zhuǎn)屏幕時(shí)播放器跟隨旋轉(zhuǎn)。video_player本身不管屏幕方向它只管視頻紋理的寬高比。屏幕方向需要自己借助SystemChrome.setPreferredOrientations來(lái)控制。// 進(jìn)入全屏 await SystemChrome.setPreferredOrientations([ DeviceOrientation.landscapeLeft, DeviceOrientation.landscapeRight, ]); // 退出全屏 await SystemChrome.setPreferredOrientations([ DeviceOrientation.portraitUp, ]);這里有個(gè)體驗(yàn)細(xì)節(jié)切換方向之后播放器頁(yè)面的build方法會(huì)重新執(zhí)行如果你是用AspectRatio(aspectRatio: controller.value.aspectRatio)包裹視頻的畫(huà)面會(huì)自適應(yīng)新的屏幕寬高不會(huì)變形。但是如果你直接給VideoPlayer設(shè)置了固定寬高旋轉(zhuǎn)后就會(huì)出現(xiàn)黑邊或者拉伸。切換到全屏?xí)r還要注意隱藏系統(tǒng)UI我一般會(huì)用SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersiveSticky)把狀態(tài)欄和導(dǎo)航欄一起隱藏掉退出全屏?xí)r再改回SystemUiMode.edgeToEdge。3.4 播放器的狀態(tài)監(jiān)聽(tīng)閉環(huán)完整的狀態(tài)機(jī)大概是下面這串初始化中 → 初始化完成 → 播放中 → 暫停中 → 播放完成 → 釋放。VideoPlayerValue里有一個(gè)isPlaying屬性標(biāo)識(shí)播放狀態(tài)還有一個(gè)isCompleted標(biāo)識(shí)是否播放到末尾。播放完成后如果想重新播放不能直接調(diào)用play()必須先seekTo(Duration.zero)再play()否則部分設(shè)備會(huì)無(wú)響應(yīng)。4. 雙端平臺(tái)適配里最容易栽的坑Android和iOS的差異實(shí)錄4.1 Android音頻焦點(diǎn)與后臺(tái)播放的沖突video_player在Android上默認(rèn)會(huì)請(qǐng)求音頻焦點(diǎn)。如果你正在播放視頻這時(shí)候來(lái)了一條系統(tǒng)通知或者另一個(gè)應(yīng)用開(kāi)始播放音頻你的視頻聲音會(huì)被系統(tǒng)壓低或者直接暫停。這是ExoPlayer的默認(rèn)行為不一定是你代碼里的問(wèn)題。處理方式是在初始化控制器時(shí)設(shè)置VideoPlayerOptions的mixWithOthers屬性。我實(shí)測(cè)過(guò)這個(gè)屬性在2.2.10版本里是可用的設(shè)置成true之后視頻聲音會(huì)和其它音頻混音輸出不會(huì)互相打斷。_controller VideoPlayerController.network( widget.url, videoPlayerOptions: VideoPlayerOptions(mixWithOthers: true), );但如果你的App定位是視頻播放器用戶(hù)一般期望在看視頻的時(shí)候暫停其它聲音那就不應(yīng)該開(kāi)這個(gè)選項(xiàng)。4.2 iOS靜音模式下的播放行為iOS端的坑更隱蔽。iPhone的靜音撥片默認(rèn)會(huì)同時(shí)讓AVPlayer的音頻輸出變成靜音但video_player插件的實(shí)際表現(xiàn)取決于AVAudioSession的配置。簡(jiǎn)單說(shuō)如果你希望用戶(hù)即便在靜音模式下也能聽(tīng)到視頻聲音就必須在播放前激活音頻會(huì)話(huà)。video_player官方文檔沒(méi)有直接暴露這個(gè)配置但可以通過(guò)在iOS原生工程里添加一段音頻會(huì)話(huà)配置來(lái)實(shí)現(xiàn)。我在AppDelegate.swift里加過(guò)下面這段let audioSession AVAudioSession.sharedInstance() try? audioSession.setCategory(.playback, mode: .moviePlayback) try? audioSession.setActive(true)加完之后靜音模式下視頻依然有聲音。如果你的業(yè)務(wù)場(chǎng)景更希望尊重系統(tǒng)靜音設(shè)置那就不動(dòng)這個(gè)只在普通模式下播放。4.3 頁(yè)面切后臺(tái)后的播放器行為實(shí)測(cè)發(fā)現(xiàn)2.8.1版本的video_player在App進(jìn)入后臺(tái)后視頻畫(huà)面會(huì)凍結(jié)但音頻不會(huì)立即停止Android和iOS的表現(xiàn)還不一致。這非??简?yàn)生命周期管理。我的做法是監(jiān)聽(tīng)WidgetsBindingObserver的生命周期回調(diào)在AppLifecycleState.paused時(shí)主動(dòng)pause()在resumed時(shí)恢復(fù)播放。如果你確實(shí)需要后臺(tái)繼續(xù)播放聲音那不能靠這個(gè)插件要引入audio_service這類(lèi)專(zhuān)門(mén)的后臺(tái)音頻插件視頻畫(huà)面在后臺(tái)本來(lái)就是不可能繼續(xù)渲染的。5. 列表頁(yè)復(fù)用播放器實(shí)例不止一種姿勢(shì)單頁(yè)面播放沒(méi)有難度難點(diǎn)在于列表頁(yè)里做“點(diǎn)擊即播放”的體驗(yàn)。短視頻App那種無(wú)限滑動(dòng)自動(dòng)播放的效果用video_player也能做但有幾個(gè)架構(gòu)上的決策決定了后續(xù)維護(hù)是否順暢。5.1 多實(shí)例 vs 單實(shí)例我是怎么取舍的很多人在列表頁(yè)里給每個(gè)item創(chuàng)建一個(gè)VideoPlayerController滑動(dòng)離開(kāi)時(shí)再銷(xiāo)毀。這種做法在數(shù)據(jù)量小的時(shí)候沒(méi)毛病但一旦列表超過(guò)20個(gè)item每個(gè)item都持有原生播放器實(shí)例內(nèi)存會(huì)迅速飆升。我的方案是維護(hù)一個(gè)全局單例播放管理器整個(gè)列表頁(yè)只持有一個(gè)控制器實(shí)例。當(dāng)用戶(hù)點(diǎn)擊某個(gè)item時(shí)把播放器“綁定”到當(dāng)前item用戶(hù)滑走或者點(diǎn)擊下一個(gè)item時(shí)先釋放當(dāng)前控制器的視頻源再加載新的視頻源。class VideoPlayManager { VideoPlayManager._(); static final VideoPlayManager instance VideoPlayManager._(); VideoPlayerController? _controller; int? currentIndex; Futurevoid playVideo(String url, int index) async { if (_controller ! null) { await _controller!.pause(); await _controller!.dispose(); } currentIndex index; _controller VideoPlayerController.network(url); await _controller!.initialize(); await _controller!.play(); } }這個(gè)單例的好處是內(nèi)存占用可控切換視頻時(shí)的狀態(tài)管理集中在一個(gè)文件里排查問(wèn)題時(shí)思路清晰。缺點(diǎn)是切換視頻會(huì)先銷(xiāo)毀再創(chuàng)建中間存在一個(gè)短暫的空窗體驗(yàn)上會(huì)有一瞬間的停頓。5.2 用ValueNotifier驅(qū)動(dòng)列表UI刷新列表頁(yè)的每個(gè)item都不需要自己持有VideoPlayerController而是監(jiān)聽(tīng)播放管理器里的當(dāng)前播放索引。我用一個(gè)ValueNotifierint來(lái)標(biāo)記當(dāng)前正在播放的item序號(hào)item內(nèi)部通過(guò)ValueListenableBuilder決定自己是否顯示VideoPlayer控件。這樣列表刷新很干凈——正在播放的item重建一次其它item完全不參與重建滾動(dòng)性能影響很小。如果你用setState刷新整個(gè)列表那在低端安卓機(jī)上滑動(dòng)時(shí)會(huì)有肉眼可見(jiàn)的掉幀。5.3 滑動(dòng)列表時(shí)播放器失效的處理方案在ListView里直接放VideoPlayer控件有一個(gè)隱患item被回收或者移出視圖樹(shù)后播放器的紋理可能會(huì)失效。即使控制器還沒(méi)銷(xiāo)毀畫(huà)面也會(huì)變成黑屏。解決辦法是在ListView的itemBuilder里判斷當(dāng)前item是否可見(jiàn)不可見(jiàn)就移除VideoPlayer控件但保留控制器可見(jiàn)時(shí)重新掛載。重新掛載后VideoPlayer會(huì)從控制器當(dāng)前的position處繼續(xù)渲染不會(huì)跳回開(kāi)頭。這個(gè)特性對(duì)體驗(yàn)很重要我實(shí)驗(yàn)過(guò)多次只要不銷(xiāo)毀控制器重新掛載控件不會(huì)導(dǎo)致播放進(jìn)度丟失。6. 性能調(diào)優(yōu)與播放體驗(yàn)細(xì)節(jié)從卡頓到流暢的差距在哪兒6.1 視頻解碼的“隱形成本”和緩沖策略video_player底層是系統(tǒng)解碼器視頻流的編碼格式直接影響性能。H.264是兼容性最好的選擇H.265HEVC雖然壓縮率高但在老設(shè)備上解碼器可能不支持播放時(shí)會(huì)卡頓甚至黑屏。用網(wǎng)絡(luò)視頻源時(shí)建議后端優(yōu)先輸出H.264AAC的MP4格式保證2.8.1版本的播放器在絕大多數(shù)設(shè)備上都能流暢工作。緩沖策略上VideoPlayerController默認(rèn)的緩沖行為是“等到有足夠數(shù)據(jù)再開(kāi)始播放”網(wǎng)絡(luò)差時(shí)表現(xiàn)為進(jìn)度條轉(zhuǎn)圈很久才能出畫(huà)面。如果想盡快出畫(huà)面可以設(shè)置videoPlayerOptions里的httpHeaders配合服務(wù)端做分片請(qǐng)求不過(guò)這取決于你的視頻源是否支持Range請(qǐng)求。實(shí)測(cè)下來(lái)支持Range的MP4在弱網(wǎng)下起播速度明顯優(yōu)于不支持Range的源。6.2 畫(huà)面質(zhì)量與清晰度的控制VideoPlayer控件本身不做清晰度切換清晰度切換屬于業(yè)務(wù)邏輯不同的清晰度對(duì)應(yīng)不同的URL。實(shí)現(xiàn)方式是在頁(yè)面頂部或側(cè)邊欄放一個(gè)清晰度選擇按鈕點(diǎn)擊后重建一個(gè)指向新URL的控制器并從當(dāng)前進(jìn)度位置繼續(xù)播放。Futurevoid switchQuality(String newUrl) async { final position _controller.value.position; final wasPlaying _controller.value.isPlaying; await _controller.dispose(); _controller VideoPlayerController.network(newUrl); await _controller.initialize(); await _controller.seekTo(position); if (wasPlaying) { await _controller.play(); } setState(() {}); }這里要注意的是dispose后再initialize的間隙控制器是null狀態(tài)UI層需要加一個(gè)標(biāo)志位避免空指針崩潰。我在切換清晰度時(shí)會(huì)彈一個(gè)居中的加載圈等新控制器初始化完成再關(guān)掉。6.3 渲染層面的紋理更新機(jī)制VideoPlayer的實(shí)現(xiàn)原理是Flutter通過(guò)Texture控件把原生播放器的圖像幀傳到GPU渲染層。在2.8.1版本里紋理更新走的是TextureId的同步機(jī)制如果你在同一幀里同時(shí)操作多個(gè)播放器紋理有極小概率出現(xiàn)畫(huà)面撕裂。這屬于引擎底層的邊緣情況普通項(xiàng)目不會(huì)碰到但我在做“一個(gè)頁(yè)面同時(shí)畫(huà)中畫(huà)播放兩個(gè)視頻”時(shí)確實(shí)遇到過(guò)。如果業(yè)務(wù)上有同時(shí)播放多個(gè)視頻的需求建議限制為最多兩個(gè)實(shí)例并且錯(cuò)開(kāi)播放的啟停時(shí)間避免在同一幀里同時(shí)做控制器的狀態(tài)變更。7. 配合Provider做全局播放狀態(tài)從播放器到業(yè)務(wù)組件的通信很多項(xiàng)目里播放器不只是孤立的一個(gè)頁(yè)面它往往需要和評(píng)論區(qū)、分享按鈕、消息紅點(diǎn)等業(yè)務(wù)組件聯(lián)動(dòng)。這時(shí)候只靠頁(yè)面內(nèi)部的setState就不夠了需要把播放狀態(tài)提升到全局。Flutter 2.8.1時(shí)代最常用的方案是Provider配合ChangeNotifier可以很自然地實(shí)現(xiàn)跨頁(yè)面通信。我在這類(lèi)需求里的做法是定義一個(gè)VideoPlayerProvider持有控制器引用和播放狀態(tài)然后通過(guò)ChangeNotifierProxyProvider把它掛在頂層路由下。class VideoPlayerProvider extends ChangeNotifier { VideoPlayerController? controller; bool isMuted false; double playbackSpeed 1.0; void attachController(VideoPlayerController c) { controller?.removeListener(_onControllerUpdate); controller c; controller?.addListener(_onControllerUpdate); notifyListeners(); } void _onControllerUpdate() { notifyListeners(); } void toggleMute() { isMuted !isMuted; controller?.setVolume(isMuted ? 0 : 1); notifyListeners(); } void setSpeed(double speed) { playbackSpeed speed; controller?.setPlaybackSpeed(speed); notifyListeners(); } }列表頁(yè)、詳情頁(yè)、懸浮窗都可以通過(guò)context.readVideoPlayerProvider()拿到同一個(gè)播放狀態(tài)。有個(gè)優(yōu)點(diǎn)要說(shuō)清楚這個(gè)方案把“播放器”從“頁(yè)面”里徹底解耦了頁(yè)面銷(xiāo)毀播放器不一定銷(xiāo)毀。如果你想在App的迷你懸浮窗里繼續(xù)播放列表頁(yè)的視頻這個(gè)架構(gòu)是必須的。不過(guò)要提醒一點(diǎn)全局持有播放器意味著你要有等價(jià)全局的dispose時(shí)機(jī)。我是讓Provider的頂層ChangeNotifierProxyProvider隨著App退出時(shí)才銷(xiāo)毀不能隨頁(yè)面銷(xiāo)毀。否則頁(yè)面銷(xiāo)毀后想再播放就沒(méi)有控制器可用。8. 日志、異常與線上問(wèn)題的排查手段播放黑屏別慌視頻播放類(lèi)問(wèn)題很多是偶發(fā)性的在開(kāi)發(fā)機(jī)上復(fù)現(xiàn)不出來(lái)上線后用戶(hù)那邊就報(bào)黑屏。我的經(jīng)驗(yàn)是一定要在initialize()失敗時(shí)打出完整錯(cuò)誤信息并在VideoPlayerValue里記錄播放器狀態(tài)方便線上日志反推。8.1 初始化失敗的常見(jiàn)原因排查initialize()返回的Future如果拋出異常最常見(jiàn)的是網(wǎng)絡(luò)視頻地址無(wú)法訪問(wèn)、跨域問(wèn)題、視頻格式不被解碼器支持。在catchError里多打一層日志至少記錄URL、HTTP狀態(tài)碼、異常類(lèi)型。有一回我排查線上黑屏日志里只有一條PlatformException根本看不出是網(wǎng)絡(luò)問(wèn)題還是解碼問(wèn)題。后來(lái)我在initialize前先做一次http.Head請(qǐng)求確認(rèn)視頻文件是否存在、是否支持Range請(qǐng)求把這兩層信息拼在一起問(wèn)題立刻定位到源站沒(méi)有開(kāi)啟Range支持。8.2 用Flutter自帶工具觀察紋理狀態(tài)Flutter 2.8.1的WidgetInspector里可以看到Texture控件的textureId。如果播放器正常這個(gè)ID應(yīng)該是一個(gè)穩(wěn)定遞增的數(shù)字如果畫(huà)面黑屏可以先看這個(gè)ID是否變化。ID不變說(shuō)明原生播放器的幀沒(méi)有上新是解碼或渲染鏈路的問(wèn)題ID一直在變但畫(huà)面黑屏則可能是渲染層被其它控件遮擋并不是播放器的問(wèn)題。這個(gè)排查思路可以幫你快速區(qū)分前端布局問(wèn)題和后端播放問(wèn)題省去盲目改代碼的時(shí)間。8.3 常見(jiàn)異常與應(yīng)對(duì)速查下面整理這份異常速查表來(lái)自我項(xiàng)目里遇到的真實(shí)問(wèn)題。異?,F(xiàn)象可能原因處理辦法初始化超時(shí)進(jìn)度圈一直轉(zhuǎn)網(wǎng)絡(luò)源響應(yīng)太慢或URL失效給initialize()加超時(shí)包裹超時(shí)后提示用戶(hù)重試播放幾分鐘后畫(huà)面卡死視頻源服務(wù)端未正確響應(yīng)Range分片檢查源站是否緩存完整文件調(diào)整CDN配置音頻正常但畫(huà)面不動(dòng)紋理ID未刷新多為熱重載遺留狀態(tài)完全停止App重新啟動(dòng)避免在熱重載狀態(tài)下調(diào)試播放器iOS無(wú)聲音AVAudioSession未配置播放模式參考4.2配置session categoryAndroid閃退minSdkVersion低于21檢查build.gradle配置列表快速滑動(dòng)時(shí)卡頓多個(gè)控制器實(shí)例同時(shí)存活改用單例管理器銷(xiāo)毀不可見(jiàn)item的播放器9. 善用播放速率與控制邏輯不常見(jiàn)的但好用的功能video_player除了基礎(chǔ)播放暫停還有幾個(gè)被低估的能力。一個(gè)是setPlaybackSpeed可以控制倍速播放我用它做了“長(zhǎng)按加速預(yù)覽”的功能。另一個(gè)是setVolume音量控制范圍是0到1。還有一個(gè)是seekTo的毫秒級(jí)精確定位可以用來(lái)做視頻里的小節(jié)跳轉(zhuǎn)。倍速播放有一個(gè)隱藏坑iOS上AVPlayer對(duì)倍速的支持是通過(guò)rate屬性實(shí)現(xiàn)Android上ExoPlayer則會(huì)把播放速度應(yīng)用到音頻解碼器。兩者對(duì)倍速的邊界值限制不同iOS支持0.5到2.0Android部分設(shè)備最大只能到1.5超出范圍會(huì)靜默失敗。我在做快進(jìn)預(yù)覽時(shí)用了2.0倍速在部分Android設(shè)備上沒(méi)有效果后來(lái)統(tǒng)一封裝成1.5倍兼容性才穩(wěn)定。播放速率改變后VideoPlayerValue.isPlaying不會(huì)變化但實(shí)際播放進(jìn)度會(huì)變快進(jìn)度條如果用position / duration來(lái)計(jì)算會(huì)自動(dòng)正確顯示這一點(diǎn)不用額外處理。10. 從一個(gè)插件到一個(gè)基礎(chǔ)播放組件沉淀下來(lái)的通用封裝最后說(shuō)說(shuō)我把video_player封裝成團(tuán)隊(duì)通用組件的經(jīng)驗(yàn)。直接在每個(gè)頁(yè)面里寫(xiě)控制器和FutureBuilder代碼重復(fù)度太高而且很容易埋坑。我沉淀了一個(gè)AppVideoPlayer組件對(duì)外只暴露三個(gè)參數(shù)視頻地址、是否自動(dòng)播放、播放狀態(tài)回調(diào)。內(nèi)部邏輯包含控制器生命周期管理、生命周期觀察頁(yè)面進(jìn)入后臺(tái)自動(dòng)暫停、播放完成通知、網(wǎng)絡(luò)狀態(tài)兜底提示。這個(gè)組件本質(zhì)上是一個(gè)“帶殼的播放器”業(yè)務(wù)方拿到任何一個(gè)視頻URL都能播放不需要關(guān)心平臺(tái)差異和生命周期細(xì)節(jié)。組件里一個(gè)關(guān)鍵點(diǎn)是對(duì)外暴露provider對(duì)象而不是暴露一堆控制方法。這樣外層頁(yè)面可以拿到播放器實(shí)例做進(jìn)度條聯(lián)動(dòng)、清晰度切換但不會(huì)跳過(guò)組件內(nèi)部的生命周期管理。給團(tuán)隊(duì)用的時(shí)候還有個(gè)小細(xì)節(jié)命名空間和版本號(hào)要寫(xiě)清楚。video_player在2.x版本之間API有細(xì)微差別如果不同業(yè)務(wù)線用了不同的組件版本日志和調(diào)試信息會(huì)非常混亂。我建議在主項(xiàng)目的pubspec.yaml里統(tǒng)一鎖定版本號(hào)子模塊不要各自維護(hù)播放器依賴(lài)。從2.8.1這個(gè)稍微“過(guò)時(shí)”的版本出發(fā)把官方video_player吃透之后你會(huì)發(fā)現(xiàn)它比想象中可靠得多。大部分播放問(wèn)題不是因?yàn)椴寮恍卸羌煞绞?、生命周期控制、平臺(tái)差異適配這三層沒(méi)有處理干凈。我個(gè)人體會(huì)是視頻播放器的核心不是API調(diào)用而是狀態(tài)管理和平臺(tái)細(xì)節(jié)的兜底能力這兩塊做到位直播、點(diǎn)播、短視頻、長(zhǎng)視頻都能在一套架構(gòu)上自然擴(kuò)展。最后再分享一個(gè)小技巧調(diào)試視頻播放問(wèn)題的時(shí)候盡量用真實(shí)設(shè)備而不是模擬器模擬器上的解碼器表現(xiàn)和真機(jī)差距很大很多你以為的代碼問(wèn)題換到真機(jī)上根本不復(fù)現(xiàn)。這個(gè)習(xí)慣能幫你省掉至少一半的無(wú)用排查時(shí)間。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
www.99热视频| 五月丁香六月婷婷久久| 丁香五月天人体| 亚洲成人网址在线观看| 99re这里只有| 五月天久久婷婷| 人人操A| 97久人人| 九月婷婷综合在线| 大香蕉婷婷婷| 日韩黄色影院| 五月天色五月| 大香蕉综合网| 欧美色99| 香焦网五月天| 五月丁香人妻| 怡红院AV亚洲一区二区三区H | 96精品成人无码A片观看金桔 | 国产精品色色色色| 五月天激情小说婷婷| 亚洲影院婷婷色| 日韩成人综合网| 九九精品亚洲| 蜜臀av粉嫩av懂色av| 久久综合激情婷婷激情| 中文字幕 久久9999| 五月丁香| 色热久资源| 91视频免费后入强操| 最新无毒无码AV| 成人va在线播放| 五月丁香激情四射| 亚洲av免费在线| 色五月婷婷小说亚洲中文字幕组| 激情综合五月开心狠狠| 久久性爱视频网站| 国产精品色色| 久久激情五月| 99re思思久久| 少妇性BBB搡BBB爽爽爽电影| 色噜噜狠狠色综无码久久合欧美| 三级黄色大片视频| 婷婷丁香成人色综合| 狠狠综合网| 五月激情婷婷丁香| 亚洲操操操| 99热国产精品| 九九热免费视频| 色色色婷婷五月天| 天天操天天操天天操天天操天天操天天操天天操天天操天天操 | 天天做天天爽| 综合色色五月| 51XX嘿嘿午夜无码| 日本一毛片| 免费V片在线| 97干在线视频精品店| 性无码专区无码| 欧美精品999| www.婷婷五月| 五月美女婷婷风骚| 日本 色综合| 超级碰碰视频无码| 伊人婷婷大香蕉| 午夜激情综合| 99亚洲综合| 美妞av| 丁香五月自拍| 涩五月色婷婷| 色色射| 五月婷婷色| 久久99网站| 亚洲国产精品二二三三区| 中文成人在线| 人人草碰| 久思思热视频在线观看| 婷婷五月精品中文字幕| 色五月偷偷| 97色干| 色情成人五月天| 欧美色五月| 亚洲亚洲人成综合网络| 91视频综合网| 婷婷九月激情网| 婷婷综合在线观看视频| 日本婷婷在线| 国产美女无遮挡裸体毛片A片 | 99成人网站| 亚洲激情无码久久| 五月天狠狠网| 99视频自拍| 五月日韩中文字幕| 久99久在线| 欧美操人| 狠狠色噜噜狠狠狠狠狠色综合久久| 9久国产| 国产美女视频久| 精品久热69| 天天五月香欧美| 九九十99视频| 婷婷五月天AV在线| 国产超碰人人| 人人操人人操919999| 香港九九六区八区99| 国产精品日本一区二区在线播放| 成人精品视频99在线观看免费| 99在线精品视频| 777色色色| 亚洲激情高潮| 五月丁香激情综合六月涩涩爱| 狠狠色色| 狠狠做六月爱婷婷综合aⅴ| 成人Av在线大片| 超级碰 久久9| 一起草aV| 97色热| 久热亚洲| 99精品热视频| 婷婷91| 五月丁香六月婷婷成人| 亚洲天堂99| 8区视频在线| 六月丁香色色| 激情图片亚洲| 四色女婷婷| 婷婷久久五月天亚洲欧美国产日韩在线观看 | www。五月天。com| 久久婷婷五月天综合| 久久99色色| 狠狠色激情在线| 五月婷婷开心深| 九九视频网| 性爱AV天堂| 青青草性爱视频| 深爱激情网五月| wwW天天干| 夜夜躁狠狠 | 九九综合精品| 日本丁香五月婷婷| 欧洲综合色| 丁香五月天啪啪激情综合网| 天天狠狠干| ji'qi'luan'ren'lun| 99久久九九| 色婷婷五月天小说| 色婷久九| 这里只有精品久久| 超碰在线个人观看| 狠狠色婷婷777| 日本色婷婷| 丁香九月综合| 天天摸夜夜夜| 亚洲成人一区| 久久五月婷婷综合网| 五月天丁香啪啪网| 中文字幕精品在线观看| 五月丁香啪啪激情| 色五月播五月| 亚洲婷婷五月天| 色五月情| WWW.久久久久久久| 丁香五月网| 《蜘蛛女》梁铮1995| 日韩在线视频网站| 天堂成人A片永久免费网站| 超碰人人在线观看| 欧美日韩99| 久久er九九| 99精色| 精品久久久999| 五月婷婷啪啪| 婷婷国产五月天17c| 狼人婷婷久久| 青青福利网| 国产精品色色| 综合色五月亭亭| 超碰A V在线| 五月婷婷激情| 日本va欧美va欧美va| 丁香五月婷婷综合精品素人| 国产精品久久久爽爽爽麻豆色哟哟| 美女被肏网站在线看| 色丁香五月| 开心五月丁香综合久久| 91人人操人人爱| 麻豆AV一区二区三区| 婷久久久| 97色色-99久久| 丁香五月婷婷综合网| 色综合久久综合中文综合网| 丁香婷婷天堂| 色五月网址| 青青福利网| AA久久| 婷婷五月天天| 99这里有精品久久97| 亚洲色色香蕉| 免费看欧美成人A片无码| 综合亚洲AV| 99re这里只有精品9| 五月激情五月婷婷五月天在线| 成人亚洲精品| 激情久久网| 99er免费在线观看| 五月色网| 国产婷婷综合在线免费视频| 亚洲va欧美va国产综合久久久| 五月天婷婷影院| 婷婷六月香| 婷婷丁香五月亚洲欧美| 久久五月网| 婷婷五月丁香国产| 狠狠操狠狠狠| 丁香五月电影| 9999久久久久| 一区二区免费看| 伊久大香蕉| 美日韩成人| 亚洲婷婷免费| 岛国AAAV| 久久婷婷五月丁香| 国产亚洲精品AAAAAAA片| 超级碰碰碰碰视频| 可以看的av| 国产精品久久久久久久久久免费| 性色播| 偷拍91九色| 91精选国| 互月天综合| 五月天久久久| 久久人妻乱子伦| w婷婷五月婷婷w| 婷婷狠狠爱| 甈吧vv| 青青草五月天| 色六月天天激情综合网| 99成人| 色婷婷综合网站| 婷婷五月天丁香社区| Av免费网站在线| 五月丁香婷婷啪啪综合网| 五月天亭亭俺也| 色五月婷婷操逼| 激情五月天影院| 亚韩精品视频1区| 91热er| 丁香五月天视频| 91碰碰视频| 六月丁香VA| 色天使久久综合| 99久久综合网| 99婷婷综合| 女力报到正好爱上你| 国产毛片精品一区二区色欲黄A片| 丁香无月在线观看| 日本三级中国三级99人妇网站| 婷婷五月天色色| 91久久1118| 国产精品电影网| 婷婷丁香人妻天天爽| 国产女18毛片多18精品| 99热亚洲精品| 91久久久久久久久久| 亚洲综合色色色| 国产精品黑丝| 综合XX网| 91久久久久久| 亚洲成av人影院| 99热久久最新地址| 久久99免费视频网站| 色婷婷五月天天天干天天操天天爽 | 婷婷精品在线| 啪啪啪大香蕉| 伊人午夜综合色啪| 91xxxx九色| 婷婷情爱五月天6| 在线成人视频免费| 婷婷丁香成人| 激情五月婷婷欧美极品| 第四色色色色色丁香五月天| 99精品免费| 欧洲S级在线观看| 色五月色图| 成人视频一区| 精品欧美一区二区三区久久久 | 日韩操| 婷婷丁香五月视频| 91丨九色丨丰满人妖| 丁香五月天网站| 激情图片五月天| 久久成人性爱| 中文字幕欧美精品久久| 超碰人人艹| 五月婷婷综合热| 影音先锋自拍网| 狠狠五月综合在线| 久久大香蕉同僚| 思思精品视频| 战争与艾拉电影免费观看| 思思热99er| 激情综合五月婷婷丁香| 色婷婷基地在线| 91无码一区人妻A片蜜| 丁香久久| 丁香婷婷激情综合五月激情| 五月综合人妻| 9999久久久久| 日日夜夜小色哥| 亚洲色人妻| 中文av网| 99热九九热| 91狠狠色| 久久婷婷青青| 新97人人上人人| 日韩婷婷五月天| 色婷综合| 欧美交换配乱吟粗大25P| 久狠日av| 免费成人va| 骚逼视频一区2区| 激情综合99| 天天色天天爱天天舔| 婷婷色狠狠| 亚洲成人在线免费| 色婷婷综合网站| 国产操碰| 色婷婷五月综合色婷婷| www.色五月| 丁香五月天啪啪a日本| 97福利视频| seav天堂| 综合色色色| 色丁香五月天婷婷| 五月天婷五月天综合网在线观| 99热在线网站| 99在线精品免费视频| 99热都是精品| 婷婷激情鹿城五月天| 日韩在线99| 四川BBB搡BBB搡多人乱亂| 色五婷婷在线视频| 激情婷婷丁香色五月| 99热都是精品| 色色日本欧美| 狠狠干.com| 综合色播| 婷婷色在线视频| 色婷婷狠狠色| 九九九精品视频免费观看| 成人免费视频一区| 婷婷五月激情黄色| 久久久中文| 欧美乱码国产一级A片| 久久九九99字幕| 九九综合九九| 色九九综合热99| 五月天开心色色网| 久久五月丁香| 亚洲精品大片| AAA久久久| 伊人色综在线| 深爱激情AV| 97九色| 超碰成人AV| 丁香五月天天久久综合小说| 五月丁香成人版| 五月丁香六月婷婷久久肏| 六月婷综合| 狠狠狠狠狠| 爱射综合| 天天色图| 玖玖爱伊人| 色婷婷五月综合| 蜜乳国产网站| 久久婷婷一级片| 天天拍夜夜撸| 激情小说五月丁香在线视频观看视频| 九九色中文| 欧美激情综合色综合啪啪五月| 久久精品噜噜噜成人A∨色欲| 99年操人人爽| 国产成人精品一区二三区熟女在线| 五月丁香激情综合| 日本欧美在线| 久久综合婷婷| 99精品色| 五月丁香六月天| 日本久久精品| 青草五月天| 91久久久久久| 狠狠草在线观看| 9久久精品| 婷婷五月天黄色| 久久草中文日韩欧美| 天天艹夜夜艹| 日本操碰碰| 成人在线综合| 99视频久久| 91丨九色丨丰满人妖| 9月色婷婷| 丁香五月成人| 超碰免费成人| 久久久精品人妻| 大香蕉手机视频| 99色在线视频| 亚洲爆乳无码精品AAA片蜜桃| 深爱激情五月天| 亚洲色啪| 久久5 9视频免费观看| 五月天丁香婷婷网| 激情丁香五月综合| 夜夜久久综合网| 人妻aV在线| 九九热大香蕉| 永久思思热在线| 久久99热这里只有精品23| www.激情五月天.com| 久热这里这里有精品| 狠狠va| 天天 青草 丝袜制服 在线| 激情综合网 激情五月天| 婷婷5月九九| 激情www| 天天日天天操心| 五月丁香六月香香蕉| 五月天色不卡| 综合狠久久| 色五月婷婷天堂| 欧美VA视频| 久久综合五月天| 日日操夜夜爽白洁| 99在线精品免费视频| 久久久久久久人妻| 欧美色频| 色九月综合| 激情五月天99色| 九色91国产| www.99热国产| 天天透天天爱| 久久香蕉网| 182无码| 大香蕉欧美在线| 99热99在线| http://www.lingjunshare.com/| www.婷婷五月| 亚洲色婷婷| 67194线路二在线观看| 97热久久| 丁香五月综合福利视频导航| 色九九九九| 亚洲五月花| 色吧婷婷五月亚洲| 美女精品一级不卡视频| 五月丁香网站在线播放| 欧美激情VA永久在线播放| 五月丁香婷婷成人网| 九九九九精品精| 日韩淑女人妻luan伦激情精品一区二| 影音先锋女人av鲁色资源网小说免费| www.henhengan| 99视频内射三四| 亚洲欧洲另类图片| 亚洲精品国产成人AV在线| 南京搡BBBB搡BBBB| 91AV婷婷| 91在线97视频| 掩去也综合五月视频| 五月WWW| 婷婷色五月激情| 久久婷婷五月天丁香| 五月丁香自拍| 丁香婷婷成人在线播放| 欧美25p| 丁香五月婷婷五月基地| 五月丁香综合啪啪| 久久综合五月天| 国产精品久久久久久久久久免费 | 五月丁激情| 蜜臀av粉嫩av懂色av| 婷婷五月在线视频| 超碰免费人妻| 天天色噜| www...com黄在线观看| 天天色天天搡| 亚洲综合另类| av婷婷丁香| 激情五月天久久丁香| 激情www| 99re热视频这里只精品| 激情五月综合| 欧美超级视频97| 五月综合激情啪啪啪啪啪| 欧美精品99久久久| 99热在线观看| 色婷婷另类| 婷婷五月天激情综合| 国产免费一区二区三区三州老师F1F1.CC | 99色日本| 久热视频这里只有精品| 一本色道久久88综合日韩精品| 大香蕉中文| 国产精品日韩十五区| 久久久GOGO无码啪啪艺术 | 另类视频综合| 97性视频| 婷婷六月天| www.1024久久| 五月宗合激情网| 粉嫩AV久久一区二区三区| www.久久久久| 婷婷丁香成人| 五月婷婷色影院| 婷婷五月天六月丁香| 在线五月婷| www.五月天婷婷姐姐| 日韩色色视频| 丁香五月亚洲AV| 秋霞成人毛片一级A片| 91精品综合久久久五月天| 天天射综合网天天插| 99热成人| 色婷婷精品小视频| 免费看欧美成人A片无码| 性色人人爽| 色吧综合网| 亚洲综合久| 九九99免费理论| 婷婷激情六月综合| 综合AV在线| 91狠狠色色丁香婷婷综合久久| 99热97| 男人視頻站| 丁香五月六月综合激情| 婷婷色在线播放| 人人摸人人摸| A级毛片高清免费不卡播放谢谢谢谢| 激情VA视频| 欧美69色| 免费看欧美成人A片无码| 青青草Avb在线| 深爱激情五月网| 激情亭亭五月| 婷婷丁香色情| 淫荡家庭AV| 九九色影院| 五月天免费色| 热热色色五月天婷婷| 色人妻五月| 激情婷婷99| 丁香六月婷婷五月婷婷| 日本在线视频播放91| 天天摸天天肏| 激情婷婷五六月天| 久久婷婷丁香花综合网| 99久在线精品99re8热| 91久久电影| 日韩啪| 亚洲国产精品成人免费一区久久久在线观看AAAA | 亚洲第一黄网| h在线看免费版在线看| 亚洲综合网激情五月天| 色八戒操婷婷| 97干欧美| 加勒比色色| 影音先锋 萱萱| 很很干天天干| 色九区| 无码免费人妻A片AAA毛片西瓜| 婷婷狠狠五月综合| 五月丁香婷婷啪啪综合| 色播五月婷婷| 99精品在线下载| 色色网91| AV性爱在线| 手机AVAV天堂看网| 久久99精品久久久久久青青AR| www.婷婷六月天| 综合亚洲色色| 欧美精品狠狠色丁香婷婷| 影音先锋91资源站| 亚洲激情 久久| 婷婷99综合| 五月婷婷导航| 小视频aaa久久久| 国产精品成av人在线视午夜片| 久久久人妻| 噜噜色五月| 精品综合网在线| 五月丁香无码| 国产探花AV在线| 绿色小导航AV| 思思热在线视频精品| 久久99免费视频| 99视频久久| 爆乳熟妇一区二区三区四区| 天天操无码| 四色女婷婷| 国内一级精品| 激情操逼婷婷| 色爱五月天| 综合五月天完整| 久草婷婷| 丁香五月综合无码趴趴| 国产精自产拍久久久久久蜜| 国产成人AV在线播放| www.狠狠狠狠| 日本三级中国三级99| 久久精品国产AV一区二区三区 | 激情丁香五月激情婷婷| 日韩av在线电影| 色婷婷网大全在线| 五月婷婷激情综合网| 色六月视频| 亚洲艹网| 视频一二区| 狠狠爱青青草| 丁香六月综合| 超碰猛烈的性猛交| 婷婷五点亚洲| 精品视频99看在线视频| 九色自拍| jiuse91在线| 国产精产国品一二三在观看| 日韩性视频| 噜噜色噜噜网| 六月五月久久丁香| 99er日韩| 日韩精品一品二区三区的使用体验| 激情久久久久久| 色婷婷激情五月天在线观看| 九热在线这里有精品6| 丁香五月婷婷亚洲色图| 天天色凹凸| 九九碰九九爱97超碰| 亚洲天堂啪啪| 综合图片色色| 99久久免费精品| bbwcuckold精品熟妇| 91精品国产99久久久久久天美| 婷婷99狠| www.wuyuetian啪啪| 婷婷五月天色色| 特黄三级片| 五月天激情视频| 丁香五月激情无码视频| 婷婷激情五月综合基地| 激情婷婷五月亚洲| 日韩九九视频| 五月婷婷六月天| 亚洲热久| 九九超日本| 1769在线观看欧美国产| 影音先锋男人站,影音先锋男人色资源网,影音先锋AV最新资源站,影音先锋AV资源 | 五月天激情亚洲| 婷婷激情蜜桃玖玖丁香| 婷婷五月天日本国产| 国产超碰在线| 五月色婷| 啪啪啪综合网| 四色永久成人网站| 久热久| 另类专区在线观看| 国产精典视频在线观看| 色综合久久99色| 99精品高潮| 99资源在线| www. 五月. com| 色婷婷AV久久| 六月婷在线| 日本欧美999久久久三级片| 狠狠狠狠狠狠草| 婷婷亚洲在线| 国产免费av网站| 97操碰在线97| 九九九九中文字幕| 九月婷婷在线观看| 91人碰| 丁香五月情| 91大神操美女| 九九热这里只有精品5| 九九热精品| 99免费成人网| 深爱激情四射| 深爱五月亚洲| 天堂草在线看www| 国产视频婷婷| 久久最新色| 五月丁香色色网| 99热在线精品观看| 五月综合色| 色五月激情五月| 久久色大香蕉| 色色色色色日韩午夜激情 | WWW久| 激情四射婷婷| 色情综合网| 亚洲俩性性爱图片久久第六页| 五月婷婷丁香伦理网| 色婷婷香蕉丁丁网| 天天做夜夜爽| 五月丁香综合激情网| 色一情一乱一乱一区91Av| 丁香五月自拍| 五月天婷婷婷| 五月五月婷婷| 国产韩日亚洲美州欧亚综合在线| 久久aaa| 天天做天天爱综合| 一区二区免费看| 天天日天天爽夜夜爽| 国产亚洲成AV人片在线观黄桃| 99精日本久久| 超碰日日操| 五月天婷婷xxx| sewuyuejiqingwang| 五月婷婷中文| 大香蕉啪啪啪| 五月婷婷 婷婷五月 一区二区 久久久 | 97碰碰在线看视频免费| 午夜丁香| 五月色婷丁香| 五月丁香激情啪啪| 天天做综合网色综合| 日本色五月婷婷| 亚洲综合激情五月久久| 欧美日韩二区在线| 另类图片激情五月| 天天日日天天| 天天舔天天爽| AA丁香综合激情| www.久操| 99在线er热| 毛片毛片毛片毛片| 99精品性爱| 丁香深五月婷婷| 乱码操操| 狠狠操狠狠干综合| 久久亚洲激情五码| 色婷婷五月丁香色| 亚洲天堂久久| 激情小说五月欧美亚洲丁香| 久久久婷婷| 热99.com婷婷| 丁香六月色香蕉视频| 99爱在线精品视频免费观看| 国产激情综合五月久久| 久久天堂精品| 丁香婷婷人妻综合网| 丁香久月| 亚洲色就是色色色| 久久曰曰| 狠狠干夜夜干| 青青草免费公开视频| 91打屁股视频网站| 天天橾日日橾夜夜橾17| 婷婷丁香久久| 日韩精品无码AV| 日韩99色| 色五月天丁香| 人妻中文字幕精品| 天天做天天干天天综合网| 91超碰在线播放| 超碰成人影视| 婷久看人爽| 99色干| 天综合日日夜综合7799| 国熟女视频| 99热6这里只有精品| 伊人9草在线观看| 天天干天天 亚洲| 婷婷伊人| 色玖玖导航| 婷婷成人五月天成人文学小说| 五月婷婷无码| 色综合激情| 色综合五月| 色在线免费观看| 狠狠狠人妻| 五月丁香六月激情在线| 丁香蜜臀黄色婷婷五月天| 曰日爽日日操| 99综合五月免费视频色婷婷| 开心丁五月| 婷婷综合在线| 性视频久久| 九九热精品视频| 五月激情综合婷婷| 五月丁香人人婷婷在线观看| 99精品久久| 五月丁香啪啪| 久久久WWW| 婷婷综合在线播放| 5月丁香婷婷激情网| 激情综合文学| 五月天在线视频尤物视频在线看| 99热只有| 开心婷婷五月激情网小说| AAA久久久| 久久久久久久久99精品| 99这里热| 九九色院| 成人永久免费视频在线观看| 色狠狠综合入口| 亚洲va欧美va天堂v国产综合| 丁香五月欧美婷婷| 久久久久久丁香五月| 欧美色一级色| 激情黄色小说五月天| 国产欧美性成人精品午夜| 另类五月婷婷| 国产精品色色| 婷婷五月情色| 人与禽A片啪啪| 婷婷五月激情片| 香蕉久久国产AV一区二区| 深爱网深爱综合网| 精品国产乱码久久久久久免费| 99热6这里只有精品6| 五月综合久久| 色五月av伊人| 日日操夜夜擼| 五月天婷婷五月| www超碰com| av性爱网站| 9热在线视频精品| 99热精品无码| 9人人操人人看| www.五月婷婷久久.com| 另类图片色五月| 色五月丁香婷婷| 激情综合网络插| 人妻熟人中文字幕一区二区| 欧美va亚洲va在线播放| AV在线免费观看不卡| www激情婷婷com| 伊人婷婷五月天av| 碰碰91| 人人玩人人橾| 日本不卡高字幕在线2019| 丁香五月人妻熟女| 五月丁香激情综合网官网| 99亚州综合精品成人网| 久婷久婷激情肉| 婷婷99中文字幕| 婷婷五月中文在线| 国产又色又爽又黄又免费| 激情网五月婷婷| 一起草av在线观看| 91viP在线看| 精品一二三区视频立| 九八Av| 五月婷婷综合在线视频小说| 久碰婷婷视频| 欧美色婷婷| 九热视频这里只有精品| 99久久.www| 99色在线视频| 99aese| 九九九九九九毛片| 日本五月婷婷| 91人妻视频| 香蕉大综综综合久久| 91精品综合久久久久久五月丁香| 99综合婷婷五月| 九九成年视频| 99热最新网址| 热的无码综合视频| 九九大香视频| 欧美搡BBBBB摔BBBBB| 日日舔夜夜操| 婷婷性爱影院| 欧美色图片88| 国产.亚洲.欧洲视频在线| 色波激情五月天| 婷婷五月欧美AA片免费| a网站免费观看| 久久久久99精品成人片| WWW99视频| 99在线免费观看| 激情五月婷婷开心网| 色五月激情视频在线综合| 久久综合66| 久99久在线| 婷婷五月开心中文字幕在线| 国产精品色婷婷久久久精品| 五月婷婷影院| 日本爆乳片手机在线播放| 梁铮版蜘蛛女在线观看| 日都一级A片| 99热婷婷| 五月丁香六月综合激情| 一根材五月婷成人| 久久9久久| 538在线精品| 久草a片| 婷婷丁香亚洲五月天| 激情婷婷久久| 91久女| 天天爽夜爽| 丁香六月欧美| xx色综合| 久久五月网| 9999热在线| 色噜噜狠狠色综合日日| 成人色图情色成人网 www.5b5b5bcom 五月天 | 五月丁香啪啪啪| 五月丁香婷婷激情在线| 婷婷黄色| 亚洲电影中文字幕| www.婷婷六月天| 日本久久婷婷| 色婷婷色五月天| 天天激情视频| WWW久久久| 久久婷婷东京热大香樵| 超喷97免费在线视频| 91精品久久久久久77777| 色婷视频| 99精彩视频在线观看| 黄网在线免费观看| av第一二区| 91聚色综合网| 狠狠精品干练久久久无码中文字幕| 99精品一二三四视频| 成年人看Va免费视频| 亚洲狠狠婷婷综合久久久| 日本久久精品| 六月婷欧美| 久久一伦| 婷婷五月天桃花网| 思思99热| 九九九九这里只有精品| 99啪啪网| 五月天婷婷在线播放| 色六月天| 欧美婷婷五月激情| 99久热这里只有精品视频删减版| 丁香婷婷五月综合影院| 色婷婷色综合| 99re8热精品免费视频| AA丁香综合激情| 婷婷精品视频| www久久久久久久97| 亚洲婷婷免费| 97婷婷五月天| 五月天成人在线| 久久奄也去色色网站| 婷婷五月天激情四射五月天激情| 殴美日比视频| 永久免费视频| 七七色色综合| 久久日韩婷婷五月| 丁香五月激情啪啪啪| 亚洲丁香五冃97色| 成人国产欧美大片一区| 天天操夜夜操| www.婷婷五月天| 日本99久久| 五月激情综合网| 久久免费精彩视频| 97色婷婷| www.五月.com| 婷婷五月婷婷| 激情99| 久久激情网| 亚洲成人在线播放| 五月丁香综合激情| 嫩草AV久久伊人妇女超级A| 婷婷导航| 日本欧美成人片AAAA| 丁香婷婷综合激情五月色| 天天拍天天操| 国产午夜精品一区二区三区四区| 国产亚洲精品久久久久久郑州| 久久小视频| 国产午夜成人免费看片无遮挡| 国产日产亚洲系列最新| 在线中文AV| 亚洲成AV人片在线观看| 91熟妇大香蕉| 亚州婷婷五月激情综合| 神马欧美精| 國語久久婷| 超碰碰碰碰| 激情五月婷婷丁香六月| 国产五月丁香在线| 色亚洲中文| 五月丁香婷婷人体| 狠狠插日日干撸| 这里只有精品在线视频在线观看| 亚洲五月婷婷| 色综合久久天天综合网| 色五月丁香五月| 最近中文字幕大全免费版在线| 超喷97免费在线视频| 日韩三级高清无码| 色99婷婷五月天| 亚洲另类婷婷综合| 丁香亭亭久久| 婷婷激情区| 啪啪六月婷婷| 五月色丁香| 五月丁香六月激情综合| 国产黄大片在线观看画质优化| 丁香五月综合狠狠| 99久免费视频| 91精品久久久久久| 五月激情网五月综合网| 97婷婷五月| 丁香五月综合激情性爱| 俺去也五月| 日本一级黄色片。| 七月激情六月婷婷综合在线播放| 日本熟妇精品99| 丁香婷婷免费| 26uuu精品国产| 欧美精品999| 国产成人精品一区二三区熟女在线| 五月婷九月| 久久久大香蕉| 日日婷婷不卡| www.婷婷五月天.com| 九九九九这里只有精品| 天天躁日日躁狠狠躁日日躁2022年5月9日| 丁香五月天亚洲综合| 久久婷婷啪啪视频| 26uuuavcom| 九九这里有精品| 精品久久99码| 日韩aⅴ视频| 中文字幕不卡+婷婷五月| 精品无码色欲AV| 五月天色不卡| 91丨九色丨熟女高潮| 色约约视频一区二区三区四区五区 | 国产AV一区二区三区日韩| 一起操 91N.com| 99精品在线播放| 五月天黄色激情小说| 五月婷婷与六月丁香图片激情| 国产午夜精品一区二区三区嫩草| 大香蕉在线观看9| 久久久思思热| 夜夜干夜夜操| 操操碰| 色99免费视频中文| 亚洲99激情| 婷婷五月天国产| 国产乱妇无乱码大黄AA片| 激情五月婷婷她| 久热精品视频在线观| 五月五婷婷| 激情www| 伊人久久大香线蕉亚洲五月天,| 91精品久久久久| 久久A V无码视频| 99视频在线精品| 免费成人网在线观看| 开心亚洲久久开心| 激情丁香九九五月综合网| 爱99干99| 日本综合色图| www色五月| 熟女人妻视频| 97在线碰| 丁香婷婷噜噜| 亚洲亚洲人成综合网络| 99色干| 色色色色色网站| 99综合免费视频| 区美毛片子| 丁香五月六月婷婷怡红院| 九九AV| 99久.| 国产精品人人妻人人爽| 日本乱子人伦在线视频| 妇激情基地| 熟女激情五月天| 久久婷婷七月丁香| 嫩草AV久久伊人妇女超级A| 欧美狠狠色| 国模九区| 综合xx网| 99久久激情视频| 五月天婷婷情色| 五月天婷婷婷| 五月天色小说| 色五月综合婷婷久久综合婷婷久久综合婷婷久久综合婷婷久久 | 亚洲一色色色色色色色色| 五月丁香久| 我想看国产大学生口爆吞精的视频| 欧美综合丁香网| 五月婷婷综合在线| 91操网| 欧美 日韩 成人| 久久99精品久| 狠狠狠五月婷婷六月丁香| 五月天久久久| 91性高潮久久久久久久久| 色五月综合| 日韩国产AV播放| 色婷婷六月精品| 国产一区二区三区影院| 女性自慰系列第五页| 久久99操| 久草视频一,二三四| 99精品在线观看视频| 五月丁香久久激情综合| 激情综合婷婷| 亚洲乱码日产精品BD在线观看| 日日骑夜夜撸| 淫视馆aV二区一区| 久青操| 91人操人人人操人| 婷婷丁香综合| 六月婷婷五月天| 97人妻人人| 99热在线成人网站| 久久综合图片| 丁香五月婷婷色| 91制片厂久久久国产电影| 99热这里只有精品50| 俺也去五月婷婷丁| 欧美毛片www| 在线18av | 99免费在线| 天天插天天插天天插天天插| 99在线免费视频| 综合一区二区三区| 五月天丁香成人社| 久9视频免费播放| 激情综合99| 91碰| 99ri在线视频| 色9999日韩国产| 九九Av| 五月激情小说| 久久亚洲色导航| 国产av天堂| 伊人五月人妻精品| 国产免费性爱| 五月久久丁香| 激情婷婷五月在线合集| www.狠狠艹| 五月天婷婷激情网| 激情亚洲婷婷| 丁香婷婷黄网站| 日韩aaa| 99这里只有精品国产| 国产精产国品一二三在观看| 天天色色婷婷| 人人操超碰| 色五月激情五月开心五月| 99久扒热| www.夜夜操.com| 欧美综合婷婷欧美综| 婷婷五月天99综合网站| 五月婷六月婷婷| 97热久久五月婷婷| 91热爆在线| 九九热10| 激情98色婷婷五| 伊人五月天在线| 欧美久久网| 丁香婷婷深情五月亚洲| 五月婷婷六月丁香激情综合网| 五月丁香六月片| 五月天婷婷色综合| 一区二区乱码视频| 婷婷五月天视频| 五月丁香人人婷婷在线观看| 色婷综合| 亚洲综合久| site:esunnet.com| 婷婷中文综合网| 久久激情天堂| 激情五月天婷婷免费观看| 99久久精品免费精品国产_国产精品久久久久久_国产在线|日韩_久久国产精品电影 | 99久久极情精品一区| 六月婷五月丁香| 亚洲天堂碰碰婷婷| 91操熟女| 色色丁香五月婷婷| 婷婷影院欧美| 九九热在线99| 9999热这里只有精品| 97人妻碰碰碰久久| 天天干天干| 五月婷婷免费| 婷婷天堂视频| 六月婷婷综合| 色色色色色色色色色色色色色色,网站| 偷拍91九色| 激情六月天| 四月丁香五月婷婷久久| 色噜噜狠狠色综| 大香蕉在线99热| 五月丁香综合激情网| 色婷婷五月天激情久久| 日本久久极品| 免费观看的av| 欧美精品熟女一区二区| 99九色视频在线观看| 成人在线二区| 色五月激情综合| 五月天婷婷青青| 五月婷婷,狠狠操| 国产做爰视频免费播放| 另类激情首页| 亚洲avjiujiur91| 69色婷婷| 一本大道熟女人妻中文字幕在线 | 亚洲综合在线播放| 天天草天天舔| 日韩精品一区二区亚洲AV观看| 99欧美| 婷婷色片| 九九热在线观看视频网站| 日本久久视频| 五月天操逼激情| 激情久久久| 夜夜夜夜夜操| 青青草a在线| 欧洲精品爱爱| 五月婷久久久久综合| 六月丁香啪啪| 色偷偷色婷婷| 日韩99色| 色情丁香五月婷婷精品| 2050人人操免费工开爱| 婷婷综合| 婷婷爱五月天| 婷婷在线午夜| 久热91| 麻豆精品| www,婷婷,com| 天天做天天爱| 999久久久国产精品| 我要射综合| 免费国产VA国产免费| 激情五月丁香色色去久久| 久久五月婷6 9| 超碰av在线| 播五月丁香三月婷婷| 天天操天天谢| 久久婷婷激情五月天一区二区| 99热销国产这里有精品| 婷婷99视频全集高清| 99这里有精品视频| 久久色五月| 欧美人妻一区二区| 久久 这里只有精品1| 天天爽夜夜爽夜夜爽精品| 丁香婷婷综合激情五月色| 天堂在线伊久| 风流少妇A片一区二区蜜桃| 超碰AV在线| 久久婷婷五月综合| 婷婷丁香激情五月天色色| 热热久久精品视频| 欧美日韩99| 99碰网站| 99免费青青蜜臀| 91婷婷丁香五月亚洲| 性按摩玩人妻HD中文字幕| 免费黄色片子| 超碰在线99|