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

ARTICLE DETAIL

資訊詳情

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

前端Canvas截取視頻首幀封面:跨域、黑屏與移動(dòng)端兼容實(shí)戰(zhàn)

前端Canvas截取視頻首幀封面:跨域、黑屏與移動(dòng)端兼容實(shí)戰(zhàn) 1. 視頻封面首幀截取的整體設(shè)計(jì)思路視頻列表里那一排灰撲撲的默認(rèn)播放器圖標(biāo)大概是每個(gè)做過(guò)內(nèi)容平臺(tái)的人都繞不過(guò)去的坎。用戶上傳完視頻后臺(tái)轉(zhuǎn)碼還沒(méi)跑完前端總得先給個(gè)像樣的封面占位不然整個(gè)列表看起來(lái)就像半成品。用 canvas 截取視頻首幀作為封面就是解決這個(gè)問(wèn)題的經(jīng)典方案——不需要后端參與不需要額外上傳圖片瀏覽器里幾行代碼就能把視頻第一幀畫面摳出來(lái)變成一張圖。這個(gè)方案的核心邏輯其實(shí)很樸素視頻文件在瀏覽器里加載后通過(guò) video 元素解碼出畫面再把當(dāng)前幀繪制到 canvas 上最后用 toDataURL 或 toBlob 導(dǎo)出成圖片。聽(tīng)起來(lái)簡(jiǎn)單但真正落地時(shí)會(huì)遇到一堆細(xì)節(jié)問(wèn)題——跨域、黑幀、異步時(shí)序、移動(dòng)端兼容性每一個(gè)都能讓你多調(diào)半天。先說(shuō)清楚這個(gè)方案適合誰(shuí)。如果你是前端開(kāi)發(fā)正在做視頻上傳、內(nèi)容管理、短視頻列表這類功能需要在前端快速生成封面預(yù)覽那這套方案直接能用。如果你是完全沒(méi)接觸過(guò) canvas 的新手也不用慌核心代碼不超過(guò)三十行我會(huì)把每一步為什么這么寫都講透。如果你已經(jīng)在用類似方案但總遇到黑屏或者跨域報(bào)錯(cuò)那正好后面排查部分就是給你準(zhǔn)備的。為什么選 canvas 而不是其他方案有人可能會(huì)想能不能用 CSS 直接把 video 元素當(dāng)封面顯示可以但 video 元素始終是視頻它會(huì)加載、會(huì)緩沖、會(huì)占內(nèi)存一個(gè)列表里放幾十個(gè) video 元素頁(yè)面性能直接崩掉。而 canvas 截出來(lái)的是一張靜態(tài)圖片體積小、渲染快、可以緩存、可以上傳到 CDN這才是封面該有的樣子。另一個(gè)思路是后端用 ffmpeg 截幀這當(dāng)然更穩(wěn)定但需要服務(wù)端資源而且用戶上傳后要等后端處理完才能看到封面體驗(yàn)上有延遲。前端 canvas 方案的優(yōu)勢(shì)就是即時(shí)性——視頻選完封面立刻出來(lái)用戶馬上能看到效果。還有一個(gè)容易被忽略的點(diǎn)首幀截取和任意幀截取是兩回事。首幀截取的目標(biāo)是視頻的第一幀畫面但瀏覽器的 video 元素在 loadedmetadata 階段其實(shí)還沒(méi)有真正解碼出畫面你必須等到 loadeddata 或者 seek 到某個(gè)時(shí)間點(diǎn)之后才能拿到有效幀。很多人第一次寫的時(shí)候在 loadedmetadata 里就去 drawImage結(jié)果截出來(lái)一片黑就是因?yàn)檫@個(gè)時(shí)序問(wèn)題。理解這一點(diǎn)后面很多坑就都能預(yù)判了。2. 核心細(xì)節(jié)解析與實(shí)操要點(diǎn)2.1 video 元素的關(guān)鍵屬性與事件時(shí)序要讓 canvas 截取到正確的首幀你得先搞清楚 video 元素從加載到可繪制經(jīng)歷了哪些階段。這個(gè)過(guò)程不是一步到位的而是分了好幾個(gè)事件節(jié)點(diǎn)每個(gè)節(jié)點(diǎn)能做的事情不一樣。當(dāng)你給 video 元素的 src 賦值后瀏覽器開(kāi)始加載視頻文件。首先觸發(fā)的是 loadedmetadata這時(shí)候?yàn)g覽器已經(jīng)解析了視頻的元信息——時(shí)長(zhǎng)、寬高、編碼格式都知道但畫面數(shù)據(jù)還沒(méi)解碼出來(lái)。如果你在這個(gè)階段調(diào)用 drawImagecanvas 上畫出來(lái)的就是空白或者黑色。接下來(lái)是 loadeddata這時(shí)候當(dāng)前幀的數(shù)據(jù)已經(jīng)可用了理論上可以繪制。但實(shí)際測(cè)試下來(lái)loadeddata 觸發(fā)時(shí)當(dāng)前幀往往是第一幀但有些瀏覽器或者某些編碼格式下這個(gè)時(shí)機(jī)仍然可能拿到黑幀。更穩(wěn)妥的做法是監(jiān)聽(tīng) seeked 事件。具體操作是在 loadedmetadata 之后把 video.currentTime 設(shè)置為一個(gè)極小值比如 0.001 秒然后等 seeked 事件觸發(fā)這時(shí)候畫面一定已經(jīng)解碼完成drawImage 就能拿到有效畫面。為什么是 0.001 而不是 0因?yàn)槟承g覽器在 currentTime 為 0 時(shí)不會(huì)觸發(fā) seek 操作設(shè)一個(gè)極小值可以強(qiáng)制觸發(fā) seeked 事件確保畫面已經(jīng)渲染。還有一個(gè)關(guān)鍵屬性是 crossOrigin。如果你的視頻文件和頁(yè)面不同源比如視頻存在 CDN 上那必須給 video 元素設(shè)置 crossOriginanonymous否則 canvas 會(huì)被標(biāo)記為 tainted后續(xù)調(diào)用 toDataURL 或 toBlob 會(huì)直接拋安全錯(cuò)誤。這個(gè)屬性必須在設(shè)置 src 之前就設(shè)好順序反了不生效。另外 preload 屬性建議設(shè)為 auto確保瀏覽器主動(dòng)加載視頻數(shù)據(jù)。如果設(shè)成 none瀏覽器可能不會(huì)主動(dòng)加載事件也不會(huì)觸發(fā)。muted 屬性也建議加上雖然截幀不需要播放但某些瀏覽器對(duì)未靜音的視頻有自動(dòng)播放限制加上 muted 可以避免一些意外情況。2.2 canvas 尺寸計(jì)算與繪制參數(shù)選擇canvas 的尺寸設(shè)置看起來(lái)簡(jiǎn)單但直接決定截出來(lái)的封面質(zhì)量。最直覺(jué)的做法是把 canvas 的 width 和 height 設(shè)成 video 的 videoWidth 和 videoHeight這樣截出來(lái)就是原始分辨率。但實(shí)際業(yè)務(wù)中往往不需要那么大的圖一個(gè)列表封面 400px 寬就夠了截個(gè) 1920px 的圖既浪費(fèi)帶寬又浪費(fèi)內(nèi)存。我的做法是設(shè)一個(gè)目標(biāo)寬度比如 480px然后按視頻的寬高比算出高度。具體計(jì)算是先拿到 video.videoWidth 和 video.videoHeight算出寬高比 ratio videoHeight / videoWidth然后 canvas.width 480canvas.height Math.round(480 * ratio)。這樣截出來(lái)的圖寬度固定高度按比例自適應(yīng)不會(huì)變形。繪制的時(shí)候用 ctx.drawImage(video, 0, 0, canvas.width, canvas.height)。這里第四個(gè)和第五個(gè)參數(shù)是目標(biāo)繪制尺寸不是源尺寸。drawImage 會(huì)自動(dòng)把視頻畫面縮放到你指定的尺寸。注意不要寫成 drawImage(video, 0, 0, video.videoWidth, video.videoHeight)那樣畫出來(lái)的圖尺寸是原始分辨率和你設(shè)的 canvas 尺寸不匹配會(huì)被裁剪。導(dǎo)出格式方面toDataURL(image/jpeg, 0.8) 是最常用的組合。JPEG 格式體積小0.8 的質(zhì)量系數(shù)在肉眼觀感和文件大小之間平衡得比較好。如果封面需要透明背景那就用 PNG但體積會(huì)大很多。toBlob 比 toDataURL 更適合后續(xù)上傳因?yàn)樗苯咏o你一個(gè) Blob 對(duì)象不用再做 base64 轉(zhuǎn)二進(jìn)制。不過(guò) toBlob 是異步回調(diào)寫法上要注意。提示canvas 的 width 和 height 屬性是繪圖緩沖區(qū)尺寸CSS 的 width 和 height 是顯示尺寸兩者不要混淆。截幀時(shí)只需要設(shè)屬性尺寸不需要設(shè) CSS 尺寸。2.3 跨域問(wèn)題的根源與解決路徑跨域是 canvas 截視頻幀最容易翻車的地方。根本原因在于瀏覽器的同源策略當(dāng) video 元素的源和頁(yè)面不同源時(shí)視頻數(shù)據(jù)被視為跨域資源繪制到 canvas 后canvas 會(huì)被標(biāo)記為 tainted被污染此時(shí)任何試圖讀取 canvas 像素?cái)?shù)據(jù)的操作——包括 toDataURL、toBlob、getImageData——都會(huì)拋出 SecurityError。解決路徑有兩條。第一條是讓視頻源支持 CORS。具體來(lái)說(shuō)視頻服務(wù)器需要在響應(yīng)頭里加上 Access-Control-Allow-Origin同時(shí)前端給 video 元素設(shè)置 crossOriginanonymous。這兩者缺一不可。如果服務(wù)器沒(méi)配 CORS 頭前端設(shè)了 crossOrigin 反而會(huì)導(dǎo)致視頻加載失敗。所以這條路徑需要后端配合不是前端單方面能搞定的。第二條路徑是走同源代理。如果視頻源不受你控制沒(méi)法加 CORS 頭那可以在自己的服務(wù)器上做一個(gè)代理接口把視頻流轉(zhuǎn)發(fā)一遍讓前端從同源地址加載視頻。這樣就不存在跨域問(wèn)題canvas 也不會(huì)被污染。代價(jià)是服務(wù)器要承擔(dān)流量適合視頻量不大的場(chǎng)景。實(shí)際項(xiàng)目中我一般優(yōu)先走第一條路徑因?yàn)楝F(xiàn)在主流對(duì)象存儲(chǔ)和 CDN 都支持配置 CORS 規(guī)則加一個(gè)響應(yīng)頭的事。如果實(shí)在搞不定再考慮代理方案。需要注意的是crossOrigin 屬性必須在設(shè)置 src 之前賦值順序反了瀏覽器不會(huì)重新發(fā)起帶 CORS 的請(qǐng)求。3. 完整實(shí)操流程與核心代碼實(shí)現(xiàn)3.1 從零搭建截幀工具函數(shù)下面這套代碼是我在實(shí)際項(xiàng)目中反復(fù)打磨過(guò)的版本處理了時(shí)序、跨域、尺寸、異常等各個(gè)細(xì)節(jié)。你可以直接復(fù)制到項(xiàng)目里用也可以按自己的需求調(diào)整參數(shù)。function captureVideoFirstFrame(videoUrl, options {}) { const { targetWidth 480, quality 0.8, format image/jpeg, timeout 10000 } options; return new Promise((resolve, reject) { const video document.createElement(video); video.crossOrigin anonymous; video.preload auto; video.muted true; video.playsInline true; let settled false; const timer setTimeout(() { if (!settled) { settled true; cleanup(); reject(new Error(截幀超時(shí))); } }, timeout); function cleanup() { clearTimeout(timer); video.removeAttribute(src); video.load(); } video.addEventListener(loadedmetadata, () { // 強(qiáng)制 seek 到極小時(shí)間點(diǎn)確保畫面解碼完成 video.currentTime 0.001; }); video.addEventListener(seeked, () { if (settled) return; try { const ratio video.videoHeight / video.videoWidth; const canvas document.createElement(canvas); canvas.width targetWidth; canvas.height Math.round(targetWidth * ratio); const ctx canvas.getContext(2d); ctx.drawImage(video, 0, 0, canvas.width, canvas.height); canvas.toBlob( (blob) { if (settled) return; settled true; cleanup(); if (blob) { resolve({ blob, dataUrl: canvas.toDataURL(format, quality), width: canvas.width, height: canvas.height }); } else { reject(new Error(封面生成失敗)); } }, format, quality ); } catch (err) { settled true; cleanup(); reject(err); } }); video.addEventListener(error, () { if (settled) return; settled true; cleanup(); reject(new Error(視頻加載失敗)); }); video.src videoUrl; }); }這段代碼有幾個(gè)設(shè)計(jì)決策值得展開(kāi)說(shuō)。第一用 Promise 封裝是因?yàn)檎麄€(gè)流程是異步的而且有多個(gè)可能的失敗點(diǎn)Promise 的 reject 能統(tǒng)一處理錯(cuò)誤。第二加了超時(shí)機(jī)制因?yàn)榫W(wǎng)絡(luò)異常時(shí) video 的 error 事件不一定觸發(fā)沒(méi)有超時(shí)的話 Promise 可能永遠(yuǎn) pending。第三cleanup 函數(shù)里把 video 的 src 移除并調(diào)用 load()這是為了釋放視頻資源避免內(nèi)存泄漏。第四seek 到 0.001 而不是 0前面解釋過(guò)是為了確保 seeked 事件觸發(fā)。3.2 在真實(shí)上傳流程中集成截幀單獨(dú)一個(gè)截幀函數(shù)還不夠?qū)嶋H業(yè)務(wù)中它通常是上傳流程的一環(huán)。用戶選完視頻文件后你需要先用 URL.createObjectURL 生成本地預(yù)覽地址然后截幀再把封面和視頻一起上傳。async function handleVideoSelect(file) { // 生成本地預(yù)覽地址 const objectUrl URL.createObjectURL(file); try { // 截取首幀 const cover await captureVideoFirstFrame(objectUrl, { targetWidth: 480, quality: 0.8 }); // 展示封面預(yù)覽 previewImg.src cover.dataUrl; // 上傳視頻和封面 const formData new FormData(); formData.append(video, file); formData.append(cover, cover.blob, cover.jpg); const res await fetch(/api/upload, { method: POST, body: formData }); const result await res.json(); console.log(上傳成功, result); } catch (err) { console.error(處理失敗, err); // 降級(jí)使用默認(rèn)封面 previewImg.src /assets/default-cover.png; } finally { // 釋放 objectURL URL.revokeObjectURL(objectUrl); } }這里有個(gè)關(guān)鍵點(diǎn)URL.createObjectURL 生成的地址是同源的 blob 地址不存在跨域問(wèn)題canvas 不會(huì)被污染。所以本地文件截幀是最順暢的場(chǎng)景。如果你截的是遠(yuǎn)程視頻地址那就要面對(duì)前面說(shuō)的跨域問(wèn)題。另一個(gè)細(xì)節(jié)是 finally 里的 revokeObjectURL。objectURL 不釋放的話對(duì)應(yīng)的 Blob 數(shù)據(jù)會(huì)一直占著內(nèi)存用戶連續(xù)選幾個(gè)大視頻內(nèi)存就上去了。這個(gè)釋放操作很容易被忘記但養(yǎng)成習(xí)慣就好。3.3 參數(shù)調(diào)優(yōu)與不同場(chǎng)景的適配targetWidth 設(shè)多少合適這取決于你的使用場(chǎng)景。列表頁(yè)的小縮略圖240px 到 320px 就夠了。詳情頁(yè)的大封面640px 到 960px 比較合適。如果是視頻管理后臺(tái)可能需要 480px 左右的中等尺寸。我的經(jīng)驗(yàn)是設(shè)一個(gè)比實(shí)際顯示尺寸大 1.5 到 2 倍的寬度這樣在高分屏上也不會(huì)模糊。quality 參數(shù)只對(duì) JPEG 和 WebP 有效范圍是 0 到 1。0.8 是通用推薦值0.6 以下會(huì)有明顯壓縮痕跡0.9 以上文件體積增長(zhǎng)很快但畫質(zhì)提升有限。如果封面文字比較多可以適當(dāng)提高到 0.85。format 的選擇上JPEG 適合大多數(shù)場(chǎng)景WebP 體積更小但兼容性稍差不過(guò)現(xiàn)在主流瀏覽器都支持了PNG 只在需要透明通道時(shí)使用。實(shí)際項(xiàng)目中我一般用 JPEG兼容性和體積平衡得最好。超時(shí)時(shí)間設(shè)多少本地文件截幀通常幾百毫秒就完成了遠(yuǎn)程視頻取決于網(wǎng)絡(luò)速度。10 秒是個(gè)比較安全的默認(rèn)值如果視頻特別大或者網(wǎng)絡(luò)特別慢可以適當(dāng)延長(zhǎng)。但也不宜太長(zhǎng)否則用戶等太久體驗(yàn)不好。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 截出來(lái)是黑屏的幾種原因黑屏是最高頻的問(wèn)題沒(méi)有之一。我遇到過(guò)的情況大概分三類。第一類是時(shí)序問(wèn)題在 loadedmetadata 階段就 drawImage畫面還沒(méi)解碼自然是黑的。解決辦法就是等 seeked 事件或者至少等 loadeddata。這個(gè)前面已經(jīng)詳細(xì)講過(guò)。第二類是視頻編碼格式問(wèn)題。某些視頻的編碼格式瀏覽器不支持解碼video 元素能加載元信息但畫不出畫面。這種情況可以通過(guò) video.canPlayType 提前檢測(cè)或者監(jiān)聽(tīng) error 事件做降級(jí)處理。實(shí)測(cè)下來(lái) H.264 編碼的 MP4 兼容性最好HEVC 和 AV1 在部分瀏覽器上支持不完整。第三類是 seek 時(shí)間點(diǎn)的問(wèn)題。有些視頻的第一幀本身就是黑場(chǎng)比如淡入效果的開(kāi)頭那截出來(lái)就是黑的。這種情況可以把 currentTime 往后調(diào)一點(diǎn)比如設(shè)成 0.1 秒或者視頻時(shí)長(zhǎng)的 1%避開(kāi)黑場(chǎng)。但要注意別調(diào)太多否則就不是首幀了。排查的時(shí)候可以用一個(gè)簡(jiǎn)單的方法把 video 元素直接掛到頁(yè)面上加 controls 屬性手動(dòng)播放看看第一幀到底長(zhǎng)什么樣。如果手動(dòng)播放能看到畫面但截幀是黑的那就是時(shí)序或代碼問(wèn)題如果手動(dòng)播放也是黑的那就是視頻本身或編碼的問(wèn)題。4.2 跨域報(bào)錯(cuò)的具體表現(xiàn)與處理跨域問(wèn)題的報(bào)錯(cuò)信息很明確Uncaught DOMException: Failed to execute toDataURL on HTMLCanvasElement: Tainted canvases may not be exported. 看到這個(gè)報(bào)錯(cuò)基本就是跨域沒(méi)處理對(duì)。排查步驟是這樣的先確認(rèn) video 元素的 crossOrigin 屬性是否設(shè)置且是否在 src 之前設(shè)置。然后打開(kāi)瀏覽器開(kāi)發(fā)者工具的 Network 面板看視頻請(qǐng)求的響應(yīng)頭里有沒(méi)有 Access-Control-Allow-Origin。如果請(qǐng)求頭里沒(méi)有那就是服務(wù)端沒(méi)配 CORS需要后端加。如果請(qǐng)求頭里有但前端還是報(bào)錯(cuò)檢查 crossOrigin 的值是不是 anonymous寫成 use-credentials 的話需要服務(wù)端額外支持 credentials。還有一種隱蔽的情況視頻請(qǐng)求被重定向了重定向后的響應(yīng)沒(méi)有 CORS 頭。這種情況在 CDN 配置不當(dāng)時(shí)會(huì)出現(xiàn)需要在 Network 面板里仔細(xì)看每一條請(qǐng)求。如果服務(wù)端實(shí)在加不了 CORS 頭降級(jí)方案是用同源代理。在自己的服務(wù)器上開(kāi)一個(gè)接口把視頻流轉(zhuǎn)發(fā)一遍。前端從同源地址加載就不存在跨域問(wèn)題了。這個(gè)方案會(huì)增加服務(wù)器帶寬消耗適合視頻量不大的場(chǎng)景。4.3 移動(dòng)端兼容性注意事項(xiàng)移動(dòng)端瀏覽器對(duì) video 元素的處理比桌面端更嚴(yán)格。iOS Safari 有幾個(gè)特殊限制video 元素默認(rèn)不加載數(shù)據(jù)必須用戶交互后才開(kāi)始加載playsInline 屬性必須設(shè)置否則視頻會(huì)全屏播放某些 iOS 版本對(duì) crossOrigin 的支持也有差異。實(shí)測(cè)下來(lái)iOS 上截幀的成功率比 Android 和桌面端低一些。主要問(wèn)題是 seeked 事件有時(shí)候不觸發(fā)或者觸發(fā)時(shí)畫面還沒(méi)準(zhǔn)備好。應(yīng)對(duì)方法是在 seeked 之后加一個(gè)小的延遲比如 requestAnimationFrame 或者 setTimeout 100ms再執(zhí)行 drawImage。這個(gè)延遲雖然不優(yōu)雅但確實(shí)能提高成功率。Android 上的問(wèn)題主要是碎片化不同廠商的瀏覽器對(duì)視頻編碼的支持不一樣。建議在截幀失敗時(shí)做好降級(jí)顯示一個(gè)默認(rèn)封面不要讓用戶看到空白。還有一個(gè)移動(dòng)端特有的問(wèn)題內(nèi)存限制。移動(dòng)端瀏覽器對(duì) canvas 的尺寸有限制太大的 canvas 會(huì)創(chuàng)建失敗。所以 targetWidth 不要設(shè)太大480px 在移動(dòng)端已經(jīng)足夠了。如果確實(shí)需要大圖可以分塊繪制或者用 OffscreenCanvas。4.4 常見(jiàn)問(wèn)題速查表問(wèn)題現(xiàn)象可能原因排查方法解決方案截出來(lái)全黑時(shí)序不對(duì)畫面未解碼檢查 drawImage 調(diào)用時(shí)機(jī)等 seeked 事件后再繪制截出來(lái)全黑視頻首幀本身是黑場(chǎng)手動(dòng)播放查看第一幀currentTime 往后調(diào)一點(diǎn)截出來(lái)全黑編碼格式不支持檢查 video.canPlayType轉(zhuǎn)碼或降級(jí)處理toDataURL 報(bào)錯(cuò)canvas 被跨域污染檢查 Network 面板 CORS 頭配置 CORS 或走同源代理視頻加載失敗crossOrigin 設(shè)置順序錯(cuò)誤檢查屬性賦值順序crossOrigin 必須在 src 之前截幀超時(shí)網(wǎng)絡(luò)慢或視頻大檢查 Network 加載時(shí)間延長(zhǎng)超時(shí)或降級(jí)移動(dòng)端截幀失敗iOS 限制或內(nèi)存不足真機(jī)調(diào)試查看報(bào)錯(cuò)加延遲或減小 canvas 尺寸封面模糊targetWidth 太小對(duì)比顯示尺寸提高到顯示尺寸的 1.5 到 2 倍4.5 幾個(gè)我踩過(guò)的坑和對(duì)應(yīng)技巧第一個(gè)坑是忘記釋放 objectURL。早期做上傳功能時(shí)沒(méi)注意用戶連續(xù)選了十幾個(gè)視頻后頁(yè)面直接卡死排查半天才發(fā)現(xiàn)是 objectURL 沒(méi)釋放導(dǎo)致內(nèi)存暴漲。后來(lái)養(yǎng)成習(xí)慣只要用了 createObjectURL就在 finally 里 revoke 掉。第二個(gè)坑是 canvas 尺寸設(shè)成了 video 的原始尺寸。有個(gè)項(xiàng)目上傳的是 4K 視頻canvas 設(shè)成 3840x2160結(jié)果在低端機(jī)上直接創(chuàng)建失敗。后來(lái)改成固定寬度 480px問(wèn)題解決。封面圖根本不需要原始分辨率按顯示需求設(shè)尺寸就行。第三個(gè)坑是沒(méi)做超時(shí)處理。有次線上環(huán)境視頻加載特別慢截幀的 Promise 一直 pending用戶界面卡在 loading 狀態(tài)。后來(lái)加了超時(shí)機(jī)制超時(shí)后走降級(jí)顯示默認(rèn)封面體驗(yàn)好很多。第四個(gè)坑是忽略了視頻旋轉(zhuǎn)信息。手機(jī)拍的視頻有時(shí)候帶有旋轉(zhuǎn)元數(shù)據(jù)video 元素播放時(shí)會(huì)自動(dòng)旋轉(zhuǎn)但 canvas 繪制時(shí)不一定應(yīng)用這個(gè)旋轉(zhuǎn)。結(jié)果截出來(lái)的封面是橫著的。解決辦法是讀取視頻的旋轉(zhuǎn)角度在 canvas 上做對(duì)應(yīng)的旋轉(zhuǎn)繪制。不過(guò)這個(gè)情況比較少見(jiàn)大部分視頻上傳前都會(huì)被處理過(guò)。注意截幀操作會(huì)消耗 CPU 和內(nèi)存如果列表頁(yè)需要批量截幀建議加并發(fā)控制比如同時(shí)只處理 2 到 3 個(gè)視頻避免頁(yè)面卡頓。5. 性能優(yōu)化與進(jìn)階擴(kuò)展思路5.1 批量截幀的并發(fā)控制與緩存策略列表頁(yè)如果有幾十個(gè)視頻需要截幀不加控制地同時(shí)處理會(huì)直接把瀏覽器卡死。每個(gè) video 元素解碼都要占 CPU每個(gè) canvas 都要占內(nèi)存并發(fā)數(shù)太高的話低端設(shè)備直接崩潰。我的做法是做一個(gè)簡(jiǎn)單的任務(wù)隊(duì)列控制同時(shí)處理的視頻數(shù)量不超過(guò) 3 個(gè)。每完成一個(gè)就從隊(duì)列里取下一個(gè)直到全部處理完。這樣既能利用多核 CPU 的并行能力又不會(huì)把資源耗盡。class CaptureQueue { constructor(concurrency 3) { this.concurrency concurrency; this.running 0; this.queue []; } add(task) { return new Promise((resolve, reject) { this.queue.push({ task, resolve, reject }); this.next(); }); } next() { if (this.running this.concurrency || this.queue.length 0) { return; } this.running; const { task, resolve, reject } this.queue.shift(); task() .then(resolve) .catch(reject) .finally(() { this.running--; this.next(); }); } }緩存策略也很重要。同一個(gè)視頻不需要重復(fù)截幀截過(guò)一次就把結(jié)果存起來(lái)。可以用 Map 以視頻 URL 為 key 緩存結(jié)果或者存到 IndexedDB 里做持久化緩存。這樣用戶刷新頁(yè)面或者重新進(jìn)入列表時(shí)直接讀緩存不用重新截。5.2 用 OffscreenCanvas 提升渲染性能OffscreenCanvas 是較新的 API可以在 Web Worker 里進(jìn)行 canvas 繪制不阻塞主線程。對(duì)于批量截幀場(chǎng)景用 OffscreenCanvas 能明顯提升頁(yè)面流暢度。不過(guò) OffscreenCanvas 的兼容性還不是特別完美而且 video 元素本身不能直接在 Worker 里創(chuàng)建需要配合 ImageBitmap 或者 VideoFrame 使用。實(shí)現(xiàn)起來(lái)比主線程方案復(fù)雜一些適合對(duì)性能要求很高的場(chǎng)景。如果只是偶爾截幾個(gè)封面主線程方案完全夠用。5.3 封面截取之外的擴(kuò)展玩法首幀截取只是最基礎(chǔ)的需求實(shí)際業(yè)務(wù)中可能還有更多玩法。比如讓用戶從視頻的多個(gè)時(shí)間點(diǎn)選擇封面這就需要截取任意幀。實(shí)現(xiàn)思路和首幀類似只是把 currentTime 設(shè)成用戶選擇的時(shí)間點(diǎn)等 seeked 后繪制。還可以做智能封面選擇通過(guò)分析視頻前幾秒的畫面自動(dòng)選一張最清晰的、人臉最多的、或者色彩最豐富的幀作為封面。這需要引入一些圖像分析算法復(fù)雜度高不少但效果確實(shí)更好。另一個(gè)擴(kuò)展方向是封面編輯截出來(lái)的封面允許用戶裁剪、加文字、加濾鏡。這些操作都可以在 canvas 上完成截幀只是第一步后續(xù)的編輯能力才是完整的產(chǎn)品體驗(yàn)。5.4 服務(wù)端兜底方案的設(shè)計(jì)前端截幀雖然方便但總有失敗的時(shí)候——瀏覽器不支持、視頻格式特殊、網(wǎng)絡(luò)異常等等。所以服務(wù)端兜底是必要的。我的做法是前端截幀成功后把封面一起上傳如果前端截幀失敗就上傳一個(gè)標(biāo)記后端收到標(biāo)記后用 ffmpeg 截幀生成封面。這樣既保證了大多數(shù)情況下的即時(shí)體驗(yàn)又確保了極端情況下封面不會(huì)缺失。后端 ffmpeg 截幀的命令大概是這樣的ffmpeg -i input.mp4 -vf selecteq(n\,0) -vframes 1 -q:v 2 cover.jpg這條命令的意思是選取第 0 幀輸出一幀畫面質(zhì)量等級(jí) 2范圍 1 到 31值越小質(zhì)量越高。如果首幀是黑場(chǎng)可以把 select 條件改成選取第 10 幀或者按時(shí)間選取。前后端配合的完整流程是前端截幀成功則上傳封面失敗則上傳空標(biāo)記后端收到視頻后檢查是否有封面沒(méi)有就用 ffmpeg 補(bǔ)上。這樣無(wú)論前端環(huán)境如何最終每個(gè)視頻都有封面。6. 一些實(shí)際項(xiàng)目中的經(jīng)驗(yàn)體會(huì)這套方案我在幾個(gè)內(nèi)容管理項(xiàng)目里都用過(guò)整體穩(wěn)定性不錯(cuò)但每次都會(huì)遇到一些新的邊界情況。最深的體會(huì)是截幀這件事代碼本身不復(fù)雜復(fù)雜的是各種環(huán)境差異和異常處理。把超時(shí)、降級(jí)、跨域、移動(dòng)端兼容這些邊角都處理好代碼量會(huì)比核心邏輯多好幾倍但正是這些邊角決定了功能能不能真正上線用。另一個(gè)體會(huì)是關(guān)于用戶體驗(yàn)的。截幀需要時(shí)間哪怕只有幾百毫秒用戶也能感知到。所以界面上要有 loading 狀態(tài)不要讓用戶覺(jué)得卡住了。截幀失敗時(shí)要有降級(jí)方案顯示默認(rèn)封面比顯示空白好得多。如果截幀時(shí)間超過(guò)一兩秒可以考慮先顯示一個(gè)模糊的占位圖等截幀完成再替換。最后分享一個(gè)小技巧如果視頻本身有 poster 屬性或者后端已經(jīng)生成了封面優(yōu)先用現(xiàn)成的封面截幀只作為兜底。這樣既省性能又保證質(zhì)量。截幀方案最大的價(jià)值在于沒(méi)有封面時(shí)能快速生成一個(gè)而不是替代所有封面來(lái)源。把這個(gè)定位搞清楚方案的設(shè)計(jì)和取舍就清晰了。
返回列表
PREV
查看更多資訊
NEXT
返回資訊列表
综合久久中文字幕综合日韩精品| AV一二区| 91欧美网| 精品96久久| 人妻乱仑一区二区三区| 中文字幕蜜乳av| 麻豆精品A片免费观看| 91在线精品| 欧美天天射| 加勒比性爱成人在线| 98色网| 国产精品视频91久久| 激情四射婷婷六月天| 蜜臀久久99精品久久久久久久久| 8050午夜少妇无码| 久操网视频| 四虎国产精品永久在线囯在线| 色五月AV在线| 粉嫩小泬久久久一区二区| 色色五月丁香| 色九九综合| 成人福利视频网| 八戒无码国产午夜福利| 欧美高清无码免费视频高清版| 亚洲天天自拍| 99999久久精| 天天综合网合集91| 破处bbq| 中文字幕78| 成人老鸭窝人人在线视频| 婷婷五月天色色| 亚欧Av| 日韩精品1区2区中文字幕| 国产亚洲精品A在线观看下载| 妇女一区二区三区| 亚洲高清色综合| 91亚洲狠狠色| 99999久久精| 91狠狠综合久久| 清纯唯美激情| 免费一二区| 中文字幕三四区| 久久AV无码AV| 日本一区二区三区午夜观看| 国产高清无码一区三区二区| 天天做日日爱夜夜爽| 永久免费发布性爱网| 在线强奷到舒服的无码视频 | 很黄很污的免费网站| 婷婷色导航| 色婷婷狠狠18禁| 懂色综合久久久| 很很干很很操| 欧美日韩人人早| 欧亚久久偷拍视频| 性交一区二区在线播放| 大色综合| 无码高清国产AV| 狠狠操夜夜| 亚洲av乱伦色图网站| 蜜桃久久一区二区三区| 一本色道久久综合亚洲二区三区| 欧美组图日韩亚洲中文字幕| 大香焦A片| 欧美极度丰满熟妇hd| 狠狠综合| 人妻 欧美 中文| 亚洲AV色图一区| 亚洲丝袜综合| 国产精品探花视频| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 高树玛利亚无码流出| 偷拍在线观看视频| 亚洲熟女综合网| 日韩美女啪啪一区| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 丰满人妻一区二区中文| 啊啊啊啊啊啊在线观看| 国产AV高清AV无码| 台湾肥佬网一区二区三区| 亚洲的天堂网| 福利视频香蕉免费一区二区在线| 亚洲精品一区二区三区在线播放| 夜夜操天| 永久电影三级在线观看| 亚州操操穴网| 激情视频图片| 日韩av不卡在线看| 中文字幕日产av人| 91精品人妻一区二区三区蜜臀| 日本熟女不卡视频| 久久欧美按摩999| 91久久国产综合精品| 一区二区高清视频| 九九色综合| 97超碰人操| 成人av毛片在线观看| 国产黄色av大片网站| 天天综和| 91 手机在线播放 绯色| 久久综合久色欧美综合狠狠 | 天天色天天干天天射| 天天日天天色| 熟妇人妻精品一区二区| 亚洲精品99| 精品人妻伦一区二区三区久久| 欧洲特黄毛片免费看欧洲毛片| 色香色欲天天综合网天天来吧| 啊啊啊啊啊在线视频| 色香欲综合| 成人性爱电影网| 99蜜桃臀久久久欧美精品网站| 91综合色噜噜| 麻豆性爱视频在线播放 | 国产精品白虎| 天天肏天天干| www.高清无码诱惑一区.com| 操婢日韩| 亚洲情色在线| 凸凹视频在线观看| 欧美人妻另类在线| 囯产乱伦一区二区三女 | 亚洲精品九九九| 丁香五月激情综合| 久久av无码| 日韩少妇丰满亚洲| 精品成人动漫一区二区| 99热这里只有是精品10| 911粉嫩人妻| 激情视频图片| 婷婷五月在线视频| 国产捆绑一区| 97视频www| 国语av最新自产拍在线观看| 亚洲激情深爱文学小说网站| 亚洲av强奸乱伦| 夜夜夜夜久久久久| 欧美综合第一| 亚洲乱码国产乱码精网站| 久久9999| 日韩精品区二区三区不卡| 人人妻人人玩人人澡人人爽| 国产丝袜美腿美女麻豆| 伊人久久大香大香线蕉中文| 午夜精品久久久久久久久久久久久| 99热免费| 欧美性爱18观看| 久日综合网| 99精品热| 欧美黑人猛交春色影视大全| 亚洲av噜噜噜噜噜噜| 亚洲色图加勒比| 亚洲一曲日韩精品| 成人九九| 青青欧洲黑| 六月天婷婷| 极品综合| 麻豆天美传媒毛片| 精品高清牛人盗摄一区二区三区中文字幕A片免费在线观看 | 亚洲 小说 欧美 激情 另类| 欧美激情亚洲| 日本孕妇孕交| 男人的天堂在线2| 亚洲 日韩 丝袜 熟女 变态| 高清国产无码av| 天天操熟妇| 精品久久久九九九孕妇| 欧美麻豆成人同性GⅤ在线| 黑人娇小av在线播放| 五毛骚逼极品美女怕怕| 伊人aaa| 国产精品色| 亚洲成人日韩小说| 粉嫩av在线| 天天躁狠狠躁av| 性爱动态120秒| 激情无码日韩| 1769一区| 熟女人妻精品一区二区视频| 午夜福利 成人 91| 亚洲色图 图片| 大香蕉伊人网WWWn0n| 在线国产探花| 在线观看精品国产免费| 亚洲色图欧美色图日韩色图| 色欲av一区二区三区蜜芽| 大香蕉人妻久久| 蜜臀久久精品久久久久视频| 欧美第二页午夜| 加勒比五月天| 乱码人妻一区二区三区| 美腿丝袜高跟网免费视频免费视频| 五月综合视频| 久久伊人大香蕉| 人人潮人人摸| 日本日逼高清| 91精品微拍福利| 欧美一区二区三区不卡高清视频| 999精品女人| 亚洲,欧美,综合网| 免费精品AB| 美女91av| 欧美色道啊| 日韩av情韩国爱禁区av一区二区| 91激情国产| 亚洲资源网| 精品久久久不卡一区二区| 性色高清在线| 一区二区不卡| 色噜噜人妻av中文字幕| 一二三区精品视频| 黑人在线91| 国产91美女视频| 超碰 欧美| 夜夜免费视频| 男人天堂导航| 亚洲一区二区三区在线激情| 中文字幕人妻资源在线| 加勒比在线视频一区二区三区| 秋霞网—男女啪啪亚洲免费体验区| 国产又粗又大硬免费色网视频| 污色区网站| 日本成a人v网站在线观看| 久久久性| 在线观看AV片| 黄页大片在线观看| 伦理弟一页| 任我爽在线视频免费观看| 欧美性第1页| 欧美双插| 日韩av不卡在线看| 日本熟女中文| 久久精品国产精品| 黑人性欧美| 国产毛片毛片4p懂色| 亚洲图片婷婷五月天| 欧美精品日韩一区二区| 青娱乐av在线| 热热色综合网| 伦激情人妻另类人妻| 激情五月天社区| 天天日老熟妇| 久久久久96| 啊啊啊好多水| 在线人人人人人人精品超 | 男人的天堂99| 美国aaaaa一级黄片| 99爱在线视频| 欧美国产操逼| 精品一区二区三区国产| 日本网色| 亚洲色图综合网| 91网站18禁| 国产亚洲精品农村妇女| 在线只有精品| 日韩中文9| 人妻夜夜爽天天爽三区麻豆AV网站| 91香蕉视频在线观看免费| 极品白嫩美女白浆成人福利在线看| 人妻天天夜夜爽一区二区| 美女91在线观看| 超碰偷拍| 717影院理论午夜伦八戒| 97操97色| 91欧美经典| 在线强奷到舒服的无码视频| 欧美色图天堂网m| 后入人妻无码| 色久桃花影院在线观看| 日韩伦理久 久久 清纯| 97这里有精品| 亚洲欧洲国产综合av| 久久久国产精品人妻丝袜| juliaann欧美丝袜办公室| 五月天丁香婷婷综合网站| 大香蕉中文aV在线| 天天澡天天爽日日AV| 亚洲操操操| 狠狠97| 亚洲av无线观看| 神马午夜久久久| 91中文字幕| 亚洲激情网| 精品无码一区二区三区| 91操人| 亚洲色图综合网| 日韩中文字幕精品一区在线| 啊啊啊啊二区好大| 尤物视频一区| 欧美韩国你懂得在线 | 日本色色色| 十八禁黄色| 黄aaaaaaaaaaaaaaaaaa色网站| 亚洲诱惑| 伊人网综合在线视频| 欧美色图人妻| 日韩性爱小视频在线观看| 色九九综合AV| 日欧操屄视频| 啪啪啪精品| 亚洲视频,小说| 91久久免费视频互動交流| 色 婷97| www久久国产精品| 久久熟妇五十路一区| 91大神精品长腿在线观看网站| 亚洲熟女综合| 亚洲第一狼人丝袜美女另类 | 国产浮力影院第1页| 热热色AV| 国产欧美美女免费观看视频| 亚洲AV无码乱码| av午夜玫瑰| 国产精品嫩草影院免费| 风间由美日韩欧美久久| av优播| AA级电影三区| www.男人的天堂| 欧美一级欧美三级在线观看| 亚洲精品aa久久伊人| 最新制服中文第一页| 欧美亚洲国内自拍| 亚洲中文字幕久久人妻| 无码粉嫩白虎一线天b区| 91亚洲精品青草| 秋霞久久亚洲精品成人| 青女偷拍网| 自拍丝袜美腿人妻| 性爱1区| av一区二区三区不卡| 97色涩| 日韩乱伦视频| 青青草国产欧美非洲黑人| 久久久久密| 一个国产在线综合网站| 一二三四区电影| 欧美人妻精品| 欧美成人性爱视频大全| 欧美999| 久久AV色| 草b在线| 手机看片1025| 国产久久av| 欧美亚洲激情| 男人天堂最新手机版在线青青草| 成人热久久精品| 亚洲色综合| 强奸国产精品视频| 伊人网青青| 色香网| 久久综合精品一区二区三区| 91丨九色丨东北熟女| 在线观看免费视频国产| 午夜性生活av免费在线看| 国产精品夜夜夜| 91成人在线| 超碰97欧美在线| 91天堂色男人的天堂| 日韩精品字幕| 色噜噜狠狠色综无码久久合欧美| 精品二区三四区五电影 | 久久草在线综合视频| 午夜男女爽爽大片免费观看| 97色碰| 国产免费内射视频| 欧美线天码中字| 秋霞午夜视频一区二区| 成人AV素股で擦久久| www.天天干| 成人乱码一区二区三少妇| 亚洲无码国产探花在线观看| 96精品久久久久久久久久| 亚洲激情欧美色图 | 免费啪啪一级视频| 免费观看国产不卡av| 视频一区二区免费在线| 日韩性爱小视频| 精品国产乱子伦一区二区三区,精品一| 亚洲青青草| 91少妇香蕉久久精品| www.AV有限公司一区| 91女神在线视频| www鬼畜国产男人的天堂| 久久国产视频性吧| 精品国产一区二区久久| 日韩一区二区熟女| 加勒比人妻综合| 国产久久久久影院老熟女| 中文字幕综合人妻| 精品二区三四区五电影 | 综合色久欲| 加勒比性爱成人在线| 999九九精品| 天天日美女的B| 欧美成人贴图| 欧美91在线| 麻豆国产精品午夜视频| 久操凹凸视频| av在线资源| 五月激情综合网| 久都青青视频| 天天看片麻豆| 激情另类激情| 亚洲精品aa久久伊人| 在线一道啪| 久久婷婷精品| 精品久久99| 狠狠夜色午夜久久综合在线| 中文字幕青青草| 91东北熟女| 黄色AAAAA欧美| 立川理惠加勒比无码| 久久久人体| 青草香蕉网| 女人18精品一区二区三区| 欧美牲| 国产女人与拘做受视频免费| 五月婷婷无码| 干B| 亚洲天堂一二| 久久久久亚洲三级电影| 国产精品电影| 大乔未久88一区| 中国少妇啪啪视频| 二男一女成人A片| 五月天综合| 97精品综合久久网| 欧美日韩1234| 国产精品久久久久av| 玖玖综合色| 超碰人人干天天射| 久久性爱网站| 欧美激情一区二区| 2017天天拍大香蕉| 无码聚合| 欧美中文狠| 清纯唯美亚洲| 日本久久精品| 国产欧洲精品亚洲午夜拍精品| 丰满人妻一区二区三区| 性爱综合网| 久久综合久色欧美综合狠狠 | 一级日本牲交大片好爽在线看| 十八禁视频网站| 18岁禁 茉莉成人久久| 欧美日韩久久精品爱爱| 岛国精品视频在线观看| 日韩精品大香蕉伊人在线| 亚洲综合91| 九九色影院| 日日骚精品视频| 久久性爱视频99| 人妻熟女字幕一区二区| 亚洲情色 自拍| 国产99久久99热这里只有精品15| 97色涩| 久久无码一区二区二三区性色| 密桃99999| 91插B网站| 插日本熟女视频| 超碰午夜| 熟女人妻一区二区三区| 青操影院| 大香蕉黄色一区| 亚洲se电影| 人人天天干干| 国产精品对白自产拍| WWW黄片COM| 亚洲校园激情| 五月天色五月| 欧美97爱| 欧美精品双插| 99在线无码精品秘 入口黑人| 和协影院中文字幕三区| 日韩一级成人毛片免费观看| 欧美精品欧美精品系列| 五月激情天| 97干97色| 60秒免费小视频| 天堂中文日本在线观看| 99在线精品观看视频中文| 9久精品| 97超碰色色| 日本精品人妻少妇一区二区| 操逼国产免费| 一二三四区电影| 丁香五月激情综合| 涩涩涩综合| 久久久精品久久| 黄aaaaaaaaaaaaaaaaaa色网站| 欧美97av| 蜜臀AV成人精品蜜臀AV久久| 久久人人舔人人爽舔人人av片| 欧美综合777| 99精品在线| 国产精品视频91久久| 久久精品国产精品| 男人夜色天堂ss| 91伊人久| 嗯嗯不要视频| 中文字幕乱偷人妻久久艾草网| 午夜男人一级A片7777| 国产乱子伦久久精品综合一区二区三| 伊人久久大香蕉线AV五月天| 久久久久国产一区二| 97欧美精品| 久草精品一区 | 少妇天堂网络| 国产乱伦一二三区| 国产三级在线现体验区| 久久久一区二区三区麻豆| 刺激性视频黄页| 综合久久欧美| 中文字幕精品一区欧美| 亚洲欧美洲综合| 裸体1区| 富二代亚洲精品99| 一区在线国产播放| 国产精品分类在线观看| 极品色综合| 亚洲drav色图| 九九成人精品| 久久国产精品一级二级三级| www色日本| 久久亚洲欧美中文字幕国语| 97爱爱爱| 日本在线伊人啪啪| 啊嗯嗯啊好大好爽| 久久超碰大香蕉| 色综合98| 九九九九九九九精品视频| 乳欲人妻办公室奶水| 亚洲影院成人| 超碰97 线线 在现| 蜜臀中文无码午夜| 加勒比av网| 综合视频91| 午夜欧美J进J出白浆流出久久久 | 久久久草草精品| 国产精品色哟哟| 青青国产精品在线| 91无码中出人妻视频| 国产一区二区视频在线播放| 国产精品探花在线| 一区二区三区免费岛国片| heyZO天然素人无码AⅤ专区| 欧美成人一级麻豆| 91香蕉国产尤物视频| 欧美日韩精品久久久久久久久东北老熟妇| 热久久无毒不卡| 天天操天天日青青草超碰av| 日韩淫色网| 超碰免费欧美7| 日韩美女,国产传媒,视频一区| 天天看人人操屄犊摸阴| 欧美色图片91| 丁香婷婷激情五月天无毒不卡| 天天弄欧美| 亚洲色图加勒比| 精品人妻视频一区二区三区蜜桃视频| 日本人妻天堂网站在线播放| 美美91成人国产精品欧美精品久久久久久久 | 黑人中出21连凳花野真衣| 99热99re超碰精品| 久久久av爱| 精品乱码久久久久| 风月影院男女十八禁| 免费97视频| 亚洲情色综合网| 一本色道久久综合狠狠操| 欧美综合综合| 屁股久久久久久久| 秋霞成人一级在线观看| 天天天天天天天天天天干美女| 伊人网综合在线视频| 欧美,日韩,亚洲视频| 国产99 中文字幕日韩小视频| 91久久久久久久久18| 成人欧美一区二区三区黑人一| 久久国产精品一级二级三级| 安徽熟妇视频| 中文字幕精品专区搜索结果91| 97 国产精品| 香蕉视频欧美一卡二卡| 国产美女自拍AV| 天天干夜夜一操| 色婷婷激情| 97色欧州| 婷婷丁香人妻 | 人人妻人人操人人乐| 亚洲色性情三级| 中出人妻中文字幕91在线| 91丰满| AV一起草在线| 久久性爱城| 91在线免费观看处女| 九九九九九九九九九五码| 国产夫妻性生活视频| 国产一国产一级毛片古装| 国产性久久久| 性色一线| 啊啊啊男女| 内射老妇BBWX0C0CK| 激情专区综合| 操亚州| 97色色色| 91|九色|国产熟女| 99re99视频在线免费观看| 亚洲欧美91| 久久成人午夜精品影院| 人妻夜夜爽天天爽麻豆三区网站| 国产精品一级二级在线| 日本国产亚洲一区在线观看| av大香蕉| wuyechaopeng| 日本免费一级AAA大片器| 国产熟女少妇一区| 日日躁天天躁狠狠躁| 欧 美 自 拍 偷 拍| 尻女朋友一夜| 熟妇色99| 九九亚洲视频| 少妇熟女视频一二三区| 国产av波波国产精品| 国产久久视频| 国产精品人妻无码久久久老鸭窝| 色婷五月天| 欧美日韩人妻精品一区二区三区| 久久夜黄色无码A级大片| 偷拍超碰| 懂色中文一区二区三区| 大香蕉十区| 亚洲美女av无码| av中文字幕在线熟女| 97综合激情| 婷婷久久五月| 后入人妻无码| 4399成人黄A片| 91麻豆天美国产欧美高潮| 97国产伦理| 日韩在线一区高清在线| 嗯嗯啊好大| 福利社区午夜一区二区| 99re这里| 婷婷丁香五月天亚洲天堂网| 校园春色家庭伦理欧美激情| 久草免费在线一区二区| 欧美亚洲色的图| 婷婷丁香五月激情啪啪| 中文字幕成人乱码熟女精品国50 | 少妇激情AV| 亚洲色图亚洲无码强奸乱伦| 欧洲自拍第一页| AV综合中文字幕干| 国色综合天| 东北夫妻性偷拍| 日韩激情无码影院| 青青伊人久久| 澳门特级毛片免费观看| 91bbbbbb| 国产熟女少妇一区| 乱性AV| 国产精品久久久久久久久久久久久久久久 | 成人性爱电影一区二区| 天天欧美| 超碰97资源中文字幕| 日韩性爱1级片视频| 蜜臀一二三区| 一色网男人的天堂| WWW啪啪的com| 综合熟妇一区二区三区| 亚州操操穴网| 亚洲第一精品在线视频| 国产suv精品一区| 天天综合精品| 日本午夜操逼| 久草在线| 九九九九九九视频| 婷婷在线播放| 欧美一区二区福利在线| 亚洲色综网| 黄色大片一区二区密桃丝袜| 天天看天天在线精品| 亚洲人妻色图| 热久久国产精品视频大陆精品| 亚洲成?V人片在线观看福利| 日本成a人v网站在线观看| 天海翼久久| 91在线|亚| 色综合久久88色综合久久天天| 久久久久久久97| 亚洲偷拍欧美激情| 91逼逼女人91| 欧美黄色片AAAAA| 乱性AV| 久久9久久| 欧美在线色| 日韩性色b| 亚洲国产欧美中日韩成人综合视频| 91美女视频| 97中文字幕一区| 九九久久99| 日本三级久| 久草福利在线资源站| 精品美女久久久久| 久久无码精品| 国产97/欧美| 中文字幕一区二区三四五区日日骚| 五月天丁香| 精品一区二区成人动漫| 亚洲精品三区在线观看| 91免费看一区二区三区| 中文字幕成人乱码熟女精品国50 | 国产 丝袜 欧美中文 另类| 亚洲啪啪视频免费| 91老熟妇| 最近二区三区视频大全| 九久久精| 超碰精品97| 国产后入清纯| 日韩精品人妻中文字有码在线| 67914在线精品观看| 日本三级中国三级99人妇网站| 中文字幕交换人妻| 九月激情婷婷| 国产在线视频二区| 欧美人人曰人人操人人射射| 91内射| 免费视频一二三区| 中文字幕视频二区| 一本色道熟妇| 南澳成人一级片在线播放| 久久成人精品| 啊啊啊轻点在线观看| 人妻无码一区二区三区久久99| 日本新免费二区三区| 日韩人妻精品中文字幕| 久久伊人青青草| 久操大香蕉超碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰碰 | 97色亚洲| 97精品久久| 国产免费黄色一级大片| 精品国产三级av韩国在线| 欧美91精品国产自产| 亚洲av青草久久一区二区| 91狠狠综| 操操操五月天婷婷丁香影院| 人人干黄色| 思思热久久成人| 成人网站 免费观看| 日本在线激情一区二区三区| 激情四射五月天| 日本一本一区二区三区四区五区欧美日韩中文字幕 | 9999伦理视频| 搞中出视频在线观看| 国产精品久久久久久久久久久久久久久久| 亚州熟妇精品| 天天综合91入口| 亚洲日韩电影| 熟女这里只有精品6| 亚洲av综合色区无码一| 俺去俺来也在线www| 婷婷色婷婷| 青青草吊丝| 99热大香蕉伊在线| 九热中文字幕| 亚洲另类小说卡通动漫| 高清国产av无码| 性色avv| 伊人精品国产| 清纯唯美亚洲综合| 久久综合资源一区二区| 久久99综合| 色天使大香蕉| 欧美日韩人妻精品一区二区三区| 亚洲成人贴图| 国产大学生口爆吞精合集| 香蕉久久国产AV一区二区| 久久久9视频| 亚州国产成人精品女人久久| 亚洲九九九九| 中文字幕亚韩| 熟妇熟女一区二三区| 骚日日av| 国产日韩区| 精品一区二区三区蜜桃臀赵总 | 天海翼久久| 精品999999| 成人性爱全视频观看| 中文字幕一区 二 区 三 四 五 区日 日 骚 | 亚洲中字慕不卡| 伊人网青青| 99这里有精品视频| 亚洲丝袜99| av网站免费线看| 九九黄色网| 人妻激情在线视频| 强奸乱伦AV一天堂网| 噜噜在线| 久久九九久精品国产尤物|国产精品爽黄69天堂A片潘金莲,国产亚洲精品第一综合 | 日本好吊色视频| 97超碰人人操人人操| 性一交一乱一交A片久久四色| 操一区| 大学生美女口爆| 久久婷婷精品| 蜜桃精品视频一区二区三区| 欧美性生活男人的天堂| 精品女人999| 亚洲国产97在线精品一区| 国内毛片婷婷六月色| 97香蕉人人乳| 翔田千里A片一区二区| 久久婷婷五月天| 亚洲天堂一区二区| 精品国产99| 精品午夜福利导航| 麻豆天美国美国产AV| 欧美色图欧美| 九九精品热| 久久有码视频| 操美女高潮抽搐白浆| 玖玖超碰熟| 国产不卡免费在线视频| 欧美色图 人妻| 大香蕉一区二区在线观看.| 天天日日日射| 91P0RNY大屁股人妻| 人人喜人人妻| 女沟厕偷窥piss小便| 久久久久骚| 精品人妻中文字幕高清| 色av中文字| 91久久青青草原精品| 爱爱动态120秒| 91狠狠综合| www.色操逼| 97干97色| 久久香蕉国产线看观看亚洲女人 | 操逼天美3区| 四虎国产成人精品免费一女五男| 乱伦一二三| 日韩/97| 俄罗斯一区二区视频在线观看| 九热大香蕉| 国产亚洲女v在线观看| 亚洲天堂日本| 天天躁日日躁XXXXYY| 小电影欧美91| 亚洲欧美一区二区三区在钱蜜桃 | 国内外色色色色色成人视频| 啊啊啊久久| 有码人妻系列| 亚洲国产欧美另类自拍| 98超碰日本| 国内三级自拍小视频在线观看 | 日韩AC| 国产精品乱码久久| 久久人人爽爽爽人久久久| 国产精品白丝在线播放| 亚洲电影91| 狠狠色色| 久久这里只精品免费福利| 国产精品视频| 中文字幕日本久久| 91丝袜在线观看| 日本999精品| 国产一区二区三区影片| 久久精品黄色| 东京热熟女亚洲视频网站| 亚洲熟女中文字幕在线| 五月丁香激情四射| 欧美在线视频播放| 婷婷五月天网| av天堂精品久久| 欧美九九九| 欧美97在线观看| 热九九精品| 人妻无一区二区三区| 欧美在线|亚洲| 亚洲精品97在线| 操B在线观看| 亚洲欧美另类激情小说| 熟妇激情| 成人久久无码www| 国产一区二区啪啪视频| 91人精品妻入口| 日韩精品一二三| 日韩精品操少妇| 色蜜AV| 粉嫩在线一区二区懂色| 日本韩国国产精品一区| 美女t无毒不卡不卡| 欧美亚洲AN| 91N欧美| 91精品无码人妻系列| 丁香五六月啪啪| 欧美色干| 色噜噜狠狠色综无码久久| 秋霞男人网| 久久五月份| 精品人妻美妇91job| 国产美女裸体秘 永久无遮挡| 一区二区视频在看| 夜夜操夜夜高潮夜夜爽国产精品区| 午夜福利久久久噜久噜久久综合| 无码伊人久久大杳蕉中文无码| 国产隔壁老王影院在线| 天天综合亚洲综合| 久久粉色| 96超碰网| 久热精品在线| 智利AV在线网| 色天堂在线观看| 乱老熟女一区二区三区| 极品白嫩福利在线| 天天射,天天操,天天爽-国内精品一区二区三区-成人AV | 日韩中文字墓| 丰满人妻一区二区三区免费 | 无码天天操| 人人玩人人添人人澡免费| 国产美女高潮| 操人妻视频| 日韩综合97p| 91狠狠综合久久| 91天堂丝袜美腿| 综合熟妇一区二区三区| 天天天做天天天爱天天天爽| 青操影院| 亚洲素人综合| 一级二级三级黑人无码| 久久久新亚洲AV| 又大又大又大又粗爽高潮观看| 怡红院成人视频| 99re欧美| 91高潮| 麻豆天美传媒毛片| 国产精品白领在线观看| 中国AAAAAA黄色片| 国产JDAV无码视频在线观看| 青青青国产手线观看视频2| 美女天天干| 成人性爱AV在线免费观看| 人妻干天天| 成人麻豆av电影网站| 亚洲一区二区三区中文字幕| 日韩精品人妻一| 爱av免费| 婷婷五月天综合网| 天天操天天射青青草| 亚洲高清内射| 精品一二三区女同| 夜夜高潮夜夜爽国产伦精品| 91免费看中出视频| 99人妻| 麻豆国产视频精品观看| 人人看欧美性爱| 国产免费久久久久| 天天爱天天韩国日本牛牛牛牛| 国产伊人自拍| 91高跟美女在线播放| 免费99精品国产自在在线| 青草精品视频一日本久久久久网站| 777超碰| 内射小黄片| 伊人女女资源在线观看| 亚洲少妇喷视频看| 爱欲AV| 日本最新1区2区3区| 快灬快灬 一下爽蜜桃在线观看| 九九九久久久| 日本精品无码三级网站| 婷婷久久网| 97资源欧美| 亚洲日韩狠狠撸视频| 九九九色| 国产成人手机视频激情| 人人操AV| 天美传媒Av在线| 久久精品无码一区二区三区| 操逼无码操逼| 久热大香蕉| 久久久久久91香蕉国产| 亚洲资源吧| 欧美1区二区三区公司 | 亚州综合在线| 亚洲暴力强奸AV| 日本久久久久久久久| 亚洲性感丝袜诱惑在线观看| 欧美熟妇精品黑人巨大91| 亚洲无码太久| 人妻激情另类| 日本天堂在线播放| 五月天婷婷在线看 | 97av在线观看| 在线看片国产精品每日更新| 男人的天堂,欧美亚洲另类国产日韩,日本高清一区二区 | 欧美色图另类图片| 被男人添B超爽视频| 校园春色 男人天堂| 成年人免费观看网站| 自拍偷拍第26| 男人亚洲91首页在线| 日韩欧美中文字亚洲慕| 欧美中文字幕日韩在线| 首页亚洲国产高跟丝袜诱惑视频| 很很很很操| 女人与公拘交酡2020视频| 99色视频| 欧美瑟综合| 国产美女mm131爽爽爽爽| 国产久久一区二区三区野外在线| 99久在线精品99re8蜜桃| 免费A V在线播放| 嗯嗯啊好大| 午夜男女爽爽爽影院视频| 成人夜夜爽| 欧美中日韩XXXX| 五月婷婷丁香中文字幕| 丝袜av一区二区三区| 秋霞一集毛片观看| 超碰公开久久网| 日韩精品-原创伙伴| 亚洲另类电影| 97久久久久久久久久| 性开放中文AV高清无码免费看| 九九亚洲精品| 日韩欧美成人午夜福利| 青青草视频在线观看一区二区| 九九碰九九爱97超| 国产女上位好爽在线| 国产一区在线播放| 99热97| 永久电影三级在线观看| ,国产乱人伦精品一区二区三区| 日韩97P| 欧美激情亚洲色图| 色色毛片| 香蕉久久精品| 午夜一级免费毛片| 日韩中文字幕宗合在线| 亚洲国产一级精品毛一级精品看免费视频| 婷婷15月天青娱乐| 操逼逼中文字幕| 欧美日本视频一区| 曰韩av中文字幕专区| 亚洲资源吧| 亚洲夜色在线| 一起草三级AV电影在线观看 | 1024亚洲中文字幕久在线看片你懂的| 亚州综合色| 玖玖爱综合| 国产精品永久免费10000| 亚洲一区二区 麻豆传媒| 国产精品探花视频| 亚洲情色 自拍| 亚码激情| 麻豆天美久久91| 中文字幕丰满子伦无码专区在线视频最新 | 亚洲性综合9| 国产二区三区免费视频| 91国产美女丝袜足交精品视频| 亚洲国产婷婷在线播放| 大香交| 欧美|91色综合| 成人97人人超碰人人| 五月天亚洲网| 久久思思热| 日韩福利综合一区| av草草在线电影| 91麻豆天美国产欧美日| 伦激情人妻另类人妻| 少妇特黄一区二区三区| 欧美超碰9798| 亚洲导航深夜福利| 天啪| 91/欧美| 开心激情婷婷| 亚川综合视频| 亚洲欧洲日韩中文字幕一区| 裸体女人草逼视频播放一区,二区,三区,四区,五区| 色哟哟综合| 午夜美女诱惑电源网| 91中文精品日韩欧美在线| 亚洲最大无码中文字幕网站 | 天色综合网| 欧美很很操视频| 伊人网免费视频| 亚洲女优有码无码高清| 99re只有精品| 99精品网| 日韩乱伦影音先锋| 秋霞Av理论一级在线| 日本亚欧爱爱| 极品少妇99| 婷婷五月影院| 国产精品视频白浆免费| 日韩性爱一级片| 超碰色美女| 欧美猛交黑寡妇中文字幕| 一品道视频一区二区三区| 在线综合色| 欧美人人曰人人操人人射射| 1024精品在线| 日本一级不卡一二区| 国产一级久久久| 亚洲 日本 一 二 三| 久草免费在线一区二区| 亚洲无码太久| yiqicaoav| 在线天堂资源亚洲| 2020中文字幕在线| 97碰碰日本乱偷人妻中文的| 嗯嗯嗯嗯啊啊啊好紧好大| 国产免费一区在线观看| 日韩欧美tv一区二区在线观看| 九九综合九九综合| 色九久| 欧美激情 亚洲色图| 久久久内射良家| 欧美日韩大陆黑人少妇99| 99999无码| 人妻久久久久久久久久久久久久久 | 欧洲精品网| 欧洲亚洲人人爽爽视频| 97爱欧美| 大香蕉伊人一区在线观看| 色婷婷五月天| AV综合中文字幕干| 亚洲精品乱码久久久久久蜜桃麻豆 | 呦呦影院| 亚洲色婷婷久久久综合日本| 天堂亚洲欧美| 国内毛片四区| 青青草原香蕉日本Ap| 欧美线天码中字| 亚洲AV不卡在线观看| 欧美综合传媒| 91n.欧美| 99精品无码| 我要色综合网站| 国产区在线| 欧美色另类| 国产精品久久久久久久久久久久| 91五十路| 久热一区二区| 日本孕妇一区二区视频操逼免费看 | 亚洲色天堂九9| 一区超碰一区| 超碰吊日色| 性一级黄色录像片网站导航 | 亚洲自拍欧美国产首页网曝| 麻豆精品A片免费观看| 嗯嗯啊好大| 黑人干亚洲| 91无码精品| 国产 日韩 欧美一区| 92性色国产午夜福利在线661| 日本精品网站在线中文| 日本Xx性爱|