99精品久久精品一区二区-亚洲熟妇无码?v在线播放-日本国产精品无码字幕在线观看-久久久亚洲永夜AV-亚洲一级无码一区二区一-免费国产成高清人在线视频-中文字幕乱码免费观看-国产毛片精品妇女久久久

ARTICLE DETAIL

資訊詳情

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

前端音視頻處理入門:從播放到錄制的避坑指南

前端音視頻處理入門:從播放到錄制的避坑指南 做了幾年前端音視頻相關(guān)項(xiàng)目從最初只會(huì)video標(biāo)簽播個(gè) MP4到后來被各種編碼格式、采集錄制、實(shí)時(shí)處理的問題按在地上摩擦中間踩的坑夠?qū)懸槐拘?cè)子了。說實(shí)話前端音視頻處理這個(gè)方向看著門坎不高——畢竟瀏覽器里video srcxxx.mp4一行代碼就能出畫面但一旦深入進(jìn)去水比想象中深得多。這篇文章我沒打算講那種“20分鐘學(xué)會(huì)音視頻”的速成套路而是想把入門階段的整體地圖給你鋪開核心概念是什么、技術(shù)棧怎么選、實(shí)操鏈路怎么走、性能怎么優(yōu)化、問題怎么排查。寫代碼的時(shí)間長(zhǎng)了你會(huì)發(fā)現(xiàn)音視頻處理的前端工程化程度其實(shí)很高它不像普通業(yè)務(wù)頁(yè)面那樣“寫個(gè) div 調(diào)個(gè)接口”就完事它牽扯到瀏覽器底層能力、編碼解碼原理、線程調(diào)度、內(nèi)存管理甚至移動(dòng)端的硬件差異。這篇文章適合剛接觸前端音視頻、想系統(tǒng)建立知識(shí)體系的同學(xué)也適合已經(jīng)寫過一些播放器、錄制功能但總被各種疑難雜癥困擾的初級(jí)工程師。我會(huì)盡量把每一個(gè)“為什么”講透把每一段代碼的意圖說清這樣你上手的路徑會(huì)順很多。1. 前端音視頻處理全景先搞清楚你到底在處理什么1.1 音視頻處理不只是“播放”一件事很多新手一聽到“前端音視頻處理”第一反應(yīng)是“我會(huì)寫video標(biāo)簽”——但這只是最表層的一環(huán)。從實(shí)際項(xiàng)目需求來看前端音視頻處理至少包含四個(gè)層次而且每一層的技術(shù)棧和思維方式差異很大。第一層是采集從麥克風(fēng)、攝像頭獲取音視頻流或者從本地文件讀取視頻文件。這一層涉及getUserMedia、input typefile、FileReader、IndexedDB 等 API。第二層是解碼與播放把編碼后的視頻文件解析成可渲染的畫面和可聽到的聲音。這層最核心的是容器格式MP4、WebM、FLV、編碼格式H.264、VP8、VP9、AV1以及瀏覽器原生解碼能力。為什么同一個(gè).mp4文件在 Chrome 上能播、在舊版 Safari 上黑屏就是因?yàn)槿萜骱途幋a之間的關(guān)系沒理順。第三層是實(shí)時(shí)處理音視頻不是播出去就完了實(shí)際項(xiàng)目里經(jīng)常要做剪輯、變速、畫面疊加、濾鏡、音頻可視化等等。這層要借助 Canvas、Web Audio API、WebGL 做幀級(jí)和采樣級(jí)操作。第四層是編碼與存儲(chǔ)處理完之后要輸出成文件這就要用MediaRecorder把流錄制成文件或者用captureStream捕獲 Canvas 畫面再錄制最后還要考慮存哪里、怎么傳服務(wù)器、大文件怎么分片上傳。我把這四層放在開頭講是因?yàn)楹芏囗?xiàng)目做崩了根源不在某一個(gè)環(huán)節(jié)而是產(chǎn)品需求和技術(shù)方案沒對(duì)齊——你想做剪輯卻一開始就在播放器上死磕那自然越做越偏。1.2 容器格式與編碼格式不搞懂這個(gè)后面全是坑“容器”和“編碼”這兩個(gè)概念是前端音視頻入門階段最容易被混淆的。簡(jiǎn)單類比容器像一個(gè)盒子里面裝著視頻軌和音頻軌編碼則是視頻畫面或音頻波形本身的壓縮算法。.mp4是盒子盒子里面裝的東西可以是 H.264 編碼的視頻、AAC 編碼的音頻.webm也是盒子里面通常裝 VP8/VP9 編碼的視頻和 Opus 編碼的音頻。瀏覽器支不支持一個(gè)視頻文件看的不是容器而是容器里裝的編碼格式。這就是為什么你在網(wǎng)上下載了一個(gè).mkv格式的電影拖進(jìn)瀏覽器直接沒法播——不是瀏覽器不認(rèn)mkv這個(gè)后綴而是里面裝的可能是 HEVC 編碼瀏覽器沒有對(duì)應(yīng)的解碼器。前端開發(fā)里最常用的幾個(gè)推斷我直接給你列出來// 檢測(cè)瀏覽器能否播放指定編碼格式 const video document.createElement(video); const supportResult video.canPlayType(video/mp4; codecsavc1.42E01E, mp4a.40.2); // 返回值可能是 probably、maybe、 三種 // probably 表示大概率支持 表示完全不支持avc1.42E01E代表 H.264 Baseline Profile Level 3.0mp4a.40.2代表 AAC-LC 音頻。這套 codec string 看起來像天書但你不用全背下來只要理解原理開發(fā)音視頻功能前先做一次瀏覽器能力檢測(cè)會(huì)比上線后收到一堆“視頻播放不了”的反饋舒服得多。移動(dòng)端和桌面端的差異也很大iOS Safari 對(duì) H.264 支持得很好但對(duì) WebMVP9的支持是 iOS 14.3 之后才逐步引入的Android Chrome 對(duì) H.264 和 VP9 都支持但低端機(jī)的解碼能力差異明顯。這就是為什么很多音視頻團(tuán)隊(duì)在“統(tǒng)一編碼格式”這件事上特別較真格式選錯(cuò)了后期要賠上幾倍的兼容性成本去填坑。1.3 瀏覽器能力邊界哪些能做哪些做不了前端做音視頻有一道繞不開的墻瀏覽器的安全策略和能力邊界。大方向上瀏覽器能做的事情越來越多但實(shí)時(shí)音視頻處理能力有限底層的硬編碼和海量幀操作往往力不從心。能做的是播放主流格式H.264/VP9、采集麥克風(fēng)攝像頭、錄制 MediaRecorder 支持的格式WebM 為主、用 Canvas/WebGL 做幀級(jí)繪制、用 Web Audio API 做音頻分析和處理。做不了或者很難做的是高性能的 H.265/HEVC 解碼播放、大規(guī)模的轉(zhuǎn)碼任務(wù)比如把一個(gè) 2 小時(shí)視頻轉(zhuǎn)成另一種格式、低延遲的大規(guī)模直播推流。這些場(chǎng)景要么借助 WebAssembly比如 ffmpeg.wasm要么依賴服務(wù)端的轉(zhuǎn)碼集群。這里還要提一句WebCodecs。這個(gè) API 把視頻解碼和編碼的底層能力暴露給了前端理論上可以讓開發(fā)者繞過瀏覽器的默認(rèn)解碼流程自己做更精細(xì)的控制。它是前端音視頻的未來方向但目前各瀏覽器的支持程度參差不齊生產(chǎn)環(huán)境使用要謹(jǐn)慎。我在做實(shí)時(shí)濾鏡方案時(shí)試用過Chrome 上表現(xiàn)可以但 Safari 完全不支持所以最終項(xiàng)目還是走了 Canvas captureStream的老路。2. 核心前端技術(shù)選型API、庫(kù)與工具怎么看2.1 原生 API 全家桶先把家底摸清做前端音視頻原生 API 是你最該依賴的基礎(chǔ)設(shè)施每個(gè)都有它不可替代的場(chǎng)景。我把項(xiàng)目里最常用的幾個(gè)整理成了一張腦圖式的清單并按用途分類video/audio標(biāo)簽 Media API播放控制、狀態(tài)獲取是“播放器”的地基。事件體系尤其重要loadedmetadata、timeupdate、ended、waiting、canplay這些高頻事件必須爛熟于心。getUserMedia采集攝像頭和麥克風(fēng)流是所有“攝像頭預(yù)覽”“視頻通話”“錄制”功能的第一步。MediaRecorder把 MediaStream 錄制為文件支持timeslice參數(shù)做分片錄制是實(shí)現(xiàn)“前端錄制”和“錄像分段上傳”的核心。Web Audio API音頻的采集、播放、分析、處理。AnalyserNode做頻譜可視化是入門必練GainNode、BiquadFilterNode可以做增益和濾波。Canvas 2D / WebGL視頻幀的繪制、截取、濾鏡、疊加是“視頻編輯”的前端基礎(chǔ)。MediaStream captureStream()把 Canvas 的實(shí)時(shí)畫面轉(zhuǎn)換成 MediaStream這是前端做“屏幕錄制”“畫中畫”“視頻合成”的關(guān)鍵橋梁。Web Worker音視頻計(jì)算中的重活像素遍歷、轉(zhuǎn)碼碎片、數(shù)據(jù)處理丟到后臺(tái)線程防止 UI 卡死。IndexedDB本地存儲(chǔ)大體積的音視頻二進(jìn)制數(shù)據(jù)和分片解決“錄制中切后臺(tái)導(dǎo)致內(nèi)存暴漲”的問題。原生的 API 組合起來已經(jīng)能覆蓋絕大多數(shù)業(yè)務(wù)場(chǎng)景。很多項(xiàng)目一上來就引入一堆重型庫(kù)其實(shí)先摸清原生能力邊界很多問題用幾十行代碼就能解決——尤其是在頁(yè)面性能捉襟見肘的時(shí)候少引一個(gè)庫(kù)內(nèi)存和加載時(shí)間就省一分。2.2 第三方庫(kù)的取舍hls.js、flv.js、video.js 到底該用哪個(gè)原生 API 強(qiáng)但還不夠全比如 HTTP 直播流HLS和 FLV 格式在原生播放器里支持有限這時(shí)候就要引入第三方庫(kù)。我的選型經(jīng)驗(yàn)是先看協(xié)議再看生態(tài)最后才是包體積。如果業(yè)務(wù)是點(diǎn)播普通的 MP4 video 標(biāo)簽就夠沒必要上框架。如果是直播流HLS 協(xié)議在 iOS 原生支持、Android Chrome 原生支持新版但桌面端 Safari 和 Chrome 行為不一致這時(shí)候用hls.js可以統(tǒng)一體驗(yàn)。hls.js會(huì)把 HLS 流拉下來轉(zhuǎn)成 MediaSource 格式喂給瀏覽器解碼實(shí)現(xiàn)跨端播放。如果是 FLV 格式的直播流很多國(guó)內(nèi) CDN 還在用flv.js基本是唯一選擇。底層原理同樣是基于 MediaSource ExtensionsMSE做格式轉(zhuǎn)換。這兩個(gè)庫(kù)我實(shí)測(cè)下來hls.js維護(hù)更活躍、兼容性更好flv.js的狀況差一些對(duì)一些奇奇怪怪的擴(kuò)展字段支持不穩(wěn)定項(xiàng)目里用的話建議鎖版本。至于video.js這類播放器框架它是“UI 外殼 插件機(jī)制 解碼適配層”的組合體好處是功能全面、有皮膚、有插件生態(tài)壞處是體積大、定制起來掣肘多。我的建議是如果你只是做一個(gè)視頻網(wǎng)站video.js 是省力選擇如果你的產(chǎn)品核心是音視頻處理能力最好基于原生 video 元素自建播放器外殼。自己做播放器沒有想象中那么難因?yàn)楹诵牡牟シ拧和?、seek、緩沖邏輯瀏覽器都處理好了你只需要管理 UI 狀態(tài)和交互事件。2.3 選型判斷標(biāo)準(zhǔn)不是功能越多越好選技術(shù)方案時(shí)我總結(jié)了一套判斷標(biāo)準(zhǔn)分享給入門的朋友參考。這里不是羅列產(chǎn)品而是給你幾個(gè)決策維度免得被社區(qū)里的“新技術(shù)崇拜”帶跑偏決策維度判斷要點(diǎn)實(shí)戰(zhàn)建議業(yè)務(wù)匹配度是點(diǎn)播、直播還是實(shí)時(shí)通信直播優(yōu)先 hls.js/flv.js實(shí)時(shí)通信直接上 WebRTC兼容性范圍要覆蓋哪些瀏覽器、哪些版本老平臺(tái)多則少用新技術(shù)比如 WebCodecs 別碰體積與性能庫(kù)的打包體積、解碼消耗能用原生 20 行解決的需求不引庫(kù)維護(hù)活躍度社區(qū) issue 響應(yīng)、commit 頻率死了的項(xiàng)目別選踩坑沒人管定制深度產(chǎn)品到底需要多深的自定義深度定制的需求優(yōu)先自己封裝、底層自研舉個(gè)實(shí)際例子之前做一個(gè)直播回放項(xiàng)目一開始打算引video.jshls.js雙保險(xiǎn)結(jié)果光是插件之間的事件沖突就折騰了兩天。后來直接把直播獨(dú)立成一個(gè)原生 video 組件HLS 解析單獨(dú)用hls.js處理代碼少了三分之一出問題也能更快定位是播放器的問題還是流的問題。3. 實(shí)操鏈路一文件讀取、播放與格式兼容處理3.1 從 file input 到播放URL.createObjectURL 的正確姿勢(shì)本地文件播放是最常見的入門需求但很多人一上來就踩到FileReader.readAsDataURL的坑——把整個(gè)視頻文件讀成 base64 字符串再塞給 video幾 MB 的小視頻沒事幾十 MB 的視頻直接內(nèi)存爆炸。正確姿勢(shì)是URL.createObjectURL(file)它生成一個(gè)blob:協(xié)議的臨時(shí)地址瀏覽器會(huì)按流式讀取文件不占額外內(nèi)存。const fileInput document.querySelector(#fileInput); const video document.querySelector(#videoPlayer); fileInput.addEventListener(change, (e) { const file e.target.files[0]; if (!file) return; // 清理上一個(gè)對(duì)象的 URL避免內(nèi)存泄露 if (video.src) { URL.revokeObjectURL(video.src); } const objectUrl URL.createObjectURL(file); video.src objectUrl; video.play().catch(err { console.warn(自動(dòng)播放失敗等待用戶交互, err); }); });這里有個(gè)初學(xué)容易忽略的細(xì)節(jié)URL.revokeObjectURL一定要在合適的時(shí)機(jī)調(diào)用。如果視頻還在播放你卻提前把這個(gè) URL 撤銷了瀏覽器會(huì)直接中斷讀取。我在一個(gè)項(xiàng)目里遇到過“視頻播到一半突然卡死”的 bug排查半天最后發(fā)現(xiàn)是某段代碼在loadedmetadata之后就把 objectURL 撤銷了——這種問題連報(bào)錯(cuò)都不會(huì)有特別陰。正確時(shí)機(jī)是視頻加載完成、替換新視頻之前或者組件卸載時(shí)。3.2 拿到視頻元數(shù)據(jù)時(shí)長(zhǎng)、尺寸、清晰度判斷處理視頻之前先取得視頻的元數(shù)據(jù)是必須的。比如上傳視頻時(shí)需要在頁(yè)面展示視頻時(shí)長(zhǎng)和分辨率或者在大列表頁(yè)顯示“時(shí)長(zhǎng) XX:XX”的角標(biāo)。這些信息不是從文件名猜的需要在loadedmetadata事件里讀取video.addEventListener(loadedmetadata, () { const duration video.duration; // 單位秒可能為 Infinity直播流 const width video.videoWidth; // 視頻原始寬度 const height video.videoHeight; // 視頻原始高度 const formatInfo getVideoFormatString(); // 通過 canPlayType 檢測(cè) console.log(時(shí)長(zhǎng) ${formatDuration(duration)}分辨率 ${width}x${height}); }); function formatDuration(seconds) { if (!isFinite(seconds)) return 直播中; const m Math.floor(seconds / 60); const s Math.floor(seconds % 60); return ${m}:${s.toString().padStart(2, 0)}; }注意video.duration對(duì)直播流返回Infinity直接格式化會(huì)輸出一個(gè)崩潰的數(shù)字。所以項(xiàng)目里凡是展示時(shí)長(zhǎng)的地方都要先做isFinite判斷。另外videoWidth和videoHeight在視頻元數(shù)據(jù)加載完成之前是 0千萬(wàn)別在loadedmetadata之前讀取否則你會(huì)在桌面端測(cè)試正常、手機(jī)端拿到的全是 0。3.3 播放控制與自動(dòng)播放的那些尷尬事播放控制不算難但“自動(dòng)播放”問題幾乎是所有前端音視頻開發(fā)者都會(huì)遇到的坑。Chrome、Safari 等瀏覽器有一套“自動(dòng)播放策略”有聲音的視頻默認(rèn)禁止自動(dòng)播放靜音的視頻允許自動(dòng)播放。而且這個(gè)策略還會(huì)受到用戶的媒體參與度影響——用戶如果在某個(gè)網(wǎng)站經(jīng)??匆曨l這個(gè)網(wǎng)站的自動(dòng)播放權(quán)限會(huì)變寬松。解決方案也很成熟要么把視頻設(shè)成靜音再play()要么等用戶交互點(diǎn)擊按鈕后再觸發(fā)播放。實(shí)際開發(fā)里最穩(wěn)妥的寫法是async function playVideo(videoElement) { try { videoElement.muted true; // 先靜音繞過自動(dòng)播放策略 await videoElement.play(); // 播放成功后再恢復(fù)音量如果業(yè)務(wù)需要 // videoElement.muted false; } catch (err) { // 自動(dòng)播放被攔截需要用戶手動(dòng)點(diǎn)擊 showPlayButton(); } }這條經(jīng)驗(yàn)我從一個(gè)頁(yè)面埋點(diǎn)項(xiàng)目中總結(jié)出來的首屏視頻如果帶著聲音自動(dòng)播放轉(zhuǎn)化率不但沒提高反而用戶因?yàn)楸煌蝗怀雎晣樀蕉焖賱澴摺:髞砀某伸o音自動(dòng)播放 “點(diǎn)擊開聲音”按鈕數(shù)據(jù)才回到正常水平。所以自動(dòng)播放策略雖然是個(gè)技術(shù)限制但很多時(shí)候它也在幫產(chǎn)品做更好的體驗(yàn)設(shè)計(jì)。4. 實(shí)操鏈路二采集、錄制與本地存儲(chǔ)4.1 用 getUserMedia 采集麥克風(fēng)和攝像頭采集音視頻流是錄屏、視頻通話、拍照功能的地基。getUserMedia返回一個(gè)MediaStream對(duì)象可以同時(shí)包含視頻軌和音頻軌。使用時(shí)要特別注意權(quán)限提示的觸發(fā)條件和設(shè)備約束async function initCamera(constraints) { // constraints 示例{ video: { width: 1280, height: 720 }, audio: true } try { const stream await navigator.mediaDevices.getUserMedia(constraints); const video document.querySelector(#previewVideo); video.srcObject stream; // 注意是 srcObject不是 src return stream; } catch (err) { if (err.name NotAllowedError) { console.error(用戶拒絕了攝像頭/麥克風(fēng)權(quán)限); } else if (err.name NotFoundError) { console.error(沒有找到可用的攝像頭/麥克風(fēng)設(shè)備); } else if (err.name NotReadableError) { console.error(設(shè)備被其他應(yīng)用占用無(wú)法訪問); } throw err; } }三個(gè)高頻坑我挨個(gè)說第一srcObject和src是兩回事如果把MediaStream對(duì)象賦給src頁(yè)面會(huì)什么都不顯示。第二getUserMedia必須在HTTPS 或 localhost環(huán)境下調(diào)用你在本地file://協(xié)議下預(yù)覽攝像頭會(huì)直接報(bào)錯(cuò)這個(gè)不知道的話會(huì)讓人懷疑人生。第三拿到的MediaStream在用完一定要停止所有 track 釋放設(shè)備否則攝像頭指示燈一直亮著在移動(dòng)端還會(huì)加快耗電、導(dǎo)致其他應(yīng)用無(wú)法使用攝像頭。4.2 MediaRecorder 錄制與分片從流到文件的最后一公里采集到流之后如果要把畫面錄下來核心 API 是MediaRecorder。它接收MediaStream輸出 Blob。最關(guān)鍵的參數(shù)是mimeType和timeslicefunction startRecording(stream) { // 優(yōu)先選擇瀏覽器支持的錄制格式 const mimeType [ video/webm;codecsvp9,opus, video/webm;codecsvp8,opus, video/mp4 ].find(type MediaRecorder.isTypeSupported(type)) || ; const recorder new MediaRecorder(stream, { mimeType, videoBitsPerSecond: 2_500_000, // 2.5Mbps畫質(zhì)和體積的一個(gè)平衡點(diǎn) audioBitsPerSecond: 128_000 // 128kbps 音頻碼率 }); const chunks []; recorder.ondataavailable (e) { if (e.data.size 0) chunks.push(e.data); }; recorder.onstop () { const blob new Blob(chunks, { type: mimeType }); const url URL.createObjectURL(blob); // 可以在這里做預(yù)覽、上傳等后續(xù)操作 }; // timeslice 參數(shù)傳 1000ms每 1 秒觸發(fā)一次 dataavailable // 好處錄制結(jié)束后不需要等全部數(shù)據(jù)一次性打包內(nèi)存壓力小 recorder.start(1000); return recorder; }timeslice參數(shù)是個(gè)容易被忽視的優(yōu)化點(diǎn)。不傳的話錄制過程中數(shù)據(jù)會(huì)積壓在內(nèi)存里錄制快結(jié)束時(shí)一次性觸發(fā)dataavailable大視頻很容易把內(nèi)存吃滿。傳了timeslice之后每過指定毫秒就吐一片數(shù)據(jù)配合onprogress事件還能做“錄制中實(shí)時(shí)預(yù)覽處理”。注意錄制文件的格式在 Chrome 里默認(rèn)是 WebM也就是你錄出來的文件后綴是.webm很多用戶不知道這個(gè)格式怎么打開所以錄完之后提供一個(gè)轉(zhuǎn)碼入口或者干脆在服務(wù)端做格式轉(zhuǎn)換。4.3 本地存儲(chǔ)與上傳BigBlob 的分片處理方案錄制出來的文件往往體積不小直接fetch上傳容易因?yàn)槌瑫r(shí)或網(wǎng)絡(luò)抖動(dòng)半途失敗。我的通用方案是先存 IndexedDB再?gòu)?IndexedDB 里分片讀取上傳。分片上傳的核心思想是“斷點(diǎn)續(xù)傳”把大文件切成固定大小的塊每一塊單獨(dú)上傳服務(wù)端記錄哪些塊已經(jīng)到了哪些塊還沒到。切片的實(shí)現(xiàn)有兩種思路一種是把 Blob 直接按偏移量slice成小 Blob另一種是配合 Web Worker 做文件讀取和數(shù)據(jù) hash 計(jì)算。// 分片上傳的核心按偏移量切分 Blob const CHUNK_SIZE 5 * 1024 * 1024; // 5MB 一片 async function uploadInChunks(blob, fileId) { const totalChunks Math.ceil(blob.size / CHUNK_SIZE); for (let chunkIndex 0; chunkIndex totalChunks; chunkIndex) { const start chunkIndex * CHUNK_SIZE; const end Math.min(start CHUNK_SIZE, blob.size); const chunk blob.slice(start, end); // 每片構(gòu)造 FormData 上傳攜帶索引和文件標(biāo)識(shí) const formData new FormData(); formData.append(chunk, chunk); formData.append(fileId, fileId); formData.append(chunkIndex, chunkIndex); formData.append(totalChunks, totalChunks); // 上傳失敗要重試重試次數(shù)建議 3 次以上 await uploadWithRetry(formData); } }這里最值得投入的是“上傳進(jìn)度的恢復(fù)能力”而不是上傳本身。用戶在上傳一個(gè) 2GB 視頻的時(shí)候網(wǎng)絡(luò)斷了、瀏覽器關(guān)了能不能在下次打開時(shí)從上次的位置續(xù)傳直接決定了這個(gè)功能的可用性。所以前端這邊要把“哪些塊傳完了”這個(gè)狀態(tài)持久化到 IndexedDB服務(wù)端也要提供“查詢已接收塊”的接口。單純的“切塊上傳”而不支持?jǐn)帱c(diǎn)同步遇到大型素材就是災(zāi)難現(xiàn)場(chǎng)。5. 實(shí)操鏈路三實(shí)時(shí)可視化與幀級(jí)處理5.1 用 AnalyserNode 做音頻可視化波形和頻譜是怎么來的音頻可視化是很多前端第一個(gè)接觸 Web Audio API 的契機(jī)。核心概念不復(fù)雜音頻流經(jīng)過AnalyserNode時(shí)瀏覽器會(huì)對(duì)時(shí)域信號(hào)做快速傅里葉變換FFT得到頻域數(shù)據(jù)然后你拿這些數(shù)據(jù)去繪制柱狀圖。const audioCtx new AudioContext(); const analyser audioCtx.createAnalyser(); analyser.fftSize 256; // 頻率分辨率 采樣率 / fftSize analyser.smoothingTimeConstant 0.8; // 時(shí)間平滑讓動(dòng)畫不那么生硬 // 拿到音頻源連接到 analyser const source audioCtx.createMediaElementSource(audioElement); source.connect(analyser); analyser.connect(audioCtx.destination); const bufferLength analyser.frequencyBinCount; const dataArray new Uint8Array(bufferLength); function drawSpectrum() { requestAnimationFrame(drawSpectrum); analyser.getByteFrequencyData(dataArray); // 清空畫布 ctx.clearRect(0, 0, canvas.width, canvas.height); // 遍歷每個(gè)頻率分區(qū)畫矩形柱 const barWidth canvas.width / bufferLength; for (let i 0; i bufferLength; i) { const value dataArray[i]; const barHeight (value / 255) * canvas.height; ctx.fillStyle hsl(${(i / bufferLength) * 360}, 70%, 50%); ctx.fillRect(i * barWidth, canvas.height - barHeight, barWidth, barHeight); } }容易踩的坑是createMediaElementSource連上之后原本audio標(biāo)簽的聲音路徑會(huì)發(fā)生改變?nèi)绻话補(bǔ)nalyser連回audioCtx.destination你會(huì)看到可視化在動(dòng)但聽不到聲音。另一個(gè)坑是瀏覽器對(duì)AudioContext的啟動(dòng)限制它要求在用戶手勢(shì)之后才能恢復(fù)audioCtx.resume()否則剛開始音量是靜默的。所以我一般在用戶點(diǎn)擊“播放”按鈕時(shí)才創(chuàng)建或resume這個(gè) context不要在頁(yè)面加載時(shí)初始化。5.2 視頻幀截圖從視頻到圖片的魔法一線牽從視頻里截一幀做成封面圖這是個(gè)特別常用的功能實(shí)現(xiàn)起來卻極其巧妙。思路是把當(dāng)前幀畫到 Canvas 上再?gòu)?Canvas 導(dǎo)出圖片。關(guān)鍵點(diǎn)在于drawImage的調(diào)用時(shí)機(jī)——如果你還沒準(zhǔn)備好就調(diào)用畫出來的是黑屏或者一幀沒解碼完的畫面。video.addEventListener(seeked, () { // 等 seek 完成后再截幀保證畫面已經(jīng)渲染出來 captureFrame(); }); function captureFrame() { canvas.width video.videoWidth; canvas.height video.videoHeight; ctx.drawImage(video, 0, 0, canvas.width, canvas.height); const imageUrl canvas.toDataURL(image/jpeg, 0.9); // imageUrl 就是 base64 的 JPEG 圖片可用于預(yù)覽或上傳 }一個(gè)實(shí)操細(xì)節(jié)如果你想截取“某一秒”的幀但視頻還沒在那個(gè)時(shí)刻解碼完直接drawImage會(huì)拿到一幀模糊畫面。正確做法是先把video.currentTime設(shè)到目標(biāo)時(shí)間等seeked事件觸發(fā)后再截。我做過一個(gè)抽幀拼接長(zhǎng)圖預(yù)覽的場(chǎng)景做了個(gè)循環(huán)每跳一段seeked就截一幀一共抽 20 幀拼成一張預(yù)覽圖。這里性能陷阱是 Canvas 寬度不要超過視頻原寬否則內(nèi)存開銷成倍增長(zhǎng)。另外一個(gè)容易忽略的細(xì)節(jié)是 Canvas 的跨域問題。如果你播放的視頻來自 CDN 且響應(yīng)頭沒設(shè)置Access-Control-Allow-OrigindrawImage之后調(diào)用canvas.toDataURL會(huì)拋出一個(gè)SecurityError。解決辦法是video.crossOrigin anonymous并且保證 CDN 返回對(duì)應(yīng) CORS 頭。這兩個(gè)條件缺一個(gè)都不行。5.3 用 captureStream 做畫中畫、濾鏡和實(shí)時(shí)合成前端音視頻里最有意思的部分是用 Canvas 做實(shí)時(shí)畫面合成。需求場(chǎng)景通常是攝像頭畫面上疊加一個(gè)品牌水印或一個(gè)說明文字欄或者兩個(gè)視頻源拼接成一個(gè)畫面畫中畫再或者給視頻加濾鏡效果。實(shí)現(xiàn)思路是把視頻幀或MediaStream畫到 Canvas 上然后用canvas.captureStream(frameRate)生成新的MediaStream最后再走 MediaRecorder 錄制或者直接通過 WebRTC 推送。這樣一來你其實(shí)在瀏覽器里搭了一條“視頻處理流水線”// 1. 創(chuàng)建畫布設(shè)置尺寸和視頻畫面按比例對(duì)應(yīng) const canvas document.createElement(canvas); canvas.width 1280; canvas.height 720; const ctx canvas.getContext(2d); // 2. 每一幀把視頻畫上去同時(shí)疊加水印和濾鏡 function drawFrame() { ctx.drawImage(video, 0, 0, 1280, 720); // 疊加左上角水印 ctx.globalAlpha 0.7; ctx.font bold 32px sans-serif; ctx.fillStyle white; ctx.fillText(My Brand, 24, 48); ctx.globalAlpha 1.0; requestAnimationFrame(drawFrame); } drawFrame(); // 3. 把畫布變成媒體流 const mixedStream canvas.captureStream(30); const recorder new MediaRecorder(mixedStream, { mimeType: video/webm;codecsvp9, videoBitsPerSecond: 3_000_000 }); recorder.start();這里最需要留神的是Canvas 的最大尺寸限制。移動(dòng)端 Safari 對(duì) Canvas 面積有嚴(yán)格要求一般是 4096×4096 像素以內(nèi)超過之后 Canvas 會(huì)渲染空白。不同機(jī)型的閾值還不一樣所以生產(chǎn)環(huán)境建議先做一次尺寸探測(cè)把畫布開大畫一幀純色讀取像素判斷有沒有被壓縮成空白。captureStream的幀率參數(shù)也別拍腦袋定。如果視頻源本身是 24fps你設(shè)置 60fps 的captureStream錄制出來的文件并不會(huì)更流暢只會(huì)在像素級(jí)別多產(chǎn)生重復(fù)幀白白增大文件體積。一般設(shè)置跟視頻源一致就行最多 30fps。之前一個(gè)錄屏項(xiàng)目里幀率配太高導(dǎo)致錄制文件比預(yù)期大了 40%排查半天發(fā)現(xiàn)就是這個(gè)參數(shù)的問題。6. 性能優(yōu)化要點(diǎn)別讓頁(yè)面卡成 PPT6.1 requestVideoFrameCallback比 requestAnimationFrame 更靠譜前端做視頻幀處理時(shí)最高頻的問題就是“幀不同步”。用requestAnimationFrame去循環(huán)繪制視頻畫面會(huì)因?yàn)橐曨l本身的播放節(jié)奏和屏幕刷新節(jié)奏不一致導(dǎo)致抽幀或者撕裂。requestVideoFrameCallback簡(jiǎn)稱 RVFC是專門為視頻幀提供的回調(diào) API可以在每一幀新視頻幀準(zhǔn)備好時(shí)精確觸發(fā)回調(diào)適合做幀級(jí)處理。function processVideoFrame(now, metadata) { // metadata.mediaTime 是當(dāng)前視頻播放時(shí)間 // metadata.presentationTime 是幀的展示時(shí)間 ctx.drawImage(video, 0, 0, canvas.width, canvas.height); // 處理完這一幀后注冊(cè)下一幀回調(diào) video.requestVideoFrameCallback(processVideoFrame); } video.requestVideoFrameCallback(processVideoFrame);RVFC 最大的價(jià)值是它保證回調(diào)發(fā)生在該幀已經(jīng)準(zhǔn)備好渲染的時(shí)刻不會(huì)出現(xiàn)你drawImage時(shí)剛好拿到的是上一幀畫面。這個(gè) API 在 Chrome 和 Edge 上支持良好Safari 目前不支持所以使用時(shí)要做降級(jí)處理在不支持的環(huán)境里退回requestAnimationFrame。我把兩個(gè) API 封裝成了一個(gè)小工具函數(shù)業(yè)務(wù)代碼里不用關(guān)心底層差異。前端音視頻處理里最容易卡頓的兩個(gè)場(chǎng)景是循環(huán)drawImage和實(shí)時(shí)濾鏡計(jì)算。前者用 RVFC 能顯著改善流暢度后者如果依賴 Canvas 濾鏡 API如ctx.filter要注意這個(gè)屬性在部分手機(jī)上性能極差我實(shí)測(cè)在低端 Android 機(jī)上用ctx.filter做高斯模糊幀率直接降到個(gè)位數(shù)。同樣的效果用 WebGL 或者預(yù)渲染多層 Canvas 實(shí)現(xiàn)性能會(huì)好很多。6.2 用 Web Worker 扛住重計(jì)算主線程才有余力渲染音視頻處理中的計(jì)算密集任務(wù)比如視頻幀像素遍歷、WebAssembly 轉(zhuǎn)碼片段、音頻數(shù)據(jù)緩沖處理如果放在主線程跑頁(yè)面會(huì)直接掉幀到?jīng)]法看。把這些任務(wù)扔給 Web Worker 是標(biāo)準(zhǔn)解法。Worker 和主線程之間不能共享 DOM但可以傳遞ArrayBuffer、SharedArrayBuffer這類二進(jìn)制數(shù)據(jù)。// worker.js self.onmessage (event) { const { imageData, filters } event.data; const data imageData.data; // Uint8ClampedArrayRGBA 像素 for (let i 0; i data.length; i 4) { // 做灰度化等像素級(jí)操作 const gray data[i] * 0.3 data[i 1] * 0.59 data[i 2] * 0.11; data[i] data[i 1] data[i 2] gray; } self.postMessage({ imageData, message: done }, [imageData.data.buffer]); // 把 buffer 轉(zhuǎn)移回主線程避免拷貝 };這里有個(gè)“轉(zhuǎn)移 vs 拷貝”的性能知識(shí)點(diǎn)postMessage默認(rèn)會(huì)做一個(gè)結(jié)構(gòu)化克隆大體積的ArrayBuffer會(huì)被完整復(fù)制一遍相當(dāng)于多占一份內(nèi)存。你用第二個(gè)參數(shù)把ArrayBuffer的所有權(quán)“轉(zhuǎn)移”給 Worker主線程這邊就不再持有它了零拷貝傳遞性能好很多。但注意轉(zhuǎn)移之后主線程的原始變量就無(wú)法再訪問了所以設(shè)計(jì)上要規(guī)劃好數(shù)據(jù)的流動(dòng)方向。Worker 的另一個(gè)典型使用場(chǎng)景是配合大文件處理。文件分片讀取后可以切一部分到 Worker 里計(jì)算片段的校驗(yàn)值或做加密處理主線程只負(fù)責(zé)進(jìn)度的渲染。我接手過一個(gè)上傳組件把文件切片和 hash 計(jì)算放進(jìn) Worker 之后整個(gè)頁(yè)面的 input 響應(yīng)速度明顯提升尤其是 1GB 往上的視頻文件差距特別明顯。6.3 內(nèi)存與性能實(shí)測(cè)大視頻處理的內(nèi)存管理細(xì)節(jié)前端音視頻項(xiàng)目?jī)?nèi)存泄漏幾乎是 100% 會(huì)遇到的問題。我自己最常遇到的三個(gè)內(nèi)存隱患列出來供你自查第一播放器 srcObject 沒有清理。切換攝像頭或關(guān)閉預(yù)覽時(shí)如果不遍歷stream.getTracks()把每個(gè) track 都stop()設(shè)備會(huì)一直占用頁(yè)面會(huì)一直持有這路流的引用內(nèi)存只增不減。function stopStream(stream) { if (!stream) return; stream.getTracks().forEach(track track.stop()); }第二MediaRecorder 的 chunks 數(shù)組無(wú)限增長(zhǎng)。如果錄長(zhǎng)視頻且不做分片處理所有 Blob 都堆在數(shù)組里錄制超過二十分鐘內(nèi)存占用就能輕松破百 MB。正確做法是每收到一個(gè)dataavailable事件就立刻寫入 IndexedDB或者在timeslice參數(shù)下持續(xù)把分片appendBlob到目標(biāo)存儲(chǔ)不要全放在內(nèi)存里。第三Canvas 頻繁重建。每次調(diào)整視頻尺寸都canvas.width xxx會(huì)觸發(fā) Canvas 的底層緩沖重建舊緩沖如果沒有被正確釋放會(huì)產(chǎn)生碎片化內(nèi)存。最佳實(shí)踐是在初始化時(shí)把 Canvas 尺寸定到視頻的最大分辨率后續(xù)只改繪制區(qū)域的變換不要反復(fù)改尺寸。7. 常見問題與排查技巧實(shí)錄7.1 那些讓前端音視頻開發(fā)者頭皮發(fā)麻的典型現(xiàn)象做音視頻功能的時(shí)間久了你會(huì)發(fā)現(xiàn)報(bào)錯(cuò)的品種五花八門但根源往往集中在幾個(gè)固定的模式上。我整理了一個(gè)速查表方便你在面對(duì)線上問題時(shí)快速定位方向問題現(xiàn)象可能原因排查思路視頻設(shè)置了 src 但黑屏編碼格式瀏覽器不支持或者自動(dòng)播放被攔截先canPlayType檢測(cè)格式再手動(dòng)調(diào)用play()看報(bào)錯(cuò)信息有畫面沒聲音音軌編碼不支持或沒有連接音頻輸出節(jié)點(diǎn)檢查音頻軌道、Web Audio 路由、audioCtx.destination連接錄制出來的文件是 0KB 或幾KBMediaRecorder 的 mimeType 不受支持用MediaRecorder.isTypeSupported檢測(cè)后降級(jí)選格式播放到一半卡住表現(xiàn)為一直 loading網(wǎng)絡(luò)帶寬問題或流媒體分段加載邏輯異常監(jiān)聽waiting、stalled事件觀察 Network 面板請(qǐng)求序列視頻播放流暢但頁(yè)面 UI 卡頓主線程被 DrawImage 或?yàn)V鏡計(jì)算占滿用 Performance Profiler 看長(zhǎng)任務(wù)分配 Worker 降載自動(dòng)播放被攔截?zé)o法正常開啟瀏覽器自動(dòng)播放策略靜音播放兜底或等待用戶點(diǎn)擊后再 play在 iOS 上視頻無(wú)法內(nèi)聯(lián)播放iOS 默認(rèn)全屏播放策略設(shè)置playsinline屬性必要時(shí)配合muted截幀時(shí)canvas.toDataURL報(bào) SecurityError視頻跨域且沒有 CORS 支持設(shè)置crossOrigin anonymous同時(shí)保證服務(wù)端返回 CORS 頭這里面最玄學(xué)的是“黑屏問題”。我有一次排查一個(gè)播放器 bug排查到最后發(fā)現(xiàn)是 CSS 里video { object-fit: fill }加上父容器高度為 0 導(dǎo)致畫面被裁沒了。所以遇到黑屏別急著懷疑解碼層先按順序排除樣式 → 視頻源 → 格式兼容 → 解碼器 → 網(wǎng)絡(luò)流。7.2 我的排錯(cuò)方法論別讓問題帶著你跑偏排錯(cuò)這件事方法論比經(jīng)驗(yàn)本身更重要。面對(duì)音視頻 bug我的固定套路是“局部二分法”先確認(rèn)問題出在采集、播放、處理、存儲(chǔ)哪個(gè)環(huán)節(jié)再把該環(huán)節(jié)的變量逐一固定找到那個(gè)必現(xiàn)的條件。比如“播放器在部分用戶那里偶爾黑屏”我先看這些用戶的操作路徑是不是都是走了“從本地選擇文件”這個(gè)入口。如果是那就把問題收斂到文件讀取環(huán)節(jié)再進(jìn)一步對(duì)比發(fā)現(xiàn)出問題的全是上傳的.mov文件而.mov這個(gè)容器在 Windows Chrome 上有時(shí)會(huì)出現(xiàn)解碼異常。到這里問題原因就八九不離十了。另一個(gè)關(guān)鍵習(xí)慣是“寫診斷日志層”。音視頻狀態(tài)變化多、異步鏈路長(zhǎng)我在每個(gè)關(guān)鍵節(jié)點(diǎn)都埋上結(jié)構(gòu)化日志事件、時(shí)間戳、當(dāng)前狀態(tài)、參數(shù)。出了問題之后把日志拉出來按時(shí)間線走一遍比在頁(yè)面上瞎點(diǎn) F12 高效太多。7.3 移動(dòng)端兼容性與真機(jī)驗(yàn)證清單移動(dòng)端是前端音視頻的“兼容性重災(zāi)區(qū)”iOS 和 Android 的差異能讓人頭大。我自己有一份“上真機(jī)必測(cè)清單”每次發(fā)版前過一遍iOS Safariplaysinline是否設(shè)置視頻能否內(nèi)聯(lián)播放而不是自動(dòng)彈全屏。iOS SafariCanvas 尺寸上限超過限制后的黑屏問題。Android 低端機(jī)H.264 解碼能力是否有硬解支持如果沒硬解CPU 直接拉滿。Android WebView自動(dòng)播放策略和getUserMedia權(quán)限提示行為與 Chrome 可能不一致。頁(yè)面在鎖屏或切后臺(tái)再回來時(shí)視頻播放狀態(tài)是否正常MediaRecorder 是否還在錄制。真機(jī)測(cè)試一個(gè)比較容易漏的點(diǎn)是音量增益。同樣是 50% 音量一部手機(jī)可能已經(jīng)很響另一部卻幾乎聽不見。這不是前端代碼的問題而是硬件輸出差異遇到這種反饋要說清楚是“設(shè)備差異”而不是盲目調(diào)高音頻增益否則反而會(huì)導(dǎo)致另一些設(shè)備破音。8. 工具鏈與工程化補(bǔ)充建議8.1 用錄制、回放、分析工具減少“盲人摸象”式開發(fā)音視頻調(diào)試最大的難點(diǎn)在于“看不見狀態(tài)”。視頻流在內(nèi)部是怎么流轉(zhuǎn)的MediaRecorder 到底輸出了什么格式Blob 是編碼問題還是網(wǎng)絡(luò)問題這些在全黑盒的瀏覽器里很難一眼看穿。所以我強(qiáng)烈建議初學(xué)者裝一套輔助工具開發(fā)效率能翻倍瀏覽器開發(fā)者工具Network 面板看媒體請(qǐng)求是否分段加載Performance 面板看長(zhǎng)任務(wù)和幀率Console 里執(zhí)行video.error查看解碼錯(cuò)誤碼。ffprobe服務(wù)端或者本機(jī)分析媒體文件的容器格式、編碼格式、碼率、幀率。前端拿到一個(gè)打不開的視頻文件時(shí)先用 ffprobe 看清家底比在瀏覽器里瞎猜靠譜得多??缍巳罩静杉诰€上環(huán)境把結(jié)構(gòu)化日志回傳尤其是video.error.code、readyState、networkState、MediaRecorder.mimeType這些關(guān)鍵狀態(tài)。這個(gè)習(xí)慣幫我解決過非常多的線上問題。有一次業(yè)務(wù)反饋“視頻上傳后服務(wù)端無(wú)法生成預(yù)覽圖”前端根本沒法復(fù)現(xiàn)。后來讓用戶把 ffprobe 輸出的信息傳回來發(fā)現(xiàn)上傳的視頻居然不是瀏覽器錄制的原始文件而是經(jīng)過了一個(gè)第三方剪輯軟件處理容器里的音軌編碼變成了瀏覽器不支持的格式。這種問題如果靠猜幾天都排查不完。8.2 從“能播”到“可維護(hù)”狀態(tài)機(jī)思維與類型設(shè)計(jì)音視頻播放器的狀態(tài)管理是個(gè)容易被忽略的工程難點(diǎn)。播放器有未加載 → 元數(shù)據(jù)加載中 → 可播放 → 播放中 → 緩沖中 → 暫停 → 播放結(jié)束 → 錯(cuò)誤這么多狀態(tài)事件還互相交叉觸發(fā)loadstart、progress、canplay、playing、waiting、ended、error用散落的isPlaying、isBuffering這種 boolean 變量管理必然出 bug。我的經(jīng)驗(yàn)是給播放器設(shè)計(jì)一個(gè)有限狀態(tài)機(jī)或者退一步用一個(gè) enum 類型加統(tǒng)一的syncState()方法所有 UI 渲染都從這個(gè) state 推導(dǎo)而不是在多個(gè)事件回調(diào)里分別改 UI。type PlayerState | IDLE | LOADING | CAN_PLAY | PLAYING | BUFFERING | PAUSED | ENDED | ERROR;這種設(shè)計(jì)的價(jià)值在遇到waiting事件頻繁觸發(fā)、playing事件和canplay事件先后順序不確定導(dǎo)致 UI 閃爍時(shí)會(huì)體現(xiàn)得很明顯。狀態(tài)都?xì)w攏到一個(gè)地方管理出問題只需要看狀態(tài)轉(zhuǎn)移日志而不是翻找 8 個(gè)事件回調(diào)里的布爾值。8.3 前端音視頻與 AI 結(jié)合的一些實(shí)踐方向“AI 前端音視頻”是這兩年比較火的方向。實(shí)際可落地的場(chǎng)景也很多語(yǔ)音轉(zhuǎn)文字、虛擬背景分割、智能剪輯、老視頻修復(fù)、實(shí)時(shí)字幕翻譯。這些能力大部分依賴服務(wù)端模型推理但前端的價(jià)值在于“實(shí)時(shí)性”和“隱私性”——把數(shù)據(jù)留在端上處理不用上傳到服務(wù)器在直播、視頻會(huì)議這類低延遲場(chǎng)景尤其有優(yōu)勢(shì)。實(shí)現(xiàn)上有一條比較成熟的技術(shù)路線用getUserMedia采集視頻幀通過 Canvas 每幀抽圖送入 TensorFlow.js 這樣的前端推理引擎做處理再把處理好的人像分割結(jié)果疊加回 Canvas最后captureStream輸出。這套流程聽著簡(jiǎn)單做起來最大的挑戰(zhàn)有兩塊一是模型大小和移動(dòng)端推理性能的平衡二是幀率穩(wěn)定性和耗電量的平衡。但作為前端工程師這個(gè)方向真的可以關(guān)注起來它把原本屬于服務(wù)端和客戶端的邊界破開了一道口子而且實(shí)際應(yīng)用場(chǎng)景越來越多。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
天天日日夜夜爽| www.日本91| 五月婷婷丁香大陆免费| 黄色av高清| 五月婷婷激情综合在线| 久久小说网| 99er日韩| 欧美日韩二区在线| 好激情在线综合网| 91pornav在线| 99re6久热只有精品6在线直播| 国产4P视频精品五区| 日本色色视频| 久婷首页| 欧美性爱五月天| 日韩成人综合网| 丁香五月激情网| 人妻激情在线| 亚洲精品久久久久久久久久吃药| 五月丁香色狠狠干大屄| 五月婷婷日本| 奇米影视777在线_在线观看午夜_h小视频在线观看_岛国大片 | 五月婷婷开心亚州在线| 玖玖九九9999在线观看视频精品| 久久艹99| 欧美激情VA永久在线播放| 91成人电影| 大香蕉99热| 丁香九月激情| 大香蕉婷婷五月天| 九月丁香婷婷网| 五月婷婷天天| 噜噜噜噜噜日本视频| 人人色人人弄人人操| 巴基斯坦粉嫩无码视频| www.五月婷婷久久.com| 久热91精品| 丁香六月婷婷综合网| 嫩草AV久久伊人妇女超级A| 色噜噜狠狠色综合成人网| 日本久久婷婷| 苗黎美女四级成人版一级二级毛片| 操操国产| a久久| 五月熟妇婷婷久久| 在线网黄| 成人av免费观看| 91jiuseshunv| 五月婷婷爽爽爽| 亚洲人妻av| va婷婷在线| 婷婷五月天六点丁香五月| 思思久久99热只有频精品66| 九九热av| 色香久久| 直接看的av| 99青青草| 五月丁香色婷| 久久99热这里| 日本久久网| 国产国产乱老熟女视频网站97| 五月丁香性| 久久99热只有精品| 婷婷五月丁香基| 欧美在线骚货| 亚洲精品国产成人AV在线| BBWCUCKOLD精品熟妇| 丁香五月电影| 色婷婷丁香AV综合| 4399伦理午夜| 日本黄色精品| 操日本99| 伊人综合网站| 婷婷丁香先锋资源网站| 日韩天堂久久| 成人av中文字幕| 人妻精品在线| www激情网| 五月天婷婷乱| 婷婷五月天综合网| 国产av天堂| 图片区 小说区 区 亚洲五月| 夫妇交换刺激做爰| 国产肏屄大片| site:minyis.com| 大狠狠在线| 丁香五月性| 五月伊人综合| xxx综合在线| 色丁香婷婷美女视频网站| 色狠狠色噜噜噜a天堂一区| 99视频在线观看网址| 人人操人av| 婷婷色狠狠| 色婷五月| 五月天成人免费视频| 五月婷婷第四色| 久久婷网| 六月激情综合| 久久精品一区二区三区四区| 97碰碰久久| 久一网站| 玖玖在线资源视频| 丁香五月六月激情| 日日操天天操| 99国产在线| 99热99在线| 婷婷色情网| 日韩成人免费电影| 九九爱激情| 综合久久十三| 99超碰人人| 国产中文亚洲欧美日韩性交| 天天操综合网| 色99欧洲色19| 操逼在线视频| 99性爱视频| 国产亚洲精品久久久久苍井松| 艹色18p| 激情四射五月天| 五月婷婷插一插| 婷婷五月综激情| 天天操天天操天天操| 久久婷婷婷| 久久婷婷五月天| 嫩模草| 91亚洲视频| 丁香五月天激情| 五月天激情网图片 - 百度| 26uuu另类亚洲欧美日本一| 色综合激情| 99热9| 国产做爰视频免费播放| 色五月激情问网站| 99热这里只有精品9| 九九热在线99| 天天摸天天舔| 欧美图片丁香五月天| 第五婷婷伊人丁香色| 黄页大全十八禁| 成人av免费观看| 五月婷婷亚洲| 97丁香五月| 亚州欧美黄色电影| 五月婷婷基地| 欧美成人AAA片一区国产精品| 开心五月综合激情网| 欧美丁香婷婷五月天| 中文字幕丰满孑伦无码专区| 色视五月天婷婷| 色停停五月天| 95精品区一区二| 99re这里只有精品国产99| 婷婷丁香在线| 综合在线网| 九九九九这里只有精品| 久久婷婷亚洲无码一起| 色五月琪琪| 五月丁香婷草| 五月婷婷天天| 婷久久| 91色涩| caop在线| 亚洲亚洲人成综合网络| 99综合免费视频| 色九九中文字幕| 色婷婷a三区麻| 欧美午夜乱妇午夜福利| 色五月激情问网站| 精品人妻午夜一区二区三区四区 | 天天精品视频免费观看| 五月天伊人av| 99爱在线| 狠狠爱五月婷婷| 久久伊人9| 五月激情小说| 人人操Av| 久久日韩婷婷五月| 丁香五月在线| 五月天激情小说婷婷基地| 婷婷99狠狠躁天天躁| 午夜激情久久| 九九99在线免费在线观看视频| 五月婷婷六月天| 五月天激情综合网| 婷婷香五月天| 婷婷激情五月吧| 99热最新| 黃色三级三级三级三级 qixing300.shrkbk.com www.jinbozs.com tianmiaosw.com | 婷婷99狠狠| 国产ava| 九九综合色| 婷婷五月欧美综合| 一本久道综合99| www夜夜| 色婷婷a三区麻| 狠狠色丁香婷婷五月| 婷婷91| 99热丁香| 亚洲网在线观看| 97精品自拍视频| 综合五月天亚洲婷婷| 香港九九六区八区99| 婷婷六月天激情| 色婷丁香| 深爱五月婷婷| 丁香五月天狠狠| 97福利视频| 欧美大片免费播放器| 9久热这里只有精品| 九九色院| 国产91在线视频| 日日夜夜小色哥| 久99久精品| 欧美性猛交99久久久久99按摩| 中文AV网站| 五月婷婷亚洲综合在线| 婷婷五月色| 五月婷婷在线视频观看| 亚州AV超碰人人操| 夜夜操少妇| 五月丁香大相交| 欧美成人AAA片一区国产精品| 婷婷五月天狠狠色| 成人性爱无码| 99福利视频| 日本一级特黄大片AAAAA级| 亚洲久热| 丁香五月在线| 九九热在线99| 色吧网综合| 婷婷丁香五月天激情| 五月丁香六月婷婷综合网缴情| 91日本在线观看| 日韩aⅴ视频| 色色热| 丁香婷婷色九月| 亚州精品久久久久AV无码| 久久九区| 色99视频| 99精品久久| 91天堂网综合| 超碰国产AV| 色综合99无码 | 丁香五月综合色婷婷| 热九九九九| 99久久九九视频| 精品久久艹| 丁香五月婷婷AV在线| 日日射天天射| A A色色| 五月激激网w'w'w| 婷婷激情六月中文| 99热在线播放精品| 伊人综合网站| 国产无遮挡又黄又爽免费网站| 色色五月天婷婷| 91婷色| 色色99| 人人爽欧美婷婷久久久五月丁香| 2025年最新亚洲在线欧美 | Www.婷婷五月| www.色五月天.com| 丁香色综合| 色婷五月丁香久亚洲| 五月婷婷丁香伦理网| 5月色亭亭视频| 激情婷婷五月天网址| 99re思思| 国产精品国产VA片国产| www.开心激情| 夜色综合网| 九月激情综合| 五月天婷婷色在线视频免费观看| 激情久久四色| 天天干天天玩天天夜天天射天天操天天日蜜臀少妇 | www.婷婷五月| 色五月丁香总合网| 婷婷天堂站| 日本天堂爱爱| 五月婷婷与六月丁香图片激情| 日韩另类| 久色姿源| 婷婷丁香五月亚洲| 99色在线视频| 一区二区成人电影免费播放| 1区2区视频| 婷婷五月综合啪| 97色97干| 天干天天干天天天天天| 夜夜操夜夜操| 亚洲天堂热| 久久五月天色| 婷婷伊人网| 8090在线影视少妇| 国产色视频网站2| 欧美激情综合色综合啪啪五月| 色色五月天丁香| 五月天激情国产综合婷婷婷就去爱| 无码人妻一区二区一牛影视| 伊人五月婷婷| 激情二色月| 五月婷婷在线视频| 亚洲无AV在线中文字幕| 久久久久网站| 亚洲乱码精品久久久久..| 欧美精品XXXXBBBB| 超碰a女人的天堂| 97婷婷五月丁香| 六月婷婷香蕉| 欧美丁香五月天| www.久久综合| 神马久久五月天| 99无码超碰| 五月天激情小说婷婷基地| 婷婷玖玖五月天| 99∨VTV| 综合99在线| 99cao婷婷| 91人人超碰在线| 成年AAAA色情| 亚洲午夜AV| 婷婷中文综合网| 中文字幕综合网| 1995年关宝慧版蜘蛛女| 成人AV在线电影| 婷婷伊人綜合中文| 国产一区男女| 色墦五月丁香| 六月婷婷色综合| 狠狠五月综合在线| 色狠狠色噜噜AV天堂五区| 婷婷久久99| 丁香婷婷激情综合五月激情 | 婷婷午夜综合| 六月色 亚洲| 亚洲人成网亚洲欧洲无码久久| 日本久久爱| 色色丁香| 国产亚洲色婷婷99精品| 欧美熟女99| 男人的天堂在线婷婷| 五月天激情亚洲| 日韩色五月| 婷婷综合性爱网| 殴美97色| 激情丁香五月婷婷啪啪| 色五月丁香五| www婷婷色情网| 久久停停超碰| 五月婷中文字幕| 国产26uuu| 91 影音先锋| 青青操avbb| 婷婷五月天色色| 婷婷五月丁香91| 五月婷婷啪啪啪啪| 韩日AV片| 99视频在线观看网址| 九色综合网| α久久| 99性视频| 婷婷六月天亚州| 色伦专区97中文字幕| 婷香五月网在线| 黄网免费看| 欧美特大片黄| 韩国久久少妇视屏| 97ai婷婷| 91丨九色丨熟女| 9l视频自拍9l九色9l成人| 天天干狠狠| 九九热视频在线观看| 亚洲色9| 天天综合网在线| 五月婷婷激情综合| 婷婷色中文字幕| 深爱五月婷婷开心中文字幕| 男妓跪趴把舌头伸进我的嘴巴| 婷婷激情伍月网| 色综合天天综合成人网| 五月丁香婷婷激情| 九九99九九精品视频| 色五月色五天免费视频| 99在线观看精品| 久久 无毛。| 婷婷六月啪啪| 操一区| 综合色99| 久久66成人网站| 婷婷九色| 99热这里有精品| 欧美va亚洲va在线播放| 91色九| AV性爱网| 久久综合激情婷婷激情| 男人天堂99| 天天干天天干天天干天天干天天干| 色婷婷成人丁香| 香蕉AV777XXX色综合一区| 亚洲色 视频| 东京热免费视频网站| 色九网| 婷婷激情五月天在线视频| 狠狠五月婷婷| 丁香九月婷婷综合| 婷婷激情啪啪| 99操99| 亚洲国产精品VA在线看黑人 | 99色区| 51精品国自产在线| 玖玖99免费视频| 五月婷婷开心爱| 五月婷久久综合| 二色av| 九九九九九九九热| 亚洲中文字幕av| 欧美成人精品A片免费一区99| 五月婷婷开心丁香| 99久久a线观| 色婷婷影视99| 成人做爰A片免费看视频| 色九月丁香婷婷蜜桃在线观看| 综合网啪| 天天摸天天日天天舔| 婷婷丁香熟妇综合网| 99热热热99精品婷婷| AV操逼网| 激情五月天激情五月天| 五月丁香六月婷婷综合网| 玖玖婷婷五月| 97人碰人操| 超碰在线观看99| 丁香五月激情无码视频| 色色网站在线免费观看视频| 五月天婷婷免费| 色日本颜射| 99色婷婷| 激情综合色婷婷啪啪六月天| 色色色.COM| 色婷婷五月天激情久久| 欧美在线干| 天综合日日夜综合7799| 婷婷五月丁香青青草在线| 久久久18| 婷婷天堂综合| 激情婷婷五月| 玖玖爱资源站| 六月丁香婷婷色综合| 国产jd1024基地手机看国产| 中文字幕日产A片在线看| 色99在线观看| 婷婷性爱网| 五月婷婷在线免费观看| 九九99视频| 一级A片天天操夜夜操| 五月天婷五月天综合网小说首页-五月天激激婷婷大综合,婷婷亚洲综合五月天小说 | 九九黄色网| 午夜成人综合| 九九综合色综合| 99re青青草| www.26uuu.com亚洲电影| 人妻系列久久久久久久久久久| 婷婷久热| 激情五月天激情网| 五月天激情网址| 婷婷成人综合免费视频| 人妻肉射免费观看| 婷婷五月天色综合| 99热这里只有精品2| 天天精品视频在线观看视频| 99视频网| 五月婷婷五月天在线| 99网| 久久婷婷网站| 91欧美| 内射在线CHINESE| 国产99久久久国产精品免费看| 99精品网| 97在线观视频免费观看| 免费色婷婷| 国产99久| www91久久| 99玖玖在线视频| 五月婷婷激情| WWW.五月天9999| 激情婷婷丁香色情五月天| 中出内射的人妻视频| 丁香婷婷婷五月| 丁香五月成人| 99色视频| 婷婷五月天亚洲综合网| 人伦30P| 综合久久婷婷五月丁香| 少妇久久诱惑视频| 五月花在线观看视频| 手机旧版看人妻1025| 夜夜撸夜夜骑| 狠狠色婷婷综合开心影视| 狠狠综合色网| 蜜臀av无码久久久久久久久| av操一操| 亚洲综合婷婷| 激情五月天第四色| 99热欧| 成人性爱无码| 五月丁香| 亚洲视频另类| 五月花综合网| 丁香视频| 日韩无码一区二区三区四区| 国产精品VA在线| 99热这里只有精品16| 99色爱| 六月色激情| 婷婷五月欧美综合| 久久九九@| 丰满女老板BD高清A片| 婷婷伊人綜合中文| 色宗合,宗合网| www.婷婷五月| 日本强伦片中文字幕免费看| 欧美色99| 99爱在线精品视频免费观看| 九月丁香| 99久久久久久| 亭亭五月色男人| 色色综合网站| www.色色五月天.com| 亚洲爱爱无码婷婷色五月| 五月香婷婷| 欧美69久成人做爰视频| 五月丁香六月香香蕉| 天天爽天天草| 99噜噜噜在线播放| 色噜噜狠狠色综合无码久久欧美| 日韩aaa| 风流少妇A片一区二区蜜桃| 五月天婷婷免费| 亚洲综合婷婷五月| 99热这里只有精| 久久丁香九| 五月色导航| 色婷网| 婷婷综合日本| www.成人婷婷综合| 狠狠爱深色婷婷综合| 亚洲综人色综网| 六月婷婷综合| 性爱五月婷婷| 操一区| 97精品综合久久内射| 五月丁香狠狠爱婷婷综合| 亚洲欧美婷婷五月色综合| 97碰碰人人视频| 日日夜夜噜噜爽爽| 婷婷丁香综合网| 成人色站,在线视频,看片-SS1AV| 天天操天天操天天操天天操天天操| 激情啪啪五月天| 五月成人综合| 五月 婷 久| 丁香五月天激情小说| 欧美性爱五月天| 97人人干人人操| 免费啪啪亚州视频| 99九九在线| 久久免费操| 婷婷五月综合色中文字幕| 五月丁香在线婷婷美女| 五月婷婷 婷婷五月 一区二区 久久久| 天天爽爽日日做做| 九久9精品| 99久热这里只有精品视频删减版| 丁香六月欧美| 婷婷五月天在线综合导航| 午夜大香蕉| 成人必爱视| 亚洲V国产V欧美V久久久久久| 精品一区二区三区四区五区六区介绍| 色婷婷激情| 五月丁香怕怕综合| 亚洲欧美在线观看| 丁香激情婷婷网| 九九综合九色欧美狠狠| 亚洲色五月婷婷| 国产一区18| 婷婷激情在线| 丁香五月天天哦| 色婷婷激情| 色情五月天se| 婷婷九月丁香中文| 色情五月婷| 热九九精品| 99这里只有精品| 婷婷五月天人妻| 久久久久久久久久久jjjj| 五月亭亭六月天| 欧美色色色色色色色色色色| 天天久久66xxx| 熟惀91九色在线| 天天插插天天| 99九九在线| 99精品偷自拍| 婷婷六月丁香欧美视频在线| 五月天久久婷婷| 亚洲精品久久久久久久久久吃药| 激情六月综合| 亚洲一个色| 九九色网专区| 伊人碰碰碰| 久久这里只有精品网| 五月天色欧美| 99无码视频| 亚洲激情免费视频| 成人做爰A片免费看网站找不到了| 99视频这里有精品| 色综合久久综合中文综合网| 亚洲激情丁香五月基地| 一起草无码| 国产欧美精品AAAAAA片| 色爱99| 亚洲AV无码久久精品色欲| 青青草Avb在线| 综合久久婷婷| 色五月婷婷操逼| 婷婷免费无视频| 在线观看av网站| 91 九色大美女| 激情综合在线观看| 亚洲色色香蕉| 丁香六月视频| 超碰9| 91在线视频观看午夜福利| 五月丁香婷婷基地| 26uuu欧美日本| 丁香五月亭亭六月综合激情网| 99热官网精品在线| 久热婷婷综合| 天天狠狠夜夜狠狠2023| 天天日 天天草| 99热这里只有精品2024| 玖玖资源站国产| 日本操片| www网站在线观看| 久久免费精彩视频| 欧美激情综合| 99re在线视频| 丁香六月在线| 五月丁香六月婷婷综合伊人| 五月丁香激情片| 成人网在线视频| 婷婷天堂伊人| 国产精品久久久久久久久久免费 | 五月天激情综合| 综合99久久天天综合| 婷婷精品综合| 色五月婷婷五月丁香五月| 五月丁香色色综合| 99色色热| 九九色色| 国产亚洲99久久精品| 欧美色宗和激情| 香焦网五月天| 91艹人| 丁香婷婷五月人体| 99久久高清视频| 色情成人五月天| 日韩野外 无套| 播丁香五月婷婷欧美| 色伦专区97中文字幕| 久久xx| 操操啪| 激情第四色| 99综合网| 草草色情综合网| 欧美槡BBBB槡BBB少妇| 欧美成人精品A片免费一区99| 人人摸人人摸| 久久思思热| 少妇人妻丰满做爰XXX| 欧美成人精品A片免费一区99 | 亚洲欧州色情在线观看| 99在线精品视频免费观看20| 激情五月天小说| 五月婷婷69| 婷婷激情综合| 中文字幕在线日亚州9| 久久女人天堂| 久久9视频| A片试看120分钟做受视频红杏| 噼里啪啦完整版中文在线观看| 欧美精品在线观看| 婷婷五月丁香人妻无码高清| 丁香玖玖视频大全| 婷婷综合网站| 色五月激情网| 中文字幕网伦射乱中文| 玖玖@三月天天丁香婷婷| 野外99热| 丁香五月婷婷啪啪| 色婷婷色五月色丁香| SESE无码AV| 丁香激情五月| www.狠狠| 丁香五月天亚洲综合| 九热免费视频| 亚洲色五月天在线| 色五月婷婷色五月婷婷色五月婷婷| 99精品无码| 丁香成人五月天| 黄网在线免费观| 婷婷丁香综合| 九月丁香婷婷综合激情| 青草热视频这里只有精品| 婷婷va| 美日韩成人| 欧美69久成人做爰视频| 久xxxx| 最新热中文字幕| 天天色激情| 337p大胆噜噜噜噜噜91Av| 国产亚洲精品AAAAAAA片| 日韩啪图| www.99热视频在线观看| 爱草人视频| 中文字幕成人| 91oumei| 五月婷伊人| 欧美狠狠色| 婷婷色婷婷| 六月丁香天堂| 丁香五月激情月| 丁香五月综合激情啪啪| 色婷婷五月综合激情中文字幕| 久久激情五月婷婷| 播五月丁香六月| 安息电影在线观看完整版| 午夜丁香| 国产毛片精品一区二区色欲黄A片 极品人妻VIDEOSSS人妻 | 操逼亚洲天堂| 五六月婷婷| 能直接看的av网站| 91打屁股免费看| 精品成人久久久久久久_一二三四视| www,五月丁,com| 五月色色色| 五月天激情黄色网址| 99精品视频在线观看| 欧美日韩国产一二区| 色五月xxx| 这里只有精品视频在线| 久久综合婷婷激情| 色很很96| 五月婷婷五月天| 另类图片五月激情| 婷婷五月丁香基| 五月丁香天堂网| 色婷婷综合综合网| 这里只有精品1| 综合狠久久| 五月色情婷婷开心五月色情| 色五月丁香五月| 五月婷六月| 久热免费| 综合久久伊人| 久久综合激情婷婷激情| 丁香六月成人| AⅤ色区| 九九精品热| 狠狠色婷婷7777久| 大香蕉伊人99| 超碰三级片| 色色国产| www.com色播五月天| 黄色笑话深爱激情网丁香五月婷婷啪啪啪啪啪| 2018国产大陆天天弄| 伍月婷丁香婷| 人妻少妇色综合| 丁香五月激情六月欧亚激情综合导航| 免费播放片大片| 99视频91| 五月天婷婷激情| 啪色综合| 91精品在线看| www.久久| 97人人射| 天天草天天日| 色在线免费观看| 色五月丁香六月欧美综合| 丁香五月婷婷av影院| 伊人深爱综合| 亚洲成人无码免费| 色色射| 超碰资源在线| 开心五月激情网| 爱性综合网| 久热免费视频| 久久成人精品视频| 日本丰满久久| www.色五月| 久热91精品| 99免费在线| 99er免费在线观看| 桃色五月婷婷| 亚洲天堂aaaa| A片一曲| 激情五月色婷婷| 99 频99热国里只有精品| 国产美女无遮挡裸体毛片A片| 思思re视频在线| 99视频啪啪| 欧美丁香五月97色| 五月婷婷六月激情在线| 99久久婷婷国产综合亚洲| 五月丁香亭亭| 影音先锋女人av鲁色资源网小说免费| 五月综合激情久久| 99热资源在线| 婷婷五月天777| 九九久久腿| 综合另类视频| 五月丁香999| 丁香97综合| 超碰在线成人| 另类小说婷婷色| WWW99视频| 91丨九色丨东北熟女| 五月精品免费XXX| 五月天激情网址| 五月天伊人| 综合色色色色色色| 久色网| 日韩专区五月天婷婷丁香| 超碰爱爱爱| 精品婷婷五月视| 秋霞少妇毛片| 五月婷婷综合网| 丁香六月婷婷色XXXXX| 超碰成人免费| 黄色av网站在线免费播放| 色五月超碰| 久久五月天黄色五月天色网址| 操婷婷久久| 色爱综合网| 综合色播| 久久视频九九视频| 九九Av| 99视频在线观看视频| 国产超碰在线| 五夜丁香| 狠狠色噜噜狠狠| 俺也去在线久久精品23欧美综合视频网站,丰满人妻一区二区三区在线视频53,丰满 | 五月婷啪| av不卡网站| 亚洲热视频| 五月天婷婷在线播放| 亚洲视频丁香网va| 91爱操| 青青草婷婷久久| 精品一二三区久久AAA片| 九九99九九99偷拍视频免费看| 丁香五月六月激情| aaaaaa片| 激情综合5| 五月丁香六月婷婷久久肏| 9热在线| 嫩BBB槡BBBB搡BBBB| 97久久人人| 亚洲丁香婷婷丁香五月天激情| 五月婷婷久久爱| 香蕉久久国产AV一区二区| 亚洲色综合色网| 99超碰欧美| 疯狂做受XXXX高潮A片动画| 婷婷午夜精品久久久| AV操操操| 婷婷久久综合久色| 亚洲人人操BD| 丁香婷婷五月六月天| 婷香五月网在线| 欧美色图45678| 丁香花色色网| 99自拍网| 久久久18| 九月激情网| 久久婷婷五月综合伊人| 五月婷婷激情久久| 久久性刺激| 欧美日韩成人一区二区| 大香蕉久久草| 色婷婷9| 五月天天堂久久| 五月丁香久久呀| 97视频.干com| 在线播放成人网站| 天天久久66xxx| 丁香激惜男女| 五月在在观看| 伊人色欲五月天| 国产精品日韩十五区| 婷婷噜噜| 99热网址| 婷婷五月激情五月激情| 五月丁香综合激情| 99在线精品免费视频| 欧美成人AAA片一区国产精品| 伊人婷婷福利网| 激情色情五月天| 五月丁香人妻| 91干视频| 成人色站,在线视频,看片-SS1AV| 亚洲综合丁香五月| SESE无码AV| 久久免费精彩视频| 国产激情综合| 色色99| 欧美综合五月天婷婷tin| 亚洲中文AV| 国产九九一区二区三区| 久操婷婷| 婷婷五月婷婷五月天| 婷婷五月在线播放| 成人av在线网站| 丁香六月激情| H亚洲| 在线视频99| 色婷婷综合网| 激情综合网亚洲色图| 岛国AV网| 久99| 亚洲中文字幕AV在线| 99热日本精品| 亚洲五月天,激情视频| 婷婷伊人激情婷婷| 岛国AV网| 久久香蕉网| 99国产精品白浆在线观看免费| 丁香五月综合激情久久潮喷| 99色综合网| 婷婷五月丁香成人| 婷婷成人五月天| 精品久热| 天天综合91入口| 综合久久婷婷五月丁香| 丁香五月综合在线视频| 亚洲AV成人在线| 九九视频在线观看视频6| 青青草原爱爱网| www.婷婷五月天,com| 五月丁小婷婷激情四射| 成人五月天丁香婷| 久久机热这里只有| 淫视馆AV在线| 国产,欧美,学生妹,视频| 国产91九色| www.狠狠狠.com| 九九九九综合| ztEJj| 激情 五月 婷婷 丁香| 丁香婷婷色五月| 五月天综合在线| 亚洲操B视频| 亚洲精| www.婷婷| 99热一本久道| 婷婷五月激情片| www.久久久久| 久草丁香婷婷五月天婷| 国产六月婷婷| 精品五月天| 婷婷自拍| 一级A片天天操夜夜操| 国产无套精品一区二区| 国内久久亭亭| 色婷婷丁香中文在线播放| 99在线小视频| 99re热在线视频观看| 五月婷婷花| 伊人综合网站| 婷婷久久综合久| 五月丁香婷婷导航视频| 久久9情免费| 六月婷婷色五月| 色播五月| www99久久| 日韩AV大全| 91919191919久久成人视频| 午夜婷婷丁香| av网址在线| 九九综合网色全集 | www.色色五月天.com| 成人视频免费观看高清完整版在线观看| 久久人妻久久久久| 色婷婷电影| 久99久热| 五月婷婷丁香大陆免费| 三级99热| 婷婷五月天色播| 色五月激情综合网站| 99人人操人人摸| 激情内射人妻1区2区3区| 激情五月丁香综合蜜桃| 97五月天| 色爱综合视频| 伊人久久婷婷| 妻久久久久| 三男玩一女三A片| 丁香 婷婷五月| 色五月综合| 久久人妻爱爱| 欧洲电影在线观看免费版英语版| 日韩一区二区三区无码| 亚洲精品一区中文字幕乱码| 婷婷的五月天另类视频| 成人国产欧美大片一区| www.狠狠色.com| 久久人妻超碰一区| 日本成人噜噜| 色播激情婷婷| 丁香五月婷婷香| 激情无码网| 99ri精品视频在线观看| 丁香六月婷婷| 天天干天天做| 丁香五月综合在线播放| 日本偷拍九九九| 综合XX网| 99自拍视频在线| 激情五月婷| 狠狠操狠狠狠| 五月丁香日逼| 九九热自拍| 五月丁香六月激情综合网 | 久久综合中文字幕| 九九热这里只有精品23| 激情综合五月| 五月丁香婷中文| 婷婷WWW久久| 丁香婷婷色| 婷婷五六月丁香| 婷色天堂| 停停五月色宗合| 久久人人做人人妻人人玩精品va| 色区域网站视频| 久久香蕉婷婷| 婷婷金品综合视频| 亚洲 在线 性爱 | 欧美槡BBBB槡BBB少妇| 99r这里| 日本久久超碰| 久久精彩免费视频| 婷婷丁香人妻久久在线观看| 色色色色色综合| 色情五月综合婷婷| 九九精品在线网| 中文字幕九九九九| 无码少妇高潮喷水A片免费| 五月天婷婷激情小说电影| 丁香六月久久| 婷婷综合丁香| 五月丁香福利| 色噜综| 欧美久久婷婷| 婷婷中文字幕欧美| 丁香狠狠色婷婷| 国产探花AV在线| 日韩av在线免费观看| 欧美成人一区二区三区在线视频| 欧美色婷婷| 色婷婷成人在线| 99色在线观看视频| 久久99国产综合精品免费| 五月婷婷六月丁香在线视频免费在线观看| 97九色| 亚洲视频另类| 99色综合| 久久婷婷啪啪视频| 色五月丁香伊人| 久久婷婷青草五月天| 99热在线网站| 天天干天天爽| 97久久草草超级碰碰碰| 五月天成人在线播放丁香| 9l视频自拍9l九色成人| 色播激情婷婷| CHINESE熟女老女人HD视频 | 涩五月婷婷| 天天搡日日搡aaaaⅩ| 五月天久久综合婷婷丁香| 五月丁香六月婷婷综合在线| www.综合久久| 亚州男人天堂婷婷五月| 美日韩成人| 91成人视频| 亚洲热热视频| 五月丁香六月情婷婷久久| 91狠狠色丁香婷婷综合久久精品| 欧美久人人| 2025神马午夜福利| 婷婷丁香久久| 狼人久草| 97干综合网| 免费观看的婷婷五月视频在线| 狠狠草婷婷| www.色婷婷| 色碰干| 狠狠综合区| 日本丰满久久| 国产亚洲精品久久久久久久久动漫| 这里只有精品免费| 9久视频| 成人av在线网址| 婷婷五月天综合在线| 六月丁香婷婷六月激情综合| 五月色 亚洲| 综合五月丁香久久| 久久伊人婷婷| 综合视频久久| 亚洲色图五月丁香| 五月天婷婷情色| 亚洲AV无码成人精品区电影网| 国产精女同一区二区三区久| WWW·色色色·COM| 五月丁香基地| 人妻肉射免费观看| xx色综合| 婷婷五月丁香基| 日日想日日夜日日操| 亚洲五月天天| 婷婷 激情 五月| 五月熟妇婷婷久久| 五月丁香花伦理电影| 五月综合777| 五月天四色房丁香| 99色播| 思思热再线视频| 亚洲精品五月| 婷婷五月视频| 丁香五月亚综合图片| 五月婷婷六月丁香激情| 停停五月丁香| 五月天激情国产综合婷婷婷| 综合五月丁香六月婷婷| 精品99在线| 天天色色天天| 九九热视频在线观看| 欧美顶级少妇做爰HD| www.seqingwuyuetian| 色情激情五月婷婷| 97热久久| 婷婷91| 五月婷婷久久开心网| 日日做夜夜爱| 99色网站| 在线播放成人网站| 可以看的av| 五月四色激情| 无码色综合| 99re久久| 五月天婷婷丁香蜜桃91| 五月天,激情四射,婷婷频道| 亚洲综合色网| 丁香婷婷社区| 色婷婷呢狠禁久禁| 日韩性爱无码| 久99久在线| 99热这里只有精品98| 五月天激情无码高清| 99爱在线视频| 色色a| 日本婷婷色| www.色综合.com| 天天色爽| 婷婷五月激情在线视频| 日韩狠狠色| 五月开心播播网| 97婷婷在线视频| 精品久久婷婷五月天| 5月婷婷五月天| www.91色| 91午夜婷婷狠狠久久综合9色| 五月丁香婷婷啪啪网| 丁香五月激情六月欧亚激情综合导航| 天天综合图片| 五月婷婷激情网| 99热精品在线观看| 丁香五月很很肏| 丁香五月天激情网址| 丁香婷婷色五月天| 91丨九色丨43老版熟女| 婷婷五月天国产传媒| 伊人色综合影院视频| 丁香六月天色婷婷| 欧美影院婷婷| ai97re99一本| 97天堂| 狠狠草狠狠草| 欧美成人精品A片免费一区99| 国产综合丁香五月天| 激情五月激情综合网一级丸片 | 国产XXXX搡XXXXX搡麻豆| 99精品高潮| 亚洲激情视频网| 国产精品久久..4399| 99久久97| 99免费热在线精品| 天天插天天爱| 97色婷婷| 永久无码色| 狠狠干五月天| 五月天激情美女久久| 丁香五月婷婷狠狠色| 五月天啪啪啪| 综合色在线| 第四色色六月色综合| www999日韩精品| 色五月色情| 另类激情五月| 久久五月天婷婷| 91丨九色丨丰满人妖| www.99热. com这里只有精品| 久久久激情| 九九九热精品| 色色日本欧美| 韩日AV片| 天天添天天摸天天天天做| 99爱在线视频| VA色婷婷| 丁香五月区| 伊人五月天久久| 淫荡工a| 性按摩玩人妻HD中文字幕| 精品99这里有| 婷婷色在线观看| 五月天激情四射网站| 色五月婷婷很很操| 人人操9| 操嫩逼电影| 人妻丰满精品一区二区A片| 天天色天天爽| 玖玖资源在线视频| 99热日韩| 91干| 色综合色五月| 亚洲午夜视频| 日韩一级A片黄色| 午夜九九九九九九九九九九九九九| 久久婷婷综合色丁香| 色婷婷小说| 欧美碰碰碰| 婷婷丁香五月高清| 国产人人操| 色情五月停停丁香| 色9999综合久久| 久久66成人网站| 日韩精品在线观看9| 色性五月天| 狠狠爱婷婷五月天| 九热视频| 91丨人妻丨国产丨丝袜| 五月丁香婷婷成人网| 激情婷婷综合网| 久草热在线视频| 五月丁香激情四射| 亚洲成人在线播放|