精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

120 行代碼實現純 Web 剪輯視頻

開發 前端
WebAssembly(wasm)就是一個可移植、體積小、加載快并且兼容 Web 的全新格式。可以將 C,C++等語言編寫的模塊通過編譯器來創建 wasm 格式的文件,此模塊通過二進制的方式發給瀏覽器,然后 js 可以通過 wasm 調用其中的方法功能。

[[422785]]

本文轉載自微信公眾號「微醫大前端技術」,作者翁佳瑞 。轉載本文請聯系微醫大前端技術公眾號。

前言

前幾天偶爾看到一篇 webassembly 的相關文章,對這個技術還是挺感興趣的,在了解一些相關知識的基礎上,看下自己能否小小的實踐下。

什么是 webasembly?

WebAssembly(wasm)就是一個可移植、體積小、加載快并且兼容 Web 的全新格式。可以將 C,C++等語言編寫的模塊通過編譯器來創建 wasm 格式的文件,此模塊通過二進制的方式發給瀏覽器,然后 js 可以通過 wasm 調用其中的方法功能。

WebAssembly 的優勢

網上對于這個相關的介紹應該有很多了,WebAssembly 優勢性能好,運行速度遠高于 Js,對于需要高計算量、對性能要求高的應用場景如圖像/視頻解碼、圖像處理、3D/WebVR/AR 等,優勢非常明顯,們可以將現有的用 C、C++等語言編寫的庫直接編譯成 WebAssembly 運行到瀏覽器上,并且可以作為庫被 JavaScript 引用。那就意味著我們可以將很多后端的工作轉移到前端,減輕服務器的壓力。

WebAssembly 最簡單的實踐調用

