精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

亚洲日本中文字幕免费在线不卡| 亚洲四区在线观看| 国产精品久久久久久久久粉嫩av| 国产熟女一区二区| 91精品国产自产观看在线 | 国产精品久久久久久久小唯西川| 一级免费在线观看| 国产精品久久久久一区二区三区厕所 | 日韩欧乱色一区二区三区在线| 亚洲女同ⅹxx女同tv| 精品欧美一区二区精品久久| 国产美女精品视频| 亚洲午夜精品久久久久久人妖| 国产原创av在线| 国产高清亚洲一区| 国产精品视频久| 国产无套在线观看| 我不卡影院28| 亚洲视频欧洲视频| 国产不卡一二三| 亚洲精品一区av| 欧美性精品220| 欧美亚洲色图视频| 亚洲成人三级| 国产视频一区二区在线| 国产精品污www一区二区三区| 伊人久久一区二区| 日本最新不卡在线| 久久不射热爱视频精品| 天堂在线中文视频| 中文字幕av一区二区三区人| 在线精品国精品国产尤物884a| 日韩视频免费播放| 在线观看av免费| 1000精品久久久久久久久| 欧洲精品久久| 美女做暖暖视频免费在线观看全部网址91| 国产成a人亚洲| 91久久精品国产| 毛片av免费在线观看| 特级西西人体4444xxxx| 24小时成人在线视频| 在线日韩国产精品| 能在线观看的av| 永久免费毛片在线播放| 亚洲国产毛片aaaaa无费看| 欧洲金发美女大战黑人| 超碰免费在线播放| 成人免费一区二区三区视频| 亚洲看片网站| 在线免费观看的av网站| 中文字幕不卡一区| 亚洲电影一二三区| 95在线视频| 亚洲欧洲日产国产综合网| 亚洲一区二区三区免费看| 1pondo在线播放免费| 欧美高清在线精品一区| 色综合久久88色综合天天提莫| 国产主播福利在线| 欧美国产丝袜视频| 亚洲在线色站| 成人国产免费电影| 亚洲精品ww久久久久久p站| 妞干网这里只有精品| av软件在线观看| 夜夜操天天操亚洲| 欧美 丝袜 自拍 制服 另类| 日韩精品美女| 日本道精品一区二区三区| 国产精品亚洲二区在线观看| 姬川优奈av一区二区在线电影| 欧美性生活久久| 拔插拔插华人永久免费| 欧美高清hd| 亚洲精品wwww| a资源在线观看| 91精品高清| 国内偷自视频区视频综合| 成人免费视频毛片| 免费观看成人鲁鲁鲁鲁鲁视频| 成人免费视频在线观看超级碰| 国产欧美日韩综合精品一区二区三区| 国产成人在线免费观看| 国产综合动作在线观看| 国产精品二线| 亚洲最新视频在线观看| 免费观看日韩毛片| 亚洲精品第一| 亚洲护士老师的毛茸茸最新章节| 一区二区三区久久久久| 亚洲精品va| 欧美最猛性xxxx| 一区二区三区黄| 99re这里只有精品6| 亚洲图片小说在线| 888av在线视频| 欧美色窝79yyyycom| 欧美图片自拍偷拍| 清纯唯美日韩| 国内精品小视频在线观看| 中国老头性行为xxxx| 成人一级黄色片| 日韩免费中文专区| av资源一区| 欧美久久久久免费| 不卡一区二区在线观看| 婷婷色综合网| 国产99在线|中文| 亚洲黄色a级片| 国产精品女上位| 国产特级黄色大片| 国产电影一区| 中文字幕在线精品| 4438国产精品一区二区| 国产99一区视频免费| 亚洲精品久久久久久一区二区| 黄毛片在线观看| 欧美一区二区三区在线观看| 女尊高h男高潮呻吟| 欧美成人日本| 国产精品欧美日韩一区二区| 天天插天天干天天操| 成人免费在线视频观看| 日本熟妇人妻中出| 日韩三级毛片| 久久久久久12| 国产成人av免费看| 中文字幕五月欧美| www午夜视频| 精品产国自在拍| 日本乱人伦a精品| 视频二区在线观看| 亚洲国产成人tv| 免费高清视频在线观看| 日韩毛片视频| 国产精品久久久久久久天堂 | 精品国产免费一区二区三区四区| 国产麻豆a毛片| 日韩福利电影在线| 日韩精品久久一区二区三区| 中文一区一区三区高中清不卡免费| 日韩精品一区二区三区视频| 91久久久久久久久久久久久久| 日本欧美一区二区三区乱码| 欧美一级日本a级v片| 三级在线观看视频| 亚洲精品中文字幕有码专区| 亚洲精品国产精品乱码| 99久久婷婷国产综合精品| 玩弄中年熟妇正在播放| 国产另类在线| 欧美在线视频一区| 国产系列在线观看| 欧美在线免费观看亚洲| 国产调教在线观看| 看片的网站亚洲| 亚洲欧美久久234| 欧美系列精品| 欧美成人免费一级人片100| 99视频国产精品免费观看a| 亚洲柠檬福利资源导航| 无套白嫩进入乌克兰美女| 午夜国产精品视频| 国产欧美日韩伦理| 亚洲少妇视频| 视频在线一区二区| 国产又爽又黄免费软件| 亚洲精品水蜜桃| 国产视频精品视频| 亚洲主播在线| 亚洲国产欧洲综合997久久 | 国产精品久久久久久久免费大片 | 国产精品久久久久久久久久小说| 久蕉在线视频| 欧美精品少妇一区二区三区| 中文字幕av免费在线观看| 成人高清视频免费观看| 午夜精品久久久内射近拍高清| 蜜桃精品wwwmitaows| 国产精品亚洲美女av网站| 老司机精品影院| 精品成人在线观看| 国产 日韩 欧美 在线| 欧美国产日产图区| 成年人性生活视频| 亚洲欧美日本视频在线观看| 日本精品一区二区三区高清 久久| 日本午夜免费一区二区| 欧美日韩xxx| 色视频在线观看| 宅男在线国产精品| 久久久久久久久久影院| 国产精品另类一区| 亚洲第一黄色网址| 精品一区二区三区视频在线观看| 精品成在人线av无码免费看| 九九热线有精品视频99| 日本一区二区三区四区视频| 一级日本在线| 日韩精品高清在线| 精品国产伦一区二区三| 日本高清无吗v一区| 麻豆影视在线播放| 国产精品乱码人人做人人爱 | 亚洲国产激情av| 亚洲成年人av| 久久av老司机精品网站导航| 337p粉嫩大胆噜噜噜鲁| 欧美不卡视频| 亚洲高清视频一区| 免费毛片在线不卡| 国产精品加勒比| 亚洲精品一区av| 国产精品夫妻激情| 色在线中文字幕| 久久琪琪电影院| 黄色一级片在线观看| 亚洲日本成人网| 香蕉视频911| 精品国产成人在线影院 | 亚洲黄色片网站| 国产a级免费视频| 欧美日韩久久久| 中文字幕日韩免费| 欧美午夜视频在线观看| 久久久久久免费观看| 亚洲人妖av一区二区| jizz18女人高潮| 久久精品在线观看| 在线免费观看成年人视频| 成人精品国产福利| 伊人av在线播放| 国产精品资源网| 91网址在线观看精品| 久久精品国产99久久6| 亚洲综合在线网站| 日韩国产欧美在线观看| 国产成人无码一二三区视频| 亚洲视频成人| av观看免费在线| 国产精品社区| 青青在线视频观看| 久久精品盗摄| 欧美黑人又粗又大又爽免费| 久久最新视频| 麻豆一区二区三区视频| 美女高潮久久久| 亚洲欧美日韩三级| 国产伦理精品不卡| 五月天丁香社区| 不卡的av电影在线观看| 亚洲高清无码久久| eeuss鲁片一区二区三区在线观看| 少妇被狂c下部羞羞漫画| av在线播放成人| 亚洲成人日韩在线| 国产亚洲综合在线| 成年人免费视频播放| 亚洲欧美怡红院| 麻豆亚洲av熟女国产一区二 | 丁香花在线影院观看在线播放| 亚洲先锋成人| 欧美 丝袜 自拍 制服 另类| 久久五月激情| 性欧美1819| 高清免费成人av| 久久人人妻人人人人妻性色av| 久久婷婷国产综合国色天香 | 天堂av电影在线观看| 亚洲色图激情小说| 午夜激情在线观看| 青青国产91久久久久久| 懂色aⅴ精品一区二区三区蜜月| 久久久久亚洲av成人片| 欧美日韩国产激情| 久久久久久久久久一级| 91精品国产麻豆| 少妇高潮一区二区三区99小说| 亚洲奶大毛多的老太婆| 日本高清中文字幕在线| 欧美激情18p| 日韩在线免费| 91九色在线观看| 久操成人av| 亚洲精品天堂成人片av在线播放 | 国产乱色精品成人免费视频| 精品国产污网站| 成年人视频在线看| 欧美精品做受xxx性少妇| 理论不卡电影大全神| 国产精品亚洲一区二区三区| 伊人久久亚洲| 日韩视频在线播放| 伊人影院久久| 一本色道久久亚洲综合精品蜜桃 | 国产喷水在线观看| 欧美性少妇18aaaa视频| 国产精品亚洲lv粉色| 国产丝袜高跟一区| 97超碰在线公开在线看免费| 国产成人精品视| 在线播放一区二区精品视频| 日韩精品久久久| 在线精品亚洲| 欧美国产在线一区| 国产欧美日韩综合| 国产精品99精品| 7777女厕盗摄久久久| 极品白浆推特女神在线观看 | 综合网五月天| 美女国产精品| chinese麻豆新拍video| 亚洲视频1区2区| 波多野结衣日韩| 亚洲精品福利视频| 超级碰碰不卡在线视频| 成人黄色av播放免费| 国产91精品对白在线播放| 国产自产在线视频| 国产福利一区二区三区视频 | 国产一区二区视频在线观看| 亚洲黄色录像| heyzo亚洲| 成人精品视频一区二区三区尤物| 秋霞欧美一区二区三区视频免费| 色女孩综合影院| 日韩电影在线观看完整版| 欧美劲爆第一页| 一区二区在线视频观看| 成人手机在线播放| 国精品**一区二区三区在线蜜桃 | 一区二区三区不卡视频在线观看| 中文字幕人妻一区二区在线视频| 精品无码久久久久久国产| 国产色婷婷在线| 鬼打鬼之黄金道士1992林正英| 亚洲国产一区二区在线观看| 婷婷六月天在线| 中文字幕不卡三区| 亚洲视频在线观看一区二区| 有码中文亚洲精品| 亚洲电影有码| 亚洲欧洲免费无码| 久久成人免费电影| 亚洲天堂网av在线| 91精品国产高清一区二区三区| 成人免费高清| 国产69精品久久久久9999apgf| 影院欧美亚洲| 97香蕉碰碰人妻国产欧美| 黄网站色欧美视频| 欧洲av在线播放| 日本精品在线视频| 欧美中文一区二区| 在线观看岛国av| 成人欧美一区二区三区视频网页 | 伊人青青综合网站| 国外成人福利视频| 亚洲欧洲日夜超级视频| 久久99精品久久久久久动态图| 青青操在线视频观看| 日韩一级视频免费观看在线| 欧美人体视频xxxxx| 精品国产乱码久久久久久88av | 99久久亚洲精品蜜臀| 手机在线视频一区| 亚洲成人你懂的| 欧美少妇另类| 成人免费直播live| 亚洲性图久久| 欧美偷拍一区二区三区| 欧美日韩国产首页在线观看| 在线电影福利片| 欧美精品一区三区在线观看| 蜜臀av一区二区在线观看| 免费在线观看h片| 亚洲国产另类 国产精品国产免费| 免费观看亚洲| 伊人久久99| 99精品视频在线免费观看| 亚洲精品久久久久久久蜜桃| 菠萝蜜影院一区二区免费| а√中文在线天堂精品| 国产精品亚洲αv天堂无码| 最新国产精品久久精品| 人妻va精品va欧美va| 国产精品爱久久久久久久| 亚洲澳门在线| 扒开jk护士狂揉免费| 欧美一区欧美二区| 日韩影片中文字幕| 91网站在线观看免费| 国产网站一区二区| 草逼视频免费看| 国产大片精品免费永久看nba| 在线观看国产精品入口| 手机av免费看| 日韩欧美国产综合一区| 99只有精品|