久久亚洲成a人片熟女精品色一区二区三区|国产精品视频第一精品视频|av天堂热无码手机版|亚洲?v无码久久无遮挡|国产精品偷伦视频免费观看国产|麻豆国产自产精品丰满熟妇|av无码av不卡一区二区|久久亚洲精品中文字

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ò)去的坎。用戶(hù)上傳完視頻后臺(tái)轉(zhuǎn)碼還沒(méi)跑完前端總得先給個(gè)像樣的封面占位不然整個(gè)列表看起來(lái)就像半成品。用 canvas 截取視頻首幀作為封面就是解決這個(gè)問(wèn)題的經(jīng)典方案——不需要后端參與不需要額外上傳圖片瀏覽器里幾行代碼就能把視頻第一幀畫(huà)面摳出來(lái)變成一張圖。這個(gè)方案的核心邏輯其實(shí)很樸素視頻文件在瀏覽器里加載后通過(guò) video 元素解碼出畫(huà)面再把當(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)容管理、短視頻列表這類(lèi)功能需要在前端快速生成封面預(yù)覽那這套方案直接能用。如果你是完全沒(méi)接觸過(guò) canvas 的新手也不用慌核心代碼不超過(guò)三十行我會(huì)把每一步為什么這么寫(xiě)都講透。如果你已經(jīng)在用類(lèi)似方案但總遇到黑屏或者跨域報(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ù)端資源而且用戶(hù)上傳后要等后端處理完才能看到封面體驗(yàn)上有延遲。前端 canvas 方案的優(yōu)勢(shì)就是即時(shí)性——視頻選完封面立刻出來(lái)用戶(hù)馬上能看到效果。還有一個(gè)容易被忽略的點(diǎn)首幀截取和任意幀截取是兩回事。首幀截取的目標(biāo)是視頻的第一幀畫(huà)面但瀏覽器的 video 元素在 loadedmetadata 階段其實(shí)還沒(méi)有真正解碼出畫(huà)面你必須等到 loadeddata 或者 seek 到某個(gè)時(shí)間點(diǎn)之后才能拿到有效幀。很多人第一次寫(xiě)的時(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)、寬高、編碼格式都知道但畫(huà)面數(shù)據(jù)還沒(méi)解碼出來(lái)。如果你在這個(gè)階段調(diào)用 drawImagecanvas 上畫(huà)出來(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í)候畫(huà)面一定已經(jīng)解碼完成drawImage 就能拿到有效畫(huà)面。為什么是 0.001 而不是 0因?yàn)槟承g覽器在 currentTime 為 0 時(shí)不會(huì)觸發(fā) seek 操作設(shè)一個(gè)極小值可以強(qiáng)制觸發(fā) seeked 事件確保畫(huà)面已經(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)把視頻畫(huà)面縮放到你指定的尺寸。注意不要寫(xiě)成 drawImage(video, 0, 0, video.videoWidth, video.videoHeight)那樣畫(huà)出來(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)寫(xiě)法上要注意。提示canvas 的 width 和 height 屬性是繪圖緩沖區(qū)尺寸CSS 的 width 和 height 是顯示尺寸兩者不要混淆。截幀時(shí)只需要設(shè)屬性尺寸不需要設(shè) CSS 尺寸。2.3 跨域問(wèn)題的根源與解決路徑跨域是 canvas 截視頻幀最容易翻車(chē)的地方。根本原因在于瀏覽器的同源策略當(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)確保畫(huà)面解碼完成 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í)的話(huà) 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)。用戶(hù)選完視頻文件后你需要先用 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 不釋放的話(huà)對(duì)應(yīng)的 Blob 數(shù)據(jù)會(huì)一直占著內(nèi)存用戶(hù)連續(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)很快但畫(huà)質(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)否則用戶(hù)等太久體驗(yàn)不好。4. 常見(jiàn)問(wèn)題與排查技巧實(shí)錄4.1 截出來(lái)是黑屏的幾種原因黑屏是最高頻的問(wèn)題沒(méi)有之一。我遇到過(guò)的情況大概分三類(lèi)。第一類(lèi)是時(shí)序問(wèn)題在 loadedmetadata 階段就 drawImage畫(huà)面還沒(méi)解碼自然是黑的。解決辦法就是等 seeked 事件或者至少等 loadeddata。這個(gè)前面已經(jīng)詳細(xì)講過(guò)。第二類(lèi)是視頻編碼格式問(wèn)題。某些視頻的編碼格式瀏覽器不支持解碼video 元素能加載元信息但畫(huà)不出畫(huà)面。這種情況可以通過(guò) video.canPlayType 提前檢測(cè)或者監(jiān)聽(tīng) error 事件做降級(jí)處理。實(shí)測(cè)下來(lái) H.264 編碼的 MP4 兼容性最好HEVC 和 AV1 在部分瀏覽器上支持不完整。第三類(lèi)是 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)播放能看到畫(huà)面但截幀是黑的那就是時(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寫(xiě)成 use-credentials 的話(huà)需要服務(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ù)必須用戶(hù)交互后才開(kāi)始加載playsInline 屬性必須設(shè)置否則視頻會(huì)全屏播放某些 iOS 版本對(duì) crossOrigin 的支持也有差異。實(shí)測(cè)下來(lái)iOS 上截幀的成功率比 Android 和桌面端低一些。主要問(wèn)題是 seeked 事件有時(shí)候不觸發(fā)或者觸發(fā)時(shí)畫(huà)面還沒(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)封面不要讓用戶(hù)看到空白。還有一個(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ì)畫(huà)面未解碼檢查 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)注意用戶(hù)連續(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用戶(hù)界面卡在 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ù)太高的話(huà)低端設(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 里做持久化緩存。這樣用戶(hù)刷新頁(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ù)中可能還有更多玩法。比如讓用戶(hù)從視頻的多個(gè)時(shí)間點(diǎn)選擇封面這就需要截取任意幀。實(shí)現(xiàn)思路和首幀類(lèi)似只是把 currentTime 設(shè)成用戶(hù)選擇的時(shí)間點(diǎn)等 seeked 后繪制。還可以做智能封面選擇通過(guò)分析視頻前幾秒的畫(huà)面自動(dòng)選一張最清晰的、人臉最多的、或者色彩最豐富的幀作為封面。這需要引入一些圖像分析算法復(fù)雜度高不少但效果確實(shí)更好。另一個(gè)擴(kuò)展方向是封面編輯截出來(lái)的封面允許用戶(hù)裁剪、加文字、加濾鏡。這些操作都可以在 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 幀輸出一幀畫(huà)面質(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)于用戶(hù)體驗(yàn)的。截幀需要時(shí)間哪怕只有幾百毫秒用戶(hù)也能感知到。所以界面上要有 loading 狀態(tài)不要讓用戶(hù)覺(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
返回資訊列表
欧美性爱第一页久久| 日本三级一区二区 在线| 69人妻精品一区二区绯色| 天天看精品动漫视频一区| 熟女一区二区三区| 日韩本不卡视频在线观看| 综合免费无码中文| 黄色电影观看久久9| 91性感在线| 日本淫穴在线| 亚洲性综合| 久久久精久久久| 国产亚洲禁久一区二区| 午夜福利精品| 午夜精品探花| 国产午夜激片Av毛片不卡| 在线视频亚洲无码| 91国模| 男人的亚洲天堂| 9久热| 久久久国产亚洲精品系列| 免费国产视频| 久久二| 亚洲人久久久网| 久草毛片电影怡| 999日韩中文精品观看视频。| 91人妻做a观看视频| 99久久无码| 91精品国产91综合久久蜜臀| 超碰在线一区二区| 欧美 传媒 麻豆 日韩 偷拍| 欧美五区| 欧美亚洲日韩16色| 91色色综合| 久久久久78| 射欧美综合| 色99视频| 亚洲熟久久| 中文字幕55555| 亚洲欧美精品一区天堂久久| 欧美v日韩欧亚洲电影天堂色诱,国产传媒| 999久久久九| 六九九九| 日韩三级久久久| 久jiu久神马影院| 婷婷五月成人| 亚洲一区中文字幕久久,果冻传媒一区二区天美传媒 | 东京热激情视频一二三区| 影音先锋中文字幕日本好一区二区| 色哟哟综合| 日韩黄片影院| 亚洲欧洲日韩国产自在线| 在线人人人人人人精品超| 黄色高清无码无码破解免费暗网 | 亚洲人成色9999精品久久| 人妻天天操天天爽视频免费| 91av天美性媒精品视频| 超碰色老头| 蜜臀久久99精品久久久电影| 国产成年女人免费视频播放a| 成人三一级一片aaa| 日韩Va亚洲va欧美Ⅴa久久| 福利在线观看一区二区| 91九九九馒头| 天天操天天日天天干| 亚洲精品久久久久久| 97鸡把在线视频| 久久久精品网站| 黄色片一区二区三区四区五区| 亚洲精品无码久久AV| 操美女高潮抽搐白浆| 国产最新AV| 97精品中文字幕| 91熟女丨91老女人| 福利伊人玖玖国产| 亚洲一二三四区机械| 夜夜骑操视频| 日韩国产欧美伦理在线| 99热这里| 亚洲天天精品| 操逼操逼操| 香蕉人人操tv| 人人澡综合涩| 亚洲人妻久久| 老司机老司机午夜影院| 日韩啪啪啪啪啪| 久插综合| 精品一区二区三区国产| 国产免费一区在线观看| AV男人天堂网| 欧美黑人精品在线播放| 中日无幕一二三四区| 亚洲图片 激情小说| 91啪啪| 性爱av在线免费观看| 中日韩久久久免费看| 色哟哟 日韩精品| 激情网五月天| 欧美日韩欧美| 久久五月份| 狠狠干妹子| www.久久制服糖| 99精品网站| 啊啊啊操死我| 男人的天堂亚洲| 俺去啦自拍| 精品午夜福利国产一区二区在线观看 | 亚洲人成网www| 精品人妻视频一区二区在线播放| 天天爱天天韩国日本牛牛牛牛| 成人在线视频一区| 懂色中文一区二区三区| 97碰碰日本乱偷人妻中文的| 性爱乱伦视频免费| 国产亚卅97| 欧美亚洲激情| 天无日色综合| 国产精品96| 一道本久久棕合爱| 九九无码| 欧美国产一区二区三区麻豆传媒| 亚洲成aⅴ人片不卡无码| 蜜臀久久99精品久久久久久久久| 人妻另类 专区 欧美 制服| 啊啊啊好大好湿| 上床啊啊啊| 婷婷亚洲天堂| 操逼A∨| 男人的天堂2019AV| 天天射天天操天天干天天吃2018| 91女在线观看| 偷拍三区| 亚洲AV在线资源| 日本一级婬片试看三分钟| 成人在线午夜视频一区| 人妻少妇av在线观看| 91N综合网在线| 高清无码国产亚洲| 日本羞羞的视频在线播放| 日韩AV一区二区三区三州三州| 亚洲一级黄色毛片| 91久久国产综合精品| 乱伦1色页| 色天堂综合| 草草网站影院白丝内射| 91美女视频。| 97精品一二区| 偷窥自拍亚洲天堂网爆| 久9无限国产| 日本不卡三级网在线播放| 国产探花日韩援交| 亚洲色棕合| 草草影院在线视频| 奇米狠999| 色综合天天爱去电影网| 91偷拍欧美亚洲| 精品久久久久久中文字幕三区| 午夜后入| 99蜜桃臀亚洲成人在线观看| 婷婷激情啪啪| 18啪啪手机免费性爱| 中国熟女91| 亚州操操穴网| 欧美日韩性爱精品| 日本人妻伦在线中文字幕| 91精品少妇搡搡搡| 中文字幕视频2区| 亚洲第2页| 丰满人妻-区二区三区| 超碰97在线 欧美 国产| 亚洲另类电影| 在线岛| 精品国产乱码久久久A| 亚洲激情色片| 人妻插插人妻人| 欧美性爱伊人| 999亚洲国产视频| 欧美劲爆第一页| 亚洲清纯唯美| 国产美女精品| 91少妇香蕉久久精品| 欧美美女自慰一区二区三区| 国产精选三级在线观看| 亚洲无码太久| 成人性爱av| 日韩三级伊人| 国产传媒日韩欧美| 欧美一二三区四五区| 99re8免费高清在线| 91成人精品在线播放| 啊啊啊啊网站| 亚洲 欧美 日韩另类 麻豆| 五月天久久婷婷亚洲 | 99精彩视频| av日韩在线观看电影| 国产精品高清2021在线| 婷婷爽人人婷婷爽视频| 日韩精品午夜操呦呦不卡影院| 黑人与人妻| 嗯嗯,啊啊,国产精品| AV大香蕉| 激情自拍 校园春色| 99熟女| jizzjizz欧美| 五月天黄色激情视频| 午夜操逼不卡| 亚洲国产尤物yw在线观看| 很很操在线| 亚洲综合在线第一页| 91美女在线| 96一区二区三区| 久久精品无码不卡| 综合熟妇一区二区三区| 一本大道久| 麻豆天天躁天天揉揉AV| 精品78| 91日韩| 欧美成人一级麻豆| se吧提供国产乱老熟视频胖女人| 日韩精品一区二区高清| 十八禁的黄污污免费网站| 国产欧美成人第一页在线观看| 天堂精品| 久草久日| 60秒免费视频| 日韩精品电影| 亚洲欧美综合图片| 亚洲日韩美女丝袜美腿人妻视频| 性色av网站| 亚洲成熟国产精品美女| 婷婷五月天激情小说| 91 刺激在线| av情色影音| 天天看高清麻豆| 亚州高清av| 国际精品久久久| 啊啊啊啊操死我| 日韩免费中文字幕视频| 91动漫操逼视频| 激情视频网址| 中 文字幕一区二区三四 五 区日 日 骚| 美日韩一二三区| 骚鸭AV| 91色花堂| 福利视频一区二区微拍| 五月天综合网| 手机av亚洲丝袜美腿日韩第一页二页| 国产久久久| 天天摸夜夜添无码小视频| 午夜精品久久久久久久99热影院| 日韩中文9| 欧洲一区二区| 强奸乱伦AV一天堂网| 成人亚欧免费视频| 国产不卡精品91| 国产精品亚洲日韩骚欢乐谷最新地址发布页huanieguty性屋娱乐妖精视频 | 色综合婷婷| 精品人妻一区二区三区-国产| 丝袜亚洲91| 久久久久九九九| 免费观看国产不卡av| 欧美后进式| 超碰人妻中文在线| 97欧美视频| 亚洲天堂无码| 嗯嗯啊啊视频一区二区三区| 91丝袜视频在线观看| 操操操五月天婷婷丁香影院| 久久久久久欧美精品se一二三四| 啊啊啊啊啊啊啊啊啊啊在线观看| 麻豆天美一区二区| 欧美激情五月天| 强奸熟女一区二区三区| 乱伦一二三区| 情色av电影| 91色狼| 国模精品娜娜一二三区 | 78精品| 天堂中文资源在线bt| 久九干| 国产精品一区二区三区四区五区| 六六久久日韩不卡| 人妻少妇精品视频一区二区三区| 日韩黄色一区二区三区| 久久女同性恋一二区| 91福利网在线观看| 性色中出| 精品人妻1区| 青娱乐av在线| 人人爱人人乐人人操| 92福利社视频| rion磁力链接| 嗯嗯嗯好爽| 欧美劲爆第一页| 熟女视频久久| 99久久99久久免费精品蜜臀| 天堂蜜桃无码视频一区二区| 神马麻豆福利院 | 俺去啦自拍| 久久久免费一级黄片| 操老熟女AV| 国产成人精品日本视频| 亚洲狠狠入| 综合色啪| 亚洲熟伦熟妇AV无码春色| 成人日韩中文字幕| 日韩激情啪啪| av毛片aaaaa免费看| 超碰人人乐97| 欧美高清18A片| 青青草成人视频在线观看二区| 日本1区2区不卡视频| 色哟哟1区2区| 激情五月丁香五月| 日本人妻伦在线中文字幕| 日韩精品人妻中文字幕久久久| 亚川综合视频| 嗯嗯不要 视频| 天天综合日韩网| 三男一女不戴套的A片| 啊啊啊啊啊啊啊好爽不要| 日日操免费视频| 亚洲日韩乱码中文无码蜜桃臀网站| 欧美日韩性爱无码| 999综合网| 欧美综合在线91| 操逼操操操91| www.色吧5.com| 加勒比性爱成人在线| 丁香六月激情| 亚洲无码超碰免费| 人妻精品一区一区三区蜜桃91| 第一高清av中文字幕| 欧美色青| 九九九九97| 97亚洲综合电影| 国产一级高跟丝袜| 好爽视频在线观看| 制服诱惑亚洲一区二区三区在线观看| AV综合中文字幕干| 久综合国内精品自在自线| 日本性一区| 天天操女人| 午夜精品五区| 国产精品露脸在线观看| 97这里有精品| 一区二区三区四区在线不卡| 国产无遮挡| 欧美国产日韩高清在线| av无线看| 伊人网免费视频| 久九九九九九九九热| 欧美超碰96| 伊人五月天| 在线观看AV片| 91成人高清在线观看| 91宗合网| 午夜噜噜噜| av线电影| 亚洲欧洲第二视频在线观看色图| 嫩草 人人网精品| 久久偷拍人| 亚洲色图久久精品蜜| 久久无码电影| 黄片不用下载在线观看| 中文字幕亚洲永久精品| 欧美国产欧美在线观看| 天天夜躁日日躁狠狠2002| 99热伊人| 欧洲精品二区| 久热最新在线杭州| 91久| 密臀视频三区免费网站| 日韩欧美久久婷婷网站| 欧美天天影院| 深夜激情| 欧美姓爱综合网| 91欧美经典| 欧美激情 亚洲色图| 欧美高潮| 好一吊区二区| 爱丝福利| 精品人妻一区二区三区不卡断 | 日韩黄色片子| 99re国产精品视频| 色呦呦呦在线观看视频| 另类一区| 国语人妻精彩刺激| 亚洲中文人妻色| 熟妇人妻一区二区 | 日韩精品在线视频在线观看| 91快色色色色色| 不卡一区二区日本视频| 人妻激情偷乱视三区频一区二区| 丰满人妻av一区二区三区| 欧美网站免费| 美女露胸露尿口| 97色论| 熟女高潮合集-永久久久-成人AV| 欧美 亚洲 91| AV女资源| 欧美精品精品一区二区| 亚洲AV无码翔田千里网站| 国人欧美精品一区二区| 大香蕉久久| 欧美中文字幕男人天堂久久精品| 亚洲国成人情色好看电影| 超碰色中文| A男人的天堂| 国产91丝袜 在线播放| 午夜精品久久久久久久久久蜜桃 | 日本精品九九九| 久久亚洲日韩熟女精品| 亚洲国产精品成人综合| 日韩成人性爱AV| 任你爽视频| 亚洲欧美九九九| 91欧美综合在线| 中国91AV| 国产成人亚洲精品无码古代早漏男| 精品一区二区成人| 久久久久骚| 亚洲污污网站| 91丨人妻丨国产丨丝袜| 亚洲成人无码影院| 久操99| 好吊爽好吊爽在线视频,中文字幕精品一区二区日本,国产良妇出轨视频在线观看, | 色九久| 亚洲字幕一区二区| 96AV精品| 欧美日韩人妻精品系列一区二区三区| 欧美精品成人在线播放| 欧美另类色图片| 少好三P| 国产辣妈在线视频福利| 色综合98| 日本色日夜干| 中文字幕av乱伦| 神马午夜久久久| 国产馆| 天天视频综合在线观看视频| 欧美日韩一干二干| 国产精品com| 欧美顶级黄片AAAAA在线免费看 | 国产操偷| 欧美精品 - 91爱爱| 男人天堂新在线| 搡老人老9丨女老熟人| 91色五月俺来也| 久久久人妻| www.色婷婷色综合| 国模91| 久久精品国产99精品亚洲蜜...| 口爆综合网| 91久久国产精品| 另类 日韩 熟女| 天天插夜夜爽| 久久国产性爱| 欧美亚洲厕所精品偷拍91| 成年人网站在线免费观看| 久久国产三区| 视频不卡中文字幕| 九九热免费国产视频婷婷伊人五月 | 野狼激情网| 78精品| 婷婷综合激情| 亚洲欧美97√| 亚洲熟妇极品| 欧美日韩中文字幕人妻| 精品久久久九九九孕妇| 加勒比海色香蕉婷婷| 五月天激情小说网| 97超碰久久| 男人天堂.AB| 日韩兔费看黄片| 日韩情色视频| 欧美自拍偷拍综合图片| 殴洲老熟女| 亚洲欧美自拍偷拍| 精品无码产区一区二| 久久久久国产一区二| 日韩精品人妻中文字幕不卡乱码| 99热精品在线观看| 97超碰人人模人人拍人人| WWW4虎| 91香蕉视频在线观看免费| 加勒比日本在线| 亚洲成a人片在线观看中文!!!| 999九九精品| 日韩黄色一区二区三区| 青青草一区二区高清无码视频| 理论久久婷婷网 8| xxxx网站亚洲精品| 97人人夜| baiduhicn.com。| 久久精品国产72国产精品福利| 亚洲色图 91| 无码91| 日本三级网页| 91老女人| 91成人亚洲色图| 亚洲精品97在线| 国产精品亚洲无码| 欧美国产婷婷久久| 亚洲无限观看| 亚州色图第三区| 精品毛片av一区二区| 中出20p| 中美日韩毛片| 国产精品久久久久久久久AV大片| 亚洲欧美人妻| 啊啊啊啊,啊啊好多水| 中文字幕老熟妇黄色视频| 亚川综合视频| 啊啊啊啊啊啊好多水| 少妇内射www在线观看视频| 国产 码在线成人网站| 亚洲欧洲无码bt精品合集| 97在线播放| 熟女色图在线| 综合日本女人伊人| 久操热| 99在线无码精品秘 入口黑人| 欧美性色网| 国产精品乱码久久久久久| 台湾佬中文娱乐自偷自拍| 国语av最新自产拍在线观看| 翔田千里爆乳巨臀无码| 97av在线观看| 久久久精品,3| 日本不卡一区二区三区| 色婷婷综合久久中文字幕雪峰 | 国产精品诱惑| 变态另类专区| 欧美第一页| 北京美女一区二区| 少妇毛片久久| 性爱动态120秒| 欧美一级黄片免费播放| 黄色小视频日本txt| 人人操,人人插| 东京热一区二区中文字幕| 蜜桃传媒视频第一区入口在线看| 欧美激情色婷婷花野真衣一区二区| 91久久精品国产| 婷婷91| 精品超碰国产| 91人妻Pr| 日本久久网| 久热久| 五月天婷婷基地| 国内毛片无码一级毛片| 97在线精品| 国产久久久久久久久一区二区| 亚洲欧综合另类无码一区| 中日亚韩免费视频| 一级aaaaa欧美中文字幕录像片| 欧美福利视频啊啊啊啊| 欧美黄色手机在线观看| 丰满人妻aA一区二区三区| 天天日天天干天天操| 啊啊啊网站| 高清无码人妻久久久一区二区三区aⅴ| 欧美在线亚洲| 日日爱99| 午夜无遮挡男女啪啪视频| 日韩激情毛片一级久久久| 亚洲图片激情综合另类| 欧美日韩国产黄色片| 黄骗免费| 色情综合| 久九九九九九九热| 一区二区三区成人 | 亚洲精品成人激情在线| 啊啊啊啊嗯嗯嗯用力好爽 | 好吊色一区| 97超碰色屌| 九九热在线精品视频| 亚洲综合夜色| juliaann欧美丝袜办公室| 中文乱码字幕观看| 乱伦色图网址是多少| 美女午夜福利免费视频| 99视频在线| 国产精品对白内射| 丰满人妻一区二区中文| 大香蕉日韩| 亚洲欧美国产中文视频| 日韩欧美俄罗斯A片| 五月天色综合| 久久久久久久久久黄色网| 亚洲一区制服诱惑| 久久久97| 日韩亚洲Av人人夜夜澡人人爽| 99热这里只有精| 超碰人妻久久人妻中文97| 麻豆区久久久久亚| 国产精品不卡高清在线观看| 午夜男人av| 欧日韩不卡视.频| 北条麻妃性愛视频| 国产农村妇女精品| 在线观看综合精品亚洲| 不卡九肏| 不卡二三区人妻少妇| 九九精品99| 少妇超碰在线| 久久久久久裸体| 天天看天天日天天操| 日日操丁香五月天| 亚洲色图欧美色图制服丝袜| 亚洲性高潮| 亚洲av综合色区无码一| 亚州成人a∨| 人妻娇喘 激情视频| 精品人妻一区二区视频| 欧美日韩国产中文精品字幕自在自线,| 久久精品国产久精国产| 强奸乱伦 亚洲一区| 国产无马av| 制服诱惑亚洲一区二区三区在线观看| 97香蕉网| 激情五月天色播| 中文字幕无码不卡啪啪| 最新三级网址| 物尤视频一区二区| 3PAV乱伦视频| 后X久久| 清纯唯美激情| 九九色图| 后入精品| 成人片在线播放| 91无摭挡| 在线人人人人人人精品超 | 综合伊人激情| 九一屌逼| 亚洲人妻日日日| 成人小电影网站tex| 亚洲成a人片在线观看中文!!!| 欧美 亚洲 大香| 91伊人| 五月丁香六月激情综合| 精品国产乱码久久久影院| 国产97视频| 国内精品伊人久久久久影院会| 国产成人AV麻豆| 亚洲人成网www| 国产精品美女久久久久久网站| 欧美色色色| 天天看夜夜看日日干| 99亚洲天堂| 久久久久女教师免费一区 | 一级日本牲交大片好爽在线看| 啊好大好舒服| 最新无码国产| 久久鲁夜| 婷婷中文网| 中文字幕免费在线观看| 亚洲丝袜二区| 青春草莓视频在线观看网址| 日比av无码| www.av家庭乱伦| 人妻一区二区三区视频| 欧美亚洲色图另类国产| 久jiu久神马影院| 欧美 亚洲 另类 综合| 少妇与黑人高潮在线| 久久久久免费少妇| 玖玖爱伊人玖玖爱| 色第一页| 新久久AV| 少妇99成人麻豆| 欧洲精品欧洲精品| 色激情综合网站| 香蕉综合网| 啊啊啊啊啊啊啊啊啊在线观看| 农村女一级毛卡片| 淫淫总合网| 最新AV在线| 激情六月婷婷| 亚洲综合网91| 日本久久精品| 噜噜噜噜久久久精品免费| www.色操逼| 久久久555| 色婷婷影视| 9丨久久九九九| 麻豆久久久一区二区| 亚洲se91| 人妻在线中出视频| 小日子操bb在线看| 久久久精品中文字幕麻豆| 精品中文字幕一区二区| 加勒比久久av| 欧美在线干| V A在线| 亚州男人的天堂| 日本护士高潮| 亚洲日韩电影| 999九九精品| 99色色网| 成全在线观看免费观看| 校园春色欧美| 又大又黄国产| 黑人精品成人一区二区三区| 欧洲人妻视频| 大香蕉男人的天堂| 欧美亚洲日韩人妻在线观看| 国产成人在线观看网址| 1.igao73.com 加入收藏 免费专区 国产精品 中文字幕 日韩精品 欧美精品 精彩 | 亚洲欧美97| 日韩无码专区| 人妻啪| 欧美色图99| 亚洲欧美另类少妇精品| 五月色网| 好涩综合| 亚洲 暴爽 AV人人爽日日碰| 欧美日韩操逼嗦吊| 刺激精品视频| 国产精品久久aV| 五月天开心网| 少妇色综合| 99蜜桃臀久久久欧美精品网站| 日han少妇无码| 色偷偷色偷偷欧美日韩| 色九九九综合| 大香蕉伊然在亚洲91| 伊人991| 伊人aaa| 欧美日动态视频| 久操操| 国产日产精品久久快鸭的功能介绍| 久久大黄片| 五月婷婷激情网| 我中文字幕6区 | 天天操人人操骚逼网站| 性欧美天天| 78p欧美| 91最新综合| 午夜欧美神马久久久久| 97色97好| 天天舔天天日天天射| 98福利在线视频| 亚洲**2021在线观看| 老外又粗又长一晚做五次| 91天美免费| 亚洲九九九九| 国语对白露脸XXXXXX| 秋霞免费无码视频日韩A片| 国产精品一区二区a| 亚洲免费成人在线高清无码视频| 一级成人性爱| 日韩一级成人毛片免费观看| 色情五月丁香| 99久久久无码| 91强在线播放| 欧美日韩另类激情图片| 麻豆国产精品午夜视频| 久操网视频| 成人资源中文字幕在线观看天天| 亚洲欧洲美腿丝袜| 精品乱码在线观看| 麻豆三极片| 亚洲 国产 精品一区| 97日本超碰综合| 欧美九一精品久久久熟妇| 密臀视频三区免费网站| 成年人三级黄色片视频| 欧美淫穴| 96久久久久久久| 亚洲日韩美国人妻| 91扒丝袜综合在线| 精品日韩产品在线,日韩在线不卡视频,欧美日韩免费专区/久, | 手机av天堂久久久久| 素颜老阿姨乱情色| 欧美中文字幕日韩在线| 久久精品国产精品亚洲艾通辽熟妇 | 欧美精品成人在线播放| 五月婷婷激情网| 国产又大又粗又长视频| 亚洲国产精品有声| 亚av顶级裸体一区二区三区四区五区| 玖玖久久久| 日本一级一级一级一级| 亚洲女人毛茸茸91| 在线观看黄色电话| 日韩97视频| 超碰成人国产| 天美传媒麻豆一区二区三区国产精| 新精精品久久精品| 亚熟hd视频在线| www.99热在线只有精品| 亚洲少妇色图自慰直播| 久日综合网| 欧美日韩妖精91com| 亚洲日本大香蕉1| 亚洲美女色图| 五月丁香啪啪| 又大又长又粗又爽又黄| 国内外毛片在线观看| 视频二区美腿丝袜制服人妻欧美 | 加勒比性爱成人在线| 蜜臀少妇一区二区| 逼逼逼逼操操操操操操操操操午夜剧场 | 精品999一区二区| 7777奇米影视久久| 欧美激情五月天| 美女让帅哥通她小鸡鸡| 中文字幕美女91| 99热精品在线在线| 欧美专区17页| 免费观看国产不卡av| 久jiu久神马影院| 国产精品丝袜在线| 留下AⅤ黄色片| 欧美日韩天堂| 青娱乐欧美激情一区二区| 久久精品欧美一区蜜桃| 熟妇人妻丰满久久久久久久无码| 久久香蕉综合一本到3atv| 欧美少妇性乱| 大香蕉www.超碰| 欧美色图天堂网m| 久久久九九九| 久久精品欧美一区蜜桃| 躁躁躁日日躁2020| 午夜人妻精品综合在线| 国产成人五月天丁香花| 九久9精品| 综合亚州欧美| 啊v视频在线观看| 欧亚 另类 久| 深爱五月婷婷| 婷婷激情四射| 黄色污污污污污污网站| 欧美色图色综合| 操人妻丝袜高跟| 国产又黄又粗又猛大片| 久久人妻四季| 欧美十八禁视频| 加勒比AV网| 被男人添B超爽视频| 9久久美女首页| 日韩图区 偷拍| 日日干夜夜欢| 亚洲成av人片色午夜乱码| 欧美日韩亚洲少妇寂寞影院正在播放| 激情综合婷婷| 91一区二匹| 免费农村成人少妇人妻Aa一区二区视频 | 欧美日韩狠狠爱| 亚洲图片欧美91N| a片在线播放| 99re这里| 国产亚洲综合欧美一区| 麻豆天美一区二区| 中文字幕日韩精品一区二区三区| 爽极品影院| 中出在线视频| AV中文在线可看| 国产男女边吃边摸视频网站| 欧美 亚洲 综合 制服 另类| 岛国精品视频在线观看| 超碰在线一区| 欧美亚洲日韩16色| 国内毛片无码一级毛片| 国产极品馒头逼| 青青草国产盗摄一二三区| 国产精品自拍欧美在线| 欧美翘臀视频网站一区二区三区| 嗯……啊…嗯嗯…啊…好舒服| 日韩操逼HD| 96国产精品| 性色高清在线| 秋霞曰韩R级| 国产精品精品系列在线观看| 色欧洲97| 伊人97色天使| 欧美黄色大香蕉一区二区| 精品一区二区三区国产| 操淫穴亚洲五月丁香 | 青娱乐啪啪视频| 欧美久久久| 欧州色图区| 综合久久六月久久婷婷| 99国产精品| 人妻少妇久久| 哈哈操电影AV| 超碰人人草| 成人麻豆av电影网站| 色九久| 亚洲人人夜夜澡人人爽| 日韩专区数据列表-第3230页-精品国产一区二区三区香蕉 久久99熟女人妻中文字 | 狠狠操一区二区| 九九久久精品| 嫩草影院在线观看精品| 欧美日韩在线视频网站| 91少妇高潮| 欧美论理片| 99999精品视频| 91综合在线| 国产精品蜜乳AV| 香伊人在线| 天天综合网网欲色| 亚洲区 欧美区| 91黑丝操| 欧美亚洲国产日本在线,久久精品国产| 爱爱动态120秒| 91粉嫩萝控精品福利网站_精品影音先锋国| 精品亚洲成人免费在线| 91成人无码| 熟女少妇一区二区三区| 97欧美久久久久久久| 天天看高清麻豆| 丝袜天堂| 啊啊啊啊二区好大| 日本日日色视频| 麻豆区99999| 亚洲精品久| 亚洲天堂综合AV| 九九伊人网| 五月婷久久| 激情专区综合| 日亚韩精品视频二区三| 激情综合网五月婷婷五月天| 免费公开人人操| 五月婷婷六月丁香网址| 国产乱伦亚洲色图高清无码| 偷拍精品一区二区三区| 色香欲影| 91狠狠综| 成年人网站在线免费观看| 综合网欧美| 中国一级αV| 日韩成人高清一区二区| 久久精品| 中文字幕黄片在线| 黄色操人| 在线a v| 99久久久er直播网址| 久久无码电影| 日韩精品一区的| 五月婷色| 99热这里只有精| 人妻在线中出视频| 蜜臀99999| 青青草久草AV| 尤物视频新赏网鲜网色诱网| 天天干人妻视频| 亚洲资源站| 欧美精品二区视频在线| 国内毛片国产欧美拍| 精品中文字幕第一页| 激情小说成人日本无码一| 色爱三区| 久久久久久午夜男人的天堂| 欧美另类色| 精品亚洲俞拍视频一区| 99re在线视频| 97在线视频免费看| 午夜精品久久一区二区| 国产精品蜜臀久久久久无码AV| 精品人妻av在线播放| 五月天激情影院| 无码欧美有限公司| 老女人老91妇女老热女| 亚州黄站| 麻豆视频国产一区二区| 久久av成人无码免费| 一起草AV| 欧美A√综合网 | 欧美三级偷拍| 欧美高清18A片| 欧美劲爆视频一区二区| 色色亚洲| 亚洲资源网| 欧美 亚洲| 亚洲一曲日韩精品| 先锋精品av色鲁| 久久香蕉超碰97国产精品| 欧美天天影院| 日韩精品色呦呦| 亚洲人妻av| 国产五码丝袜屁眼| 日韩猛交| 欧美性爱一级操| 抽查国产福利主播| 日本2020一区二区| 国产家庭乱伦性爱视频| 久久久久久人妻| 天天摸天天舔天天操| 欧美性暴力| A片 AV一级在线播放观看免费 | 欧美天天综合网| 亚洲无码久久久久久久| 欧美色图片91| 天天操妹子| 大香蕉久| 东北女人的毛片| 97精品一区二区三区免费| 欧美大香蕉专区网| 色爱欲亚洲| 中文 人妻 制服| 国产av美女被艹的乱叫| 久久久性爱视频| 国产美女高潮| 欧美性爱五月天| 97网址97| av网站在线观看了| 欧美熟女激情| av中亚| 9 9精品一区二区三区| 日本性一区| 久久综合国产精品国产| 91女网站| 亚洲动态色图| 丁香色婷婷| 骚货操死你| 深夜激情无码| 嗯嗯啊啊啊啊轻点视频| 九九精品99| 欧亚第一综合网| 亚洲最新Av| 91 丝袜在线| 日韩性爱长视频免费| 91亚洲人电影| 射综合网| 91oumei| 91美女小视频| 天堂精品在线| 亚洲 欧美 色图| 久热无码| 啊啊啊久久| 久久久久久久久久久六六| 欧美色图综合网| 久久久A∨| 97亚洲在线| 亚洲精品97在线| 立川理惠被中出无码| 99自拍B亚洲| 成人av性爱电影在线观看| 国产60区。| 97在线精品观看视频| 天天色怡春院| 黑人无码一区二区| 99精品无码| 五月丁香色婷婷| 黄页av| 怡红院怡春院| 人人看人人插| 综合av影片| 国产激情av女片自拍| av日韩中文字幕| 青青草日逼视频| 大香蕉视频一二三区| 91欧美另类| 性做久久久久久免费观看软件| 午夜福利 成人 91| 9久综合网| 亚欧毛片基地国产毛片基地| 亚洲人妖网| 亚洲色图殴美色图激情乱伦| 男人的天堂VA| 高潮内射在线| 亚洲国产尤物yw在线观看| 婷婷五月天色网| 久久极品一区二区| 国产一区二区在线播放量| 粉嫩久久久久| 99热超碰在线| 欧美大波激情xxxx| 男人的天堂无码| 精品一区二区三区蜜桃臀赵总 | 美女裸体无遮挡永久免费观看网站| 图色综合网| 免费操逼视频下载| 97干97色| 超碰69| 91色艳| 操操操日本的逼| 99re欧美| 熟女高潮合集-永久久久-成人AV| 91chinese在线| 亚洲?V无码专区在线电影| 亚洲狠狠入| 中文字幕-区二区三区四区视频中国| A 天堂在线观看视频| 五月婷亚洲精品天堂| 中文字幕诱惑制服人妻丝袜美丝袜美| 五月丁香影院| 干干干天天| 色综合一区二区三区| 午夜AV污污污| 九一综合精品视品av| 色噜噜人妻丝袜a∨先锋影| 国产精品美女视频诱惑| 99热线麻豆 | 大屁股国产在线视频| 天综合网| 黄片在线免费在线观看| 国产精品99精品视频网站| 男人的天堂com| 色眯眯av| 久久男人网| 亚洲有码 欧美精品| 黑人精品成人一区二区三区| 亚洲人体视频在线观看| 久九九九九九九九热| 一本久久精品中文字| 亚洲天堂女优在线| 欧美色色色| a级理论午夜日本| 精品国产91av一区二区三区 | 久久久久久久久久久六六| 高跟丝袜AV专区国产| 麻豆国产精品午夜视频| 一本久道久久综合狠狠爱一密臀精| 人妻熟女一区二区| 国产精品久久久777| 九久9热| 亚洲情色第一页| 色五月综合| 男女一级A片大黄,一进一出| 欧美日韩性爱无码| 麻花豆传媒剧国产MV出差| 亚洲乱码精品一区二区| 中出欧美| 熟妇人妻精品一区二区| 久草成人影片| 久久久久久少妇| 97bbn| 欧亚日韩三区| 亚洲熟女乱熟乱熟妇综合网二区| 一区久久久二区| 啊a一区在线| 久久大香蕉手机高清视频| 女优视频第10页| 国产原创自拍| 伊人成人中文字幕久久网| 色综合五月天| 色婷婷五月天| 欧美日不卡| 人妻夜夜爽天天爽麻豆三区网站| 麻豆天美电影一区二区| 2010男人的天堂| 夂久色| 日韩97超碰中文字幕| 美女尤物福利视频| 美女啊啊啊啊啊啊啊| ,国产乱人伦精品一区二区三区| 国产伦精品免编号公布| 最新加勒比丝袜在线| 91老司机在线视频免费观看| 久久9精品视频| 欧美精品双插| 秋霞鲁丝午夜无码一区二区三| 97热视频在线观看| 97亚洲自在精品在线观看| 蜜臀久久99精品久久久久久成人小说 |