我們編寫一個最簡單的 c 文件

  1. int add(int a,int b) { 
  2.   return a + b; 

然后安裝對于的 Emscripten 編譯器Emscripten 安裝指南

  1. emcc test.c -Os -s WASM=1 -s SIDE_MODULE=1 -o test.wasm 

然后我們在 html 中引入使用即可

  1. fetch('./test.wasm').then(response => 
  2.   response.arrayBuffer() 
  3. ).then(bytes => 
  4.   WebAssembly.instantiate(bytes) 
  5. ).then(results => { 
  6.   const add = results.instance.exports.add 
  7.   console.log(add(11,33)) 
  8. }); 

這時我們即可在控制臺看到對應的打印日志,成功調用我們編譯的代碼啦

正式開動

既然我們已經知道如何能快速的調用到一些已經成熟的 C,C++的類庫,那我們離在線剪輯視頻預期目標更進一步了。

最終 demo 演示

由于錄制操作的電腦 cpu 不太行,所以可能耗時比較久,但整體的效果還是能看的到滴

demo 倉庫地址(https://github.com/Dseekers/clip-video-by-webassembly)

FFmpeg

在這個之前你得稍微的了解下啥是 FFmpeg? 以下根據維基百科的目錄解釋:

FFmpeg 是一個開放源代碼的自由軟件,可以運行音頻和視頻多種格式的錄影、轉換、流功能[1],包含了 libavcodec——這是一個用于多個項目中音頻和視頻的解碼器庫,以及 libavformat——一個音頻與視頻格式轉換庫。

簡單的說這個就是由 C 語言編寫的視頻處理軟件,它的用法也是相當滴簡單

我主要將這次需要用到的命令給調了出來,如果你還可能用到別的命令,可以根據他的官方文檔查看 ,還可以了解下阮一峰大佬的文章 (https://www.ruanyifeng.com/blog/2020/01/ffmpeg.html)

  1. ffmpeg -ss [start] -i [input] -to [end] -c copy [output

start 為開始時間 end 為結束時間 input 為需要操作的視頻源文件 output 為輸出文件的位置名稱

這一行代碼就是我們需要用到的剪輯視頻的命令了

獲取相關的FFmpeg的wasm

由于通過 Emscripten 編譯 ffmpeg 成 wasm 存在較多的環境問題,所以我們這次直接使用在線已經編譯好的 CDN 資源

這邊就直接使用了這個比較成熟的庫 https://github.com/ffmpegwasm/ffmpeg.wasm

為了本地調試方便,我把其相關的資源都下了下來 一共 4 個資源文件

  1. ffmpeg.min.js 
  2. ffmpeg-core.js 
  3. ffmpeg-core.wasm 
  4. ffmpeg-core.worker.js 

我們使用的時候只需引入第一個文件即可,其它文件會在調用時通過 fetch 方式去拉取資源

最小的功能實現

前置功能實現: 在我們本地需要實現一個 node 服務,因為使用 ffmpeg 這個模塊會出現如果沒在服務器端設置響應頭, 會報錯 SharedArrayBuffer is not defined,這個是因為系統的安全漏洞,瀏覽器默認禁用了該 api,若要啟用則需要在 header 頭上設置

  1. Cross-Origin-Opener-Policy: same-origin 
  2. Cross-Origin-Embedder-Policy: require-corp 

我們啟動一個簡易的 node 服務

  1. const Koa = require('koa'); 
  2. const path = require('path'
  3. const fs = require('fs'
  4. const router = require('koa-router')(); 
  5. const static = require('koa-static'
  6. const staticPath = './static' 
  7. const app = new Koa(); 
  8. app.use(static
  9.     path.join(__dirname, staticPath) 
  10. )) 
  11. // log request URL: 
  12. app.use(async (ctx, next) => { 
  13.     console.log(`Process ${ctx.request.method} ${ctx.request.url}...`); 
  14.     ctx.set('Cross-Origin-Opener-Policy''same-origin'
  15.     ctx.set('Cross-Origin-Embedder-Policy''require-corp'
  16.     await next(); 
  17. }); 
  18.  
  19. router.get('/', async (ctx, next) => { 
  20.     ctx.response.body = '<h1>Index</h1>'
  21. }); 
  22. router.get('/:filename', async (ctx, next) => { 
  23.     console.log(ctx.request.url) 
  24.     const filePath = path.join(__dirname, ctx.request.url); 
  25.     console.log(filePath) 
  26.     const htmlContent = fs.readFileSync(filePath); 
  27.     ctx.type = "html"
  28.     ctx.body = htmlContent; 
  29. }); 
  30. app.use(router.routes()); 
  31. app.listen(3000); 
  32. console.log('app started at port 3000...'); 

我們做一個最小化的 demo 來實現下這個剪輯功能,剪輯視頻的前一秒鐘 新建一個 demo.html 文件,引入相關資源

  1. <script src="https://cdn.jsdelivr.net/npm/jquery@3.6.0/dist/jquery.min.js"></script> 
  2. <script src="./assets/ffmpeg.min.js"></script> 
  3.  
  4. <div class="container"
  5.   <div class="operate"
  6.     選擇原始視頻文件: 
  7.     <input type="file" id="select_origin_file"
  8.     <button id="start_clip">開始剪輯視頻</button> 
  9.   </div> 
  10.   <div class="video-container"
  11.     <div class="label">原視頻</div> 
  12.     <video class="my-video" id="origin-video" controls></video> 
  13.   </div> 
  14.   <div class="video-container"
  15.     <div class="label">處理后的視頻</div> 
  16.     <video class="my-video" id="handle-video" controls></video> 
  17.   </div> 
  18. </div> 
  1. let originFile 
  2. $(document).ready(function () { 
  3.   $('#select_origin_file').on('change', (e) => { 
  4.     const file = e.target.files[0] 
  5.     originFile = file 
  6.     const url = window.webkitURL.createObjectURL(file) 
  7.     $('#origin-video').attr('src', url) 
  8.   }) 
  9.   $('#start_clip').on('click', async function () { 
  10.     const { fetchFile, createFFmpeg } = FFmpeg; 
  11.     ffmpeg = createFFmpeg({ 
  12.       log: true
  13.       corePath: './assets/ffmpeg-core.js'
  14.     }); 
  15.     const file = originFile 
  16.     const { name } = file; 
  17.     if (!ffmpeg.isLoaded()) { 
  18.       await ffmpeg.load(); 
  19.     } 
  20.     ffmpeg.FS('writeFile'name, await fetchFile(file)); 
  21.     await ffmpeg.run('-i'name'-ss''00:00:00''-to''00:00:01''output.mp4'); 
  22.     const data = ffmpeg.FS('readFile''output.mp4'); 
  23.     const tempURL = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' })); 
  24.     $('#handle-video').attr('src', tempURL) 
  25.   }) 
  26. }); 

其代碼的含義也是相當簡單,通過引入的 FFmpeg 去創建一個實例,然后通過 ffmpeg.load()方法去加載對應的 wasm 和 worker 資源 沒有進行優化的 wasm 的資源是相當滴大,本地文件竟有 23MB,這個若是需要投入生產的可是必須通過 emcc 調節打包參數的方式去掉無用模塊。然后通 fetchFile 方法將選中的 input file 加載到內存中去,接下來就可以通過 ffmpeg.run 運行和 本地命令行一樣的 ffmpeg 命令行參數了參數基本一致。

這時我們的核心功能已經實現完畢了。

做一點小小的優化

剪輯的話最好是可以選擇時間段,我這為了方便直接把 element 的以 cdn 方式引入使用 通過 slider 來截取視頻區間,我這邊就只貼 js 相關的代碼了,具體代碼可以去 github 倉庫里面仔細看下:

  1. class ClipVideo { 
  2.     constructor() { 
  3.         this.ffmpeg = null 
  4.         this.originFile = null 
  5.         this.handleFile = null 
  6.         this.vueInstance = null 
  7.         this.currentSliderValue = [0, 0] 
  8.         this.init() 
  9.     } 
  10.     init() { 
  11.         console.log('init'
  12.         this.initFfmpeg() 
  13.         this.bindSelectOriginFile() 
  14.         this.bindOriginVideoLoad() 
  15.         this.bindClipBtn() 
  16.         this.initVueSlider() 
  17.     } 
  18.     initVueSlider(maxSliderValue = 100) { 
  19.         console.log(`maxSliderValue ${maxSliderValue}`) 
  20.         if (!this.vueInstance) { 
  21.             const _this = this 
  22.             const Main = { 
  23.                 data() { 
  24.                     return { 
  25.                         value: [0, 0], 
  26.                         maxSliderValue: maxSliderValue 
  27.                     } 
  28.                 }, 
  29.                 watch: { 
  30.                     value() { 
  31.                         _this.currentSliderValue = this.value 
  32.                     } 
  33.                 }, 
  34.                 methods: { 
  35.                     formatTooltip(val) { 
  36.                         return _this.transformSecondToVideoFormat(val); 
  37.                     } 
  38.                 } 
  39.             } 
  40.             const Ctor = Vue.extend(Main) 
  41.             this.vueInstance = new Ctor().$mount('#app'
  42.         } else { 
  43.             this.vueInstance.maxSliderValue = maxSliderValue 
  44.             this.vueInstance.value = [0, 0] 
  45.         } 
  46.     } 
  47.     transformSecondToVideoFormat(value = 0) { 
  48.         const totalSecond = Number(value) 
  49.         let hours = Math.floor(totalSecond / (60 * 60)) 
  50.         let minutes = Math.floor(totalSecond / 60) % 60 
  51.         let second = totalSecond % 60 
  52.         let hoursText = '' 
  53.         let minutesText = '' 
  54.         let secondText = '' 
  55.         if (hours < 10) { 
  56.             hoursText = `0${hours}` 
  57.         } else { 
  58.             hoursText = `${hours}` 
  59.         } 
  60.         if (minutes < 10) { 
  61.             minutesText = `0${minutes}` 
  62.         } else { 
  63.             minutesText = `${minutes}` 
  64.         } 
  65.         if (second < 10) { 
  66.             secondText = `0${second}` 
  67.         } else { 
  68.             secondText = `${second}` 
  69.         } 
  70.         return `${hoursText}:${minutesText}:${secondText}` 
  71.     } 
  72.     initFfmpeg() { 
  73.         const { createFFmpeg } = FFmpeg; 
  74.         this.ffmpeg = createFFmpeg({ 
  75.             log: true
  76.             corePath: './assets/ffmpeg-core.js'
  77.         }); 
  78.     } 
  79.     bindSelectOriginFile() { 
  80.         $('#select_origin_file').on('change', (e) => { 
  81.             const file = e.target.files[0] 
  82.             this.originFile = file 
  83.             const url = window.webkitURL.createObjectURL(file) 
  84.             $('#origin-video').attr('src', url) 
  85.  
  86.         }) 
  87.     } 
  88.     bindOriginVideoLoad() { 
  89.         $('#origin-video').on('loadedmetadata', (e) => { 
  90.             const duration = Math.floor(e.target.duration) 
  91.             this.initVueSlider(duration) 
  92.         }) 
  93.     } 
  94.     bindClipBtn() { 
  95.         $('#start_clip').on('click', () => { 
  96.             console.log('start clip'
  97.             this.clipFile(this.originFile) 
  98.         }) 
  99.     } 
  100.     async clipFile(file) { 
  101.         const { ffmpeg, currentSliderValue } = this 
  102.         const { fetchFile } = FFmpeg; 
  103.         const { name } = file; 
  104.         const startTime = this.transformSecondToVideoFormat(currentSliderValue[0]) 
  105.         const endTime = this.transformSecondToVideoFormat(currentSliderValue[1]) 
  106.         console.log('clipRange', startTime, endTime) 
  107.         if (!ffmpeg.isLoaded()) { 
  108.             await ffmpeg.load(); 
  109.         } 
  110.         ffmpeg.FS('writeFile'name, await fetchFile(file)); 
  111.         await ffmpeg.run('-i'name'-ss', startTime, '-to', endTime, 'output.mp4'); 
  112.         const data = ffmpeg.FS('readFile''output.mp4'); 
  113.         const tempURL = URL.createObjectURL(new Blob([data.buffer], { type: 'video/mp4' })); 
  114.         $('#handle-video').attr('src', tempURL) 
  115.     } 
  116. $(document).ready(function () { 
  117.     const instance = new ClipVideo() 
  118. }); 

這樣文章開頭的效果就這樣實現啦

小結

webassbembly 還是比較新的一項技術,我這邊只是應用了其中一小部分功能,值得我們探索的地方還有很多,歡迎大家多多交流哈

參考資料

WebAssembly 完全入門——了解 wasm 的前世今生

(https://juejin.cn/post/6844903709806182413)

使用 FFmpeg 與 WebAssembly 實現純前端視頻截幀 (https://toutiao.io/posts/7as4kva/preview) 

前端視頻幀提取 ffmpeg + Webassembly (https://juejin.cn/post/6854573219454844935)

 

責任編輯:武曉燕 來源: 微醫大前端技術
相關推薦

2021-06-15 07:20:47

Webpack 機制HMR

2019-06-05 15:00:28

Java代碼區塊鏈

2017-02-24 12:00:35

iOS代碼AutoLayout

2020-02-19 15:02:23

代碼開發工具

2019-12-23 09:27:43

Python短視頻視頻

2019-11-18 10:14:19

AI 數據人工智能

2021-07-20 09:45:58

PythonEV短視頻

2022-01-21 09:31:37

PythonLinux視頻

2018-01-23 09:17:22

Python人臉識別

2020-12-17 08:06:33

CSS 日歷界面

2022-03-26 22:28:06

加密通信Python

2022-04-09 09:11:33

Python

2018-11-09 15:47:07

剪輯工具

2018-06-06 16:17:41

視頻剪輯

2020-03-04 09:35:55

開源技術 軟件

2021-09-09 05:57:57

JS模塊打包器前端

2020-08-19 10:30:25

代碼Python多線程

2022-02-08 12:30:30

React事件系統React事件系統

2021-12-16 06:21:16

React組件前端

2014-06-19 10:02:32

Haskell代碼
點贊
收藏

51CTO技術棧公眾號

精品成人在线| 亚洲都市激情| 一区二区三区毛片| 精品久久一区二区三区蜜桃| 伊人久久久久久久久久久久| 色综合咪咪久久网| 欧美精品一区二区三区视频| 无码人妻丰满熟妇区毛片| 欧美另类极品| 99久久99久久久精品齐齐| 国产精品福利网站| 激情综合网五月天| 国产乱码精品一区二区亚洲| 91精品午夜视频| 国产欧美在线一区| www在线观看播放免费视频日本| 懂色av一区二区三区免费观看| 国产精品吹潮在线观看| 精品无码久久久久| 久久精品国产大片免费观看| 日韩av在线导航| 91香蕉国产线在线观看| 亚洲成人看片| 亚洲成人免费视频| 在线码字幕一区| 国产最新视频在线| 成人av电影免费在线播放| 国产日韩欧美在线| 中文字幕精品无码一区二区| 欧美另类亚洲| 中文字幕日本精品| 国产全是老熟女太爽了| 国产精品1luya在线播放| 在线播放日韩导航| 五月婷婷之综合激情| 亚洲涩涩在线| 亚洲aaa精品| 伊人再见免费在线观看高清版 | 亚洲国产精品成人无久久精品| 日韩欧美中文| 国产一区二区三区在线视频| 国产精品无码电影| 国产成人夜色高潮福利影视| 欧美一级夜夜爽| 久国产精品视频| 国产日本久久| 欧美少妇xxx| 日本va中文字幕| 中文不卡1区2区3区| 香蕉成人伊视频在线观看| 奇米777四色影视在线看| 激情影院在线观看| ...xxx性欧美| 宅男av一区二区三区| 99视频在线观看地址| 国产情人综合久久777777| 欧美重口乱码一区二区| 完全免费av在线播放| 91免费小视频| 久久波多野结衣| 天堂av在线免费观看| av不卡在线播放| 久久精品日产第一区二区三区乱码| 天堂av中文字幕| 91丝袜美腿高跟国产极品老师| 国产乱码精品一区二区三区不卡| 成人爽a毛片一区二区| 国产99久久久国产精品| 国产伦一区二区三区色一情| 天堂中文在线资源| 久久嫩草精品久久久精品一| 日本一区不卡| 午夜免费播放观看在线视频| 亚洲天堂精品视频| www.男人天堂网| 高潮在线视频| 91高清视频在线| 亚洲欧美手机在线| 91精品久久久久久综合五月天| 亚洲第一精品自拍| av在线网站观看| 日韩国产欧美一区二区| 欧美精品日韩三级| av大片免费观看| 美女一区二区三区| 成人精品水蜜桃| 青青操视频在线| 国产精品进线69影院| 日本aa在线观看| 中文字幕乱码在线播放| 欧美精品一二三四| av网页在线观看| 精品国产一区二区三区av片| 插插插亚洲综合网| 日韩xxxxxxxxx| 美女脱光内衣内裤视频久久影院| 91在线观看免费高清完整版在线观看 | 综合久久综合| 欧美一级片一区| 在线免费看av的网站| 国产ts人妖一区二区| 欧美亚洲免费在线| 日韩精品亚洲人成在线观看| 欧美视频在线免费| 欧美高清精品一区二区| 免费成人结看片| 欧美成人免费网| 成人公开免费视频| 国产成人av电影在线| 日韩av电影免费观看| 丰乳肥臀在线| 欧美男男青年gay1069videost| 中文在线观看免费视频| 91日韩欧美| 浅井舞香一区二区| 丰满人妻一区二区三区免费视频 | 精品国产一区二区三区四区四| 国产三级av在线播放| 欧美网站在线| 91精品久久久久久久久久久| 偷拍25位美女撒尿视频在线观看| 国产精品进线69影院| 亚洲人成无码www久久久| av男人一区| 精品久久国产精品| 性高潮视频在线观看| 91麻豆国产自产在线观看| 大片在线观看网站免费收看| 日日夜夜精品| 国产一区二区久久精品| 久久亚洲精品国产| 成人午夜精品在线| 欧美日韩午夜爽爽| 精品一区二区三区免费看| 国产一区二区动漫| 午夜久久久久久久久久影院| 99精品欧美一区| 黄色一级片在线看| 97久久亚洲| 欧美日本啪啪无遮挡网站| 91丨九色丨丰满| 国产欧美日韩亚州综合 | 欧美成人h版| 日韩精品在线免费观看| 日本少妇xxxx动漫| www.亚洲免费av| 久久精品xxx| 久久精品色综合| 91成人福利在线| 天堂视频中文在线| 色综合久久综合| 亚洲AV无码国产成人久久| 久久高清国产| 视频一区亚洲 | 欧美日韩一区二区三区高清| 国产sm调教视频| 三级成人在线视频| 日韩精彩视频| 国产精品亲子伦av一区二区三区| 伊人久久综合97精品| 中文字幕 人妻熟女| 中文字幕一区二区日韩精品绯色| 少妇一级淫免费播放| 水蜜桃久久夜色精品一区| 91久久久久久国产精品| 国产91在线视频蝌蚪| 欧美成人伊人久久综合网| 久久综合成人网| 99视频有精品| 国产三级日本三级在线播放| 波多野结衣在线观看一区二区| 国产精品久在线观看| 免费大片黄在线| 精品免费国产一区二区三区四区| 国产成人精品a视频一区| 久久蜜桃一区二区| 亚洲精品久久久久久宅男| 亚洲a一区二区三区| 国产精品三区在线| 欧美aaa视频| 毛片精品免费在线观看| 香港一级纯黄大片| 欧美无人高清视频在线观看| 久久免费看少妇高潮v片特黄| 波多野结衣一区二区三区| 超碰影院在线观看| 亚洲乱码精品| 女人一区二区三区| 亚洲精品tv| 26uuu国产精品视频| 日本最新在线视频| 亚洲国产精品悠悠久久琪琪| 欧美一级做a爰片免费视频| 亚洲欧美激情在线| 黄色短视频在线观看| 久久国产综合精品| 精品这里只有精品| 91超碰国产精品| 欧美日本韩国在线| 麻豆精品在线| 国产成人精品999| 国产网红在线观看| 色系列之999| 肉丝一区二区| 日韩美女天天操| 中文区中文字幕免费看| 亚洲3atv精品一区二区三区| 青青青视频在线免费观看| 成人av免费在线观看| 日韩一级免费片| 亚洲一区欧美激情| 乱熟女高潮一区二区在线| 日韩欧美高清在线播放| 国产欧美在线一区二区| 国产精区一区二区| 国产精品国语对白| 中国字幕a在线看韩国电影| 欧美放荡办公室videos4k| 免费黄色在线网站| 国产一区二区日韩| 青青草视频在线观看| 精品剧情在线观看| 国产强伦人妻毛片| 欧美日韩在线综合| 91黑人精品一区二区三区| 五月婷婷久久丁香| 久久这里只有精品国产| 亚洲日本丝袜连裤袜办公室| xxxx日本黄色| 久久久综合九色合综国产精品| xxxxwww一片| 国产一区二区三区免费看 | 成人免费黄色在线| 尤物网站在线看| 老司机一区二区| 成人中文字幕av| 毛片一区二区| 人妻夜夜添夜夜无码av | 久草精品在线播放| 国产一区二区精品| 少妇av一区二区三区无码| 一区视频在线看| 黄页网站在线观看视频| 在线精品亚洲| 女人喷潮完整视频| 国产日韩综合| 免费在线观看毛片网站| 久久一区亚洲| 欧美三级午夜理伦三级| 久久国产主播| 在线视频日韩一区| 免费的国产精品| 午夜宅男在线视频| 精品一区在线看| 午夜激情影院在线观看| 国产在线视频一区二区三区| 在线观看日本www| 国产91色综合久久免费分享| 免费看的av网站| 成人精品国产一区二区4080| 国产精品果冻传媒| 99精品久久只有精品| 国产精品无码网站| 欧美激情一区三区| 日本黄色录像视频| 一级做a爱片久久| 日韩久久久久久久久| 狠狠久久五月精品中文字幕| 无码人妻丰满熟妇区五十路 | 国精一区二区| 亚洲精品高清国产一线久久| 91精品国偷自产在线电影 | 久久成人亚洲| 亚洲怡红院在线| 国产a视频精品免费观看| 在线精品一区二区三区| 久久精品免费在线观看| 亚洲AV成人无码精电影在线| 一区二区三区精品在线观看| www成人在线| 精品视频免费在线| 欧美 日韩 国产 精品| 亚洲女在线观看| 免费**毛片在线| 69国产精品成人在线播放| 狠狠久久伊人中文字幕| 国产精品18毛片一区二区| 亚洲欧美成人vr| 午夜啪啪福利视频| 国产精品最新自拍| 超碰超碰在线观看| 99re成人精品视频| 小向美奈子av| 色哟哟精品一区| av免费观看网址| 亚洲视频专区在线| 波多野结衣在线播放| 国产精品美女免费看| 白嫩白嫩国产精品| 亚洲精品免费在线看| 99精品国产福利在线观看免费| 亚洲这里只有精品| av爱爱亚洲一区| 日韩高清dvd碟片| 一本到高清视频免费精品| 亚洲成熟女性毛茸茸| 中文字幕精品www乱入免费视频| 黄色污污视频在线观看| 国产主播精品在线| 国产精品密蕾丝视频下载| 大陆极品少妇内射aaaaaa| 青青草97国产精品免费观看| 亚洲精品久久一区二区三区777| 国产精品久久毛片| 欧美日韩综合一区二区三区| 欧美成人精品1314www| 免费大片黄在线| 国产精品久久久久久久久久| 色天下一区二区三区| 男女激情免费视频| 国产精品一区一区| 香蕉成人在线视频| 91国偷自产一区二区开放时间| 四虎电影院在线观看| 欧美精品久久久久| 亚洲日本视频在线| 一区二区三区四区免费观看| 麻豆精品在线播放| jizz18女人高潮| 欧洲一区二区av| 久热av在线| 国产不卡视频在线| 综合国产视频| 国产精品亚洲a| 2欧美一区二区三区在线观看视频 337p粉嫩大胆噜噜噜噜噜91av | 亚洲精品高潮| 做爰高潮hd色即是空| 极品销魂美女一区二区三区| 在线免费看视频| 欧美日韩在线三级| 99免在线观看免费视频高清| 国产福利成人在线| 欧洲激情综合| www.com黄色片| 中文字幕一区二区三区在线观看 | 狼人综合视频| 国模一区二区三区私拍视频| 亚洲二区精品| 欧美在线一级片| 狠狠躁夜夜躁人人爽天天天天97| 色综合免费视频| 欧美亚洲国产视频| 国产探花一区| 欧美在线aaa| 成人免费在线播放视频| 国产丝袜视频在线观看| 九九九久久国产免费| 国产精品天天看天天狠| 妞干网在线观看视频| 91麻豆国产精品久久| 最近日韩免费视频| 日韩在线视频网| 日韩欧洲国产| 美女日批免费视频| 欧美激情一区二区三区四区| 一区二区不卡视频在线观看| 欧美精品日韩三级| 性欧美lx╳lx╳| 在线免费av播放| 亚洲精品自拍动漫在线| 蜜臀av中文字幕| 欧美在线一级va免费观看| 国产欧美一区| 在线观看日本www| 五月天欧美精品| eeuss影院www在线观看| 91久久精品日日躁夜夜躁国产| 99亚洲视频| 国产日韩精品中文字无码| 欧美tk—视频vk| 欧美电影h版| 国产人妻互换一区二区| 99久久99精品久久久久久| 亚洲天堂中文在线| 色综合男人天堂| 国产精品探花在线观看| 亚洲国产欧美日韩在线| 欧美日韩午夜剧场| 麻豆视频免费在线观看| 国产伦精品一区二区三区视频孕妇 | 激情小说一区| 午夜两性免费视频| 香蕉久久一区二区不卡无毒影院 | 国产高清在线观看视频| 日本国产一区二区三区| 亚洲精品小说| 国产真实乱人偷精品人妻| 日韩美女一区二区三区| 国产欧美自拍| 欧美极品欧美精品欧美图片|