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

鴻蒙開源第三方組件-VideoCache視頻緩存組件

開源
文章由鴻蒙社區(qū)產(chǎn)出,想要了解更多內(nèi)容請(qǐng)前往:51CTO和華為官方戰(zhàn)略合作共建的鴻蒙技術(shù)社區(qū)https://harmonyos.51cto.com

[[389195]]

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 前言

基于安卓平臺(tái)的視頻緩存組件VideoCache( https://github.com/danikula/AndroidVideoCache),實(shí)現(xiàn)了鴻蒙化遷移和重構(gòu),代碼已經(jīng)開源到(https://gitee.com/isrc_ohos/android-video-cache_ohos),歡迎各位下載使用并提出寶貴意見!

背景

用戶在網(wǎng)速波動(dòng)較大的環(huán)境下瀏覽視頻時(shí),經(jīng)常會(huì)遇到由于網(wǎng)速較慢引起的持續(xù)加載或播放失敗的情況。VideoCache組件實(shí)現(xiàn)了視頻緩存功能,播放視頻的同時(shí),對(duì)視頻源進(jìn)行緩存。出現(xiàn)網(wǎng)速較慢的情況時(shí),手機(jī)讀取提前緩存好的視頻數(shù)據(jù),可以保證視頻的正常播放,給予用戶更流暢的觀看體驗(yàn)。

組件效果圖展示

1、主菜單界面: 視頻播放

安裝軟件后,只需要在鴻蒙設(shè)備上單擊HarmonyVideoCache軟件圖標(biāo),打開軟件即可進(jìn)入主菜單界面,進(jìn)入主菜單界面后會(huì)自動(dòng)開始播放視頻,如下圖所示。

圖 1 視頻播放的主菜單界面

2、驗(yàn)證緩存

等待視頻播放完成后,可以手動(dòng)關(guān)閉手機(jī)的數(shù)據(jù)連接和WIFI連接。

圖 2 關(guān)閉網(wǎng)絡(luò)連接

在關(guān)閉了網(wǎng)絡(luò)連接之后,回到VideoCache應(yīng)用中,點(diǎn)擊播放按鈕, 會(huì)發(fā)現(xiàn)視頻是可以通過本地緩存重新播放的。注意到圖1和圖3的區(qū)別,在圖1中任務(wù)欄可以看到有WIFI連接顯示,圖3 中沒有WIFI連接。

圖 3 緩存播放視頻

Sample解析

如圖4所示,該組件在本地與遠(yuǎn)程服務(wù)器之間建立了代理服務(wù)器。當(dāng)本地發(fā)送視頻網(wǎng)絡(luò)請(qǐng)求至代理服務(wù)器時(shí),代理服務(wù)器與遠(yuǎn)程服務(wù)器之間通過代理Socket連接,并將遠(yuǎn)程服務(wù)器的視頻數(shù)據(jù)回寫到代理服務(wù)器的緩存中,本地播放視頻時(shí)從代理服務(wù)器的緩存中讀取數(shù)據(jù)(圖4援引自https://www.jianshu.com/p/4745de02dcdc)。下面詳細(xì)介紹視頻緩存的步驟。

圖4 VideoCache組件的視頻緩存原理

1、實(shí)例化HttpProxyCacheServer類的對(duì)象

HttpProxyCacheServer類可用于處理來自視頻播放器的播放請(qǐng)求,當(dāng)本地有緩存時(shí),向視頻播放器返回一個(gè)本地IP地址(LocalURL:以127.0.0.1開頭),用于視頻的播放。

  1. private HttpProxyCacheServer mCacheServerProxy=null
  2. public void onStart(Intent intent) { 
  3.         ... 
  4.         if (mCacheServerProxy == null) { 
  5.             Context context = this; 
  6.         //實(shí)例化HttpProxyCacheServer對(duì)象 
  7.             mCacheServerProxy = new HttpProxyCacheServer(context); 
  8.         }  
  9.        ...     

2、定義緩存監(jiān)聽器CacheListener

CacheListener 用于監(jiān)聽文件緩存的進(jìn)度,方便開發(fā)者通過判斷緩存進(jìn)度,執(zhí)行各類操作。

onCacheAvailable()方法是設(shè)置CacheListener 監(jiān)聽器時(shí)需要重寫的方法,此方法的參數(shù)中:cacheFile表示緩存文件的地址;url表示網(wǎng)絡(luò)視頻的URL;percentsAvailable表示緩存進(jìn)度,取值為1~100,取值為100時(shí)表示全部視頻緩存完成。

基于percentAvailable變量,大多數(shù)視頻播放器有以下設(shè)計(jì):設(shè)置一個(gè)變量用于保存當(dāng)前的視頻播放進(jìn)度。在緩存監(jiān)聽器CacheListener 中,比較當(dāng)前緩存進(jìn)度與當(dāng)前播放進(jìn)度的差值,如果超出了預(yù)設(shè)值,可以執(zhí)行特定操作以暫停緩存,直至二者的差值小于預(yù)設(shè)值,重新啟動(dòng)緩存。

  1. private CacheListener mCacheListener = new CacheListener() { 
  2.     @Override 
  3.     public void onCacheAvailable(File cacheFile, String url, int percentsAvailable) { 
  4.     //打印實(shí)時(shí)緩存進(jìn)度 
  5.     HiLog.info(new HiLogLabel(3,0,"cache"),"Saving……,percent:"+String.valueOf(percentsAvailable)); 
  6.     //當(dāng)進(jìn)度達(dá)到100時(shí),可進(jìn)行一些特殊操作,此處僅以log打印為例 
  7.     if (percentsAvailable == 100 && !cacheFile.getPath().endsWith(".download")) { 
  8.             HiLog.info(new HiLogLabel(3,0,"cache"),"Download already!"); 
  9.         } 
  10.     } 
  11. }; 

3. 獲取LocalURL

將網(wǎng)絡(luò)視頻的URL與步驟2中的監(jiān)聽器對(duì)象mCacheListener傳入HttpProxyCacheServer類的注冊(cè)方法中,即可對(duì)緩存進(jìn)行監(jiān)聽。后通過 HttpProxyCacheServer類的getProxyUrl()方法獲取網(wǎng)絡(luò)視頻URL對(duì)應(yīng)的LocalUrl。

  1. //注冊(cè)下載緩存監(jiān)聽 
  2.  mCacheServerProxy.registerCacheListener(mCacheListener,URL); 
  3. //獲取LocalURL 
  4. localUrl = mCacheServerProxy.getProxyUrl(URL); 

4、 使用LocalUrl作為視頻來源進(jìn)行播放,緩存功能即可實(shí)現(xiàn)。

Library解析

整個(gè)library分為五個(gè)部分:file、headers、slice、sourcestorage以及22個(gè)類文件,如圖2所示。

圖5 library的組成結(jié)構(gòu)

一、file

在file文件夾下的類主要涉及文件緩存相關(guān)的功能:

圖6 file文件夾的組成結(jié)構(gòu)

1、FileCache類

類中規(guī)定了緩存文件的命名格式(后加.download)和存儲(chǔ)的路徑,完成了緩存文件的創(chuàng)建。

  1. //定義緩存文件的后綴格式 
  2. private static final String TEMP_POSTFIX = ".download"
  3. public FileCache(File file, DiskUsage diskUsage) throws ProxyCacheException { 
  4.         ... 
  5.         File directory = file.getParentFile(); 
  6.         Files.makeDir(directory); 
  7.         boolean completed = file.exists(); 
  8.         //文件的保存格式:根目錄文件+文件名+之前定義的文件后綴格式 
  9.         this.file = completed ? file : new File(file.getParentFile(), file.getName() + TEMP_POSTFIX); 
  10.         //文件權(quán)限設(shè)置。緩存完成,文件只能讀取;未緩存完成,文件可讀可寫。 
  11.         this.dataFile = new RandomAccessFile(this.file, completed ? "r" : "rw"); 
  12.     } catch (IOException e) { 
  13.         throw new ProxyCacheException("Error using file " + file + " as disc cache", e); 
  14.     } 

2、Files類

此類是對(duì)JAVA中原有的File類的封裝,原File類僅可處理一個(gè)文件,F(xiàn)iles類可同時(shí)對(duì)多個(gè)文件進(jìn)行處理。

如下代碼中,getLruListFiles()方法的參數(shù)是一個(gè)directory,在方法中對(duì)directory(文件夾路徑)下的所有文件進(jìn)行拆分,返回了一個(gè)File參數(shù)類型的List列表,后續(xù)可對(duì)列表中的各個(gè)File文件進(jìn)行處理。

  1. static List<File> getLruListFiles(File directory) { 
  2.     //通過list對(duì)Files內(nèi)的文件進(jìn)行處理 
  3.     List<File> result = new LinkedList<>(); 
  4.     File[] files = directory.listFiles(); 
  5.     //為各file建立LastModifiedComparator 
  6.     //LastModifiedComparator可用于根據(jù)文件的上次修改的日期文件進(jìn)行排序 
  7.     if (files != null) { 
  8.         result = Arrays.asList(files); 
  9.         Collections.sort(result, new LastModifiedComparator()); 
  10.     } 
  11.     return result; 

3、LruDiskUsage類

此類主要用于控制緩存文件的大小,它與Videocache平行開了一個(gè)線程,實(shí)時(shí)記錄緩存文件的數(shù)量、大小、存儲(chǔ)空間等,超過預(yù)設(shè)的閾值時(shí),執(zhí)行特定的優(yōu)化操作。

  1. private void trim(List<File> files) { 
  2.     long totalSize = countTotalSize(files);  //緩存文件的總大小 
  3.     int totalCount = files.size();            //緩存文件的總數(shù)量 
  4.     for (File file : files) { 
  5.         //未超過緩存文件的(總大小 & 總數(shù)量)的閾值時(shí),接收緩存 
  6.         boolean accepted = accept(file, totalSize, totalCount); 
  7.         if (!accepted) { 
  8.       long fileSize = file.length(); // 單一文件的大小 
  9.             boolean deleted = file.delete();  //文件是否為預(yù)備刪除的文件 
  10.       //如果是準(zhǔn)備刪除的文件 
  11.             if (deleted) { 
  12.                 totalCount--;  // 緩存文件的總數(shù)量-1 
  13.                 totalSize -= fileSize;  //緩存文件的總大小 - 預(yù)備刪除的單一文件的大小 
  14.                 LOG.info("Cache file " + file +  
  15.                     " is deleted because it exceeds cache limit"); 
  16.             } else { 
  17.                 LOG.error("Error deleting file " + file + " for trimming cache"); 
  18.             } 
  19.         } 
  20.     } 

4、 Md5FileNameGenerator類

此類實(shí)現(xiàn)了為輸入文件路徑,生成對(duì)應(yīng)的MD5值的功能。MD5值是一種被"壓縮"的保密格式,可以確保信息完整傳輸。

  1. public class Md5FileNameGenerator implements FileNameGenerator { 
  2.     private static final int MAX_EXTENSION_LENGTH = 4; 
  3.     @Override 
  4.     public String generate(String url) { 
  5.         //獲取文件名的后綴 
  6.         String extension = getExtension(url);  
  7.         //獲取MD5值 
  8.         String name = ProxyCacheUtils.computeMD5(url); 
  9.         Boolean isEmpty = false
  10.         //文件后綴名為空時(shí),設(shè)置isEmpty 標(biāo)志位為true 
  11.         if (extension == null || extension.length() == 0)  
  12.             isEmpty = true
  13.         return isEmpty ? name : name + "." + extension; 
  14.     } 

5、TotalCountLruDiskUsage類、TotalSizeLruDiskUsage類和UnlimitedDiskUsage類

LruDiskUsage類是標(biāo)題中前兩個(gè)類的父類,同時(shí)控制緩存文件的大小和數(shù)量,需要判斷當(dāng)前緩存文件的(總大小 & 總數(shù)量)未超過閾值時(shí),才會(huì)緩存新的文件。 TotalCountLruDiskUsage類和TotalSizeLruDiskUsage類分別只對(duì)緩存文件總數(shù)量或者緩存文件總大小進(jìn)行限制,滿足一個(gè)條件便可以緩存新的文件。

TotalCountLruDiskUsage類和TotalSizeLruDiskUsage類各有兩個(gè)方法:一個(gè)方法用于設(shè)定緩存文件的閾值;一個(gè)方法用于判斷當(dāng)前緩存數(shù)據(jù)是否超過了設(shè)定的閾值。

當(dāng)不需要進(jìn)行磁盤的緩存限制時(shí)使用UnlimitedDiskUsage類,其本身是一個(gè)空的類,不對(duì)緩存文件的數(shù)量和大小做任何限制。

  1. //控制緩存文件的總數(shù)量 
  2. public class TotalCountLruDiskUsage extends LruDiskUsage { 
  3.     private final int maxCount; 
  4.     //設(shè)置緩存文件的總數(shù)量的閾值 
  5.     public TotalCountLruDiskUsage(int maxCount) { 
  6.         if (maxCount <= 0) { 
  7.             throw new IllegalArgumentException("Max count must be positive number!"); 
  8.         } 
  9.         this.maxCount = maxCount; 
  10.     } 
  11.  
  12.     //當(dāng)前緩存文件的總數(shù)量小于設(shè)定的閾值時(shí),新文件accept 
  13.     @Override 
  14.     protected boolean accept(File file, long totalSize, int totalCount) { 
  15.         return totalCount <= maxCount; 
  16.     } 
  17.  
  18. //控制制緩存文件的總大小 
  19. public class TotalSizeLruDiskUsage extends LruDiskUsage { 
  20.     private final long maxSize; 
  21.     //設(shè)置制緩存文件的總大小的閾值 
  22.     public TotalSizeLruDiskUsage(long maxSize) { 
  23.         if (maxSize <= 0) { 
  24.             throw new IllegalArgumentException("Max size must be positive number!"); 
  25.         } 
  26.         this.maxSize = maxSize; 
  27.     } 
  28.  
  29.     //當(dāng)前緩存文件的總大小小于設(shè)定的閾值時(shí),新文件accept 
  30.     @Override 
  31.     protected boolean accept(File file, long totalSize, int totalCount) { 
  32.         return totalSize <= maxSize; 
  33.     } 

二、headers

文件中涉及到的功能不多,僅有一個(gè)接口文件和一個(gè)能實(shí)現(xiàn)URL和文件路徑hashmap匹配功能的類文件,上述功能在HttpProxyCacheServer類中被調(diào)用。

圖7 headers文件夾的組成結(jié)構(gòu)

三、slice

鴻蒙程序的slice控件用于三方件遷移中的可視化調(diào)試,在這里我們對(duì)其不作進(jìn)一步的分析。

圖8 slice文件夾的組成結(jié)構(gòu)

四、sourcestorage

sourcestorage用于在數(shù)據(jù)庫中存儲(chǔ)SourInfo。SourInfo可用于存儲(chǔ)http請(qǐng)求源的一些信息,如URL,數(shù)據(jù)長度Length,請(qǐng)求資源的類型MIME等。sourcestorage中的類主要在上述的HttpProxyCacheServer類中被調(diào)用。

圖9 sourcestorage文件夾的組成結(jié)構(gòu)

DatabaseSourceInfoStorage類用于做數(shù)據(jù)庫的初始化工作,數(shù)據(jù)庫里面存的字段主要是URL、Length、MIME,SourceInfo類是對(duì)這3個(gè)字段的封裝。類中包含了三個(gè)接口:get()、 put()、release(),可供外部調(diào)用,三個(gè)接口都是對(duì)SourceInfo的操作,主要用來查找和保存緩存的信息。

其余三個(gè)類是根據(jù)DatabaseSourceInfoStorage類進(jìn)行的工廠模式的生成,如果對(duì)這部分不明白的同學(xué)可以在網(wǎng)上搜索“設(shè)計(jì)模式-工廠模式”進(jìn)行學(xué)習(xí)。

  1. class DatabaseSourceInfoStorage extends DatabaseHelper implements SourceInfoStorage { 
  2.     //數(shù)據(jù)庫中存儲(chǔ)SourInfo:URL、Length、MIME 
  3.     private static final String TABLE = "SourceInfo"
  4.     private static final String COLUMN_ID = "_id"
  5.     private static final String COLUMN_URL = "url"
  6.     private static final String COLUMN_LENGTH = "length"
  7.     private static finavl String COLUMN_MIME = "mime"
  8.     private static final String[] ALL_COLUMNS = new String[]{COLUMN_ID, COLUMN_URL, 
  9.                                                          COLUMN_LENGTH, COLUMN_MIME}; 
  10.     //創(chuàng)建數(shù)據(jù)庫的SQL 
  11.     private static final String CREATE_SQL = 
  12.             "CREATE TABLE " + TABLE + " (" + 
  13.                     COLUMN_ID + " INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL," + 
  14.                     COLUMN_URL + " TEXT NOT NULL," + 
  15.                     COLUMN_MIME + " TEXT," + 
  16.                     COLUMN_LENGTH + " INTEGER" + 
  17.                     ");"
  18.  
  19.     private final RdbStore myRdbStore; 
  20.     //連接的數(shù)據(jù)庫名字 
  21.     private final StoreConfig config =  
  22.                              StoreConfig.newDefaultConfig("AndroidVideoCache.db"); 
  23.  
  24. //數(shù)據(jù)庫get指令,通過URL獲取SourceInfo  
  25. public SourceInfo get(String url) { 
  26.     checkNotNull(url); 
  27.     ResultSet cursor = null
  28.     try{ 
  29.         RdbPredicates predicates = new RdbPredicates(TABLE); 
  30.         predicates.equalTo(COLUMN_URL, url); 
  31.         cursor = this.myRdbStore.query(predicates, null); 
  32.         return cursor == null || !cursor.goToFirstRow() ? null : convert(cursor); 
  33.     } finally { 
  34.         if (cursor != null) { 
  35.             cursor.close(); 
  36.         } 
  37.     } 
  38. //數(shù)據(jù)庫put指令,將url和SourceInfo在數(shù)據(jù)庫中登記綁定  
  39. public void put(String url, SourceInfo sourceInfo) { 
  40.     checkAllNotNull(url, sourceInfo); 
  41.     SourceInfo sourceInfoFromDb = get(url); 
  42.     boolean exist = sourceInfoFromDb != null
  43.     RdbPredicates predicates = new RdbPredicates(TABLE); 
  44.     if (exist) { 
  45.         predicates.contains(COLUMN_URL, url); 
  46.         this.myRdbStore.update(convert(sourceInfo), predicates); 
  47.     } else { 
  48.         this.myRdbStore.insert(TABLEconvert(sourceInfo)); 
  49.     } 
  50. //release指令:釋放數(shù)據(jù)庫控制流 
  51. @Override 
  52. public void release() { 
  53.     this.myRdbStore.close(); 

五、主功能文件

這部分文件主要用于整合上述四個(gè)部分的功能,向外部提供VideoCache接口。

主要功能類如下圖所示,他們的外部調(diào)用方法在Sample中已經(jīng)詳細(xì)說明,主要使用到的就是HttpProxyCacheServer類,下面對(duì)其內(nèi)部實(shí)現(xiàn)進(jìn)行詳細(xì)的講解。

圖10主要功能類主文件

1、構(gòu)造函數(shù)

在構(gòu)造函數(shù)中主要進(jìn)行了全局變量的初始化和對(duì)PROXY_HOST(VideoCache代理接口,也就是LocalURL所屬的代理接口)進(jìn)行訪問,判斷是否可以直接ping通。

  1. private HttpProxyCacheServer(Config config) { 
  2.     this.config = checkNotNull(config); 
  3.     try { 
  4.     //初始化各種全局變量 
  5.         InetAddress inetAddress = InetAddress.getByName(PROXY_HOST); 
  6.         this.serverSocket = new ServerSocket(0, 8, inetAddress); 
  7.         this.port = serverSocket.getLocalPort(); 
  8.         IgnoreHostProxySelector.install(PROXY_HOST, port); 
  9.         CountDownLatch startSignal = new CountDownLatch(1); 
  10.         this.waitConnectionThread = new Thread(new WaitRequestsRunnable(startSignal)); 
  11.         this.waitConnectionThread.start(); 
  12.         startSignal.await(); // freeze thread, wait for server starts 
  13.     //獲取對(duì)PROXY_HOST& port的ping,判斷是否可以ping通 
  14.         this.pinger = new Pinger(PROXY_HOST, port); 
  15.         LOG.info("Proxy cache server started. Is it alive? " + isAlive()); 
  16.     } catch (IOException | InterruptedException e) { 
  17.         socketProcessor.shutdown(); 
  18.         throw new IllegalStateException("Error starting local proxy server", e); 
  19.     } 

2、registerCacheListener函數(shù)

這個(gè)函數(shù)主要實(shí)現(xiàn)的功能是對(duì)URL進(jìn)行注冊(cè)監(jiān)聽。

  1. public void registerCacheListener(CacheListener cacheListener, String url) { 
  2.     checkAllNotNull(cacheListener, url); 
  3.     synchronized (clientsLock) { 
  4.         try { 
  5.       //對(duì)url獲取Clients,并為其注冊(cè)CacheListener 
  6.             getClients(url).registerCacheListener(cacheListener); 
  7.         } catch (ProxyCacheException e) { 
  8.             LOG.warn("Error registering cache listener", e); 
  9.         } 
  10.     } 

3、getProxyUrl函數(shù)

該函數(shù)實(shí)現(xiàn)了將(已經(jīng)注冊(cè)過的)URL轉(zhuǎn)化為cached LocalURL的功能。

  1. public String getProxyUrl(String url) { 
  2.     return getProxyUrl(url, true); 
  3.  
  4. public String getProxyUrl(String url, boolean allowCachedFileUri) { 
  5.     if (allowCachedFileUri && isCached(url)) { 
  6.         File cacheFile = getCacheFile(url); 
  7.         touchFileSafely(cacheFile); 
  8.         return Uri.getUriFromFile(cacheFile).toString(); 
  9.     } 
  10.     return isAlive() ? appendToProxyUrl(url) : url; 

當(dāng)傳入一個(gè)網(wǎng)絡(luò)視頻的URL時(shí),該方法會(huì)對(duì)該URL進(jìn)行判斷,如果可以在代理服務(wù)器上進(jìn)行緩存,則提供正確的LocalURL返回值,否則返回原URL。

項(xiàng)目貢獻(xiàn)人

呂澤 鄭森文 朱偉 陳美汝 張馨心

想了解更多內(nèi)容,請(qǐng)?jiān)L問:

51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)

https://harmonyos.51cto.com

 

責(zé)任編輯:jianghua 來源: 鴻蒙社區(qū)
相關(guān)推薦

2021-03-10 15:03:40

鴻蒙HarmonyOS應(yīng)用

2021-04-29 14:32:24

鴻蒙HarmonyOS應(yīng)用

2021-03-03 09:42:26

鴻蒙HarmonyOS圖片裁剪

2021-08-26 16:07:46

鴻蒙HarmonyOS應(yīng)用

2021-03-01 14:00:11

鴻蒙HarmonyOS應(yīng)用

2021-08-03 10:07:41

鴻蒙HarmonyOS應(yīng)用

2021-08-05 15:06:30

鴻蒙HarmonyOS應(yīng)用

2021-07-06 18:21:31

鴻蒙HarmonyOS應(yīng)用

2021-08-30 17:55:58

鴻蒙HarmonyOS應(yīng)用

2021-04-20 15:06:42

鴻蒙HarmonyOS應(yīng)用

2021-04-08 14:57:52

鴻蒙HarmonyOS應(yīng)用

2021-03-12 16:35:33

鴻蒙HarmonyOS應(yīng)用

2021-07-20 15:20:40

鴻蒙HarmonyOS應(yīng)用

2021-04-15 17:47:38

鴻蒙HarmonyOS應(yīng)用

2021-11-17 15:37:43

鴻蒙HarmonyOS應(yīng)用

2021-11-02 14:54:21

鴻蒙HarmonyOS應(yīng)用

2021-06-29 09:28:16

鴻蒙HarmonyOS應(yīng)用

2021-01-27 10:04:46

鴻蒙HarmonyOS動(dòng)畫

2017-12-11 15:53:56

2021-10-19 10:04:51

鴻蒙HarmonyOS應(yīng)用
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

自拍偷拍亚洲视频| 国产视频第一页在线观看| 欧美三级网页| 99re热视频这里只精品| 国产不卡一区二区在线播放| 国产黑丝在线视频| 超碰资源在线| 欧美经典一区二区| 欧美一区第一页| 国产高潮失禁喷水爽到抽搐| 欧美人体一区二区三区| 1024亚洲合集| 欧美另类高清视频在线| 亚洲一区 视频| 日韩av密桃| 亚洲激情自拍图| 欧美视频亚洲图片| 色婷婷综合久久久中字幕精品久久| 亚洲精品视频在线看| 欧美一区二区三区四区夜夜大片 | 天天久久人人| 亚洲欧美精品一区二区三区| 亚洲无线观看| 亚洲精品国产精华液| 欧美一级爽aaaaa大片| 99热这里只有精品3| 欧美3p视频| 3atv在线一区二区三区| 亚洲色欲综合一区二区三区| 蜜臀av国内免费精品久久久夜夜| 国产精品久久久久久久久免费丝袜 | 18欧美乱大交hd1984| 蜜桃视频在线观看成人| 国产精品999在线观看| 性xxxx欧美老肥妇牲乱| 伊人久久久久久久久久久久久| 国产高清成人久久| 亚洲精品黑牛一区二区三区| 欧美福利一区二区| 999一区二区三区| 国产精品久久麻豆| 国产精品美女一区二区三区| 日韩成人av电影在线| 蜜桃成人在线视频| 老牛嫩草一区二区三区日本| 欧美大肥婆大肥bbbbb| 欧美福利在线视频| 欧美一区三区| 一个人看的www久久| 亚洲天堂久久新| 精品一区欧美| 亚洲欧美一区二区三区在线| 亚洲黄色免费在线观看| 成人动态视频| 亚洲高清不卡av| 久久人妻少妇嫩草av无码专区| 都市激情亚洲欧美| 亚洲国产精品va在线观看黑人| 国产精品日日摸夜夜爽| 99国产精品久久一区二区三区| 日韩精品一区二区三区视频播放 | 久久成人这里只有精品| 亚洲一区和二区| 都市激情亚洲欧美| 日韩精品在线观看一区| 丝袜美腿中文字幕| 亚洲欧美久久精品| 欧美一二区视频| 久久久久久久人妻无码中文字幕爆| 99re8这里有精品热视频8在线 | 性色av蜜臀av浪潮av老女人 | 成人午夜伦理影院| 国产一级二级三级精品| 日韩精品视频无播放器在线看 | 亚洲图片在线观看| 超碰在线caoporn| 亚洲一区二区三区视频在线播放| 国产高清av在线播放| 一根才成人网| 7777精品伊人久久久大香线蕉经典版下载| caoporm在线视频| 69av成人| 日韩欧亚中文在线| 色乱码一区二区三区在线| 亚洲天堂网站| 精品国产91乱码一区二区三区 | 日韩欧美高清在线观看| 性娇小13――14欧美| 国产精品黄视频| 99久久精品国产一区色| 99re66热这里只有精品3直播| 日本欧美精品久久久| 国产丝袜在线| 欧美性videos高清精品| 国产无色aaa| 精品国产导航| 日韩网站在线观看| 亚洲综合一二三| 久久成人久久爱| 精品久久蜜桃| а√中文在线8| 一本色道久久综合亚洲精品按摩| 狠狠操狠狠干视频| 老司机精品视频在线播放| 一区二区在线视频| 久久精品国产亚洲AV无码麻豆| 天堂一区二区在线| 成人高清在线观看| 国产成人天天5g影院在线观看| 亚洲综合免费观看高清完整版在线 | 草草视频在线观看| 欧美日韩久久一区二区| a视频免费观看| 在线观看日韩| 中文字幕欧美日韩精品| 国产亚洲成人精品| 久久69国产一区二区蜜臀| 久久99精品久久久久久久久久| www国产在线观看| 欧美午夜精品久久久久久孕妇 | 日韩激情啪啪| 色综合色综合久久综合频道88| 精品乱码一区内射人妻无码| 91小视频在线免费看| 老司机激情视频| 日本亚洲欧洲无免费码在线| 欧美三级韩国三级日本三斤 | www.成人网| 久久精品亚洲一区| 波多野结衣影片| 久久影院视频免费| 国产91在线免费| 91精品啪在线观看国产爱臀| 日韩有码在线视频| 真实新婚偷拍xxxxx| 久久久亚洲国产美女国产盗摄| 男人的天堂avav| 蜜桃精品一区二区三区| 日韩视频免费观看高清完整版| 三区四区在线观看| 日韩电影在线免费看| 国产成人在线一区二区| 艳母动漫在线看| 亚洲成人你懂的| 中国特级黄色大片| 国产精品激情| 成人激情av| 丰乳肥臀在线| 精品999在线播放| 国产精品30p| 99热这里都是精品| 青青草视频在线免费播放| 精品成人自拍视频| 992tv在线成人免费观看| 亚洲精品成人在线视频| 92精品国产成人观看免费| 欧美大片在线播放| 西瓜成人精品人成网站| 欧美最猛黑人xxxx黑人猛叫黄| 一区二区视频网| 久久久久久久久久久99999| 男人天堂999| 欧美日韩一区二区综合 | 国产肉体ⅹxxx137大胆| jizz国产精品| 青青在线视频一区二区三区| 国产在线资源| 欧美精品一二三四| 私库av在线播放| 成人av电影在线网| 青青在线视频观看| 久久要要av| 99热在线国产| 91精品论坛| 日韩在线观看免费高清完整版| 国产成人精品白浆久久69| 亚洲国产精品久久久久婷婷884| 好吊一区二区三区视频| 日本vs亚洲vs韩国一区三区| 国产经典久久久| 小说区图片区色综合区| 国产男人精品视频| 后进极品白嫩翘臀在线播放| 亚洲精品自拍视频| 亚洲中文字幕在线一区| 亚洲影院理伦片| 蜜桃传媒一区二区亚洲| 国产一区二区三区高清播放| 女人和拘做爰正片视频| 天天射综合网视频| 久久久久久九九| 国产精品99久久免费| 欧美亚洲国产日韩2020| 欧美日韩欧美| 日韩精品视频在线免费观看| 伊人网综合在线| 天天综合天天综合色| fc2ppv在线播放| 久久日一线二线三线suv| 三级网站免费看| 毛片一区二区| 欧美极品少妇无套实战| 视频一区在线观看| 亚洲自拍高清视频网站| 日本成人伦理电影| 久久乐国产精品| www.欧美日本韩国| 国产一区二区三区在线| 天天干天天摸天天操| 欧美日韩一级二级三级| 欧美精品二区三区| 亚洲黄色小视频| 精品人体无码一区二区三区| 99re视频这里只有精品| 美女流白浆视频| 蜜臀久久99精品久久久久宅男| 久久综合一区二区三区| 国产精品久久久久久久久久久久久久久 | 麻豆精品久久久久久久99蜜桃| 一区二区三区在线视频免费观看| 国产18无套直看片| 久久色在线观看| 久久人人爽人人人人片| 岛国一区二区在线观看| 肉色超薄丝袜脚交| 老色鬼精品视频在线观看播放| 春日野结衣av| 在线看片成人| 精品无码av无码免费专区| 五月天久久网站| 亚洲黄色一区二区三区| 国产一区二区三区站长工具| 久久riav二区三区| 女同久久另类99精品国产| 91成人免费在线观看| 日韩毛片网站| 国产女精品视频网站免费| 国产综合色激情| 国产在线观看精品一区二区三区| 麻豆网站在线免费观看| 国产一区二区三区毛片| 国产美女性感在线观看懂色av| 亚洲欧美成人网| 蜜芽tv福利在线视频| 亚洲男人天堂2023| 久久久久国产精品嫩草影院| 国产丝袜一区二区| 欧美成熟毛茸茸| 亚洲午夜未删减在线观看 | xfplay精品久久| 欧美多人猛交狂配| 久久精品亚洲一区二区三区浴池 | 国产精品入口免费视| 欧美日韩国产网站| 国产精品爽黄69| 欧美综合影院| 成人性教育视频在线观看| 亚洲人体在线| 国产精品一级久久久| 欧美a一欧美| 欧美亚洲免费在线| 欧美在线色图| 熟女视频一区二区三区| 欧美精品导航| 国产亚洲精品网站| 日本午夜一区二区| 一级淫片在线观看| 粉嫩av一区二区三区在线播放| 美女搡bbb又爽又猛又黄www| 91在线视频18| 99久久久无码国产精品不卡| 丁香另类激情小说| 美国黄色a级片| 国产精品久久久久影院色老大| 成人免费黄色小视频| 亚洲6080在线| 中文字幕观看在线| 日韩一区二区高清| 日韩在线免费播放| 久久精品中文字幕电影| freexxx性亚洲精品| 国产精品99久久久久久www| 四虎在线精品| 国产呦系列欧美呦日韩呦| 狠狠综合久久av一区二区蜜桃| 欧美一级免费在线观看| 亚洲日本久久| 性生活免费在线观看| 成人精品gif动图一区| 免费黄在线观看| 亚洲午夜在线电影| 亚洲精品国产精品乱码视色| 精品精品国产高清a毛片牛牛| 久久电影中文字幕| 久久国产精品久久久久久久久久| 日韩精品av| 91精品国产综合久久香蕉的用户体验 | 欧美久久久久久久久中文字幕| 成人爽a毛片一区二区| 国产亚洲精品久久| 俺来俺也去www色在线观看| 国产精品视频999| 欧美尿孔扩张虐视频| 国产免费色视频| 久久久精品性| 亚洲自拍偷拍精品| 国产精品第五页| 一级片免费在线播放| 欧美精品一区二区三区四区| 日本中文字幕在线视频| 奇米四色中文综合久久| 国产精品极品| 日韩视频一二三| 日本欧美大码aⅴ在线播放| 中文字幕乱码在线| 亚洲欧美日本韩国| 在线亚洲欧美日韩| 亚洲欧美日韩在线一区| 97超碰免费在线| 98国产高清一区| 五月开心六月丁香综合色啪| 亚洲免费av一区二区三区| 日韩在线观看一区二区| 欧美xxxxx精品| 亚洲国产aⅴ成人精品无吗| 国产日韩欧美一区二区东京热| 中日韩美女免费视频网站在线观看| 美女的胸无遮挡在线观看 | 香蕉久久夜色精品国产使用方法| 久久艹国产精品| 国产成人精品一区二区三区四区 | 鲁大师成人一区二区三区| 性xxxxxxxxx| 一区二区日韩电影| 国产福利第一视频| 久久国产精品久久国产精品| 91精品国产一区二区在线观看| 一本久道久久综合狠狠爱亚洲精品| 日韩高清国产一区在线| 亚洲人成人无码网www国产| 黑人巨大精品欧美一区二区| 无码国产精品一区二区色情男同 | 最近中文字幕在线观看视频| 国产亚洲成精品久久| 日韩欧美一区二区三区免费观看 | 亚洲男人影院| v8888av| 色婷婷综合久久久中文一区二区| 免费在线黄色电影| 国产精国产精品| 日韩欧美电影| 日本高清一区二区视频| 亚洲日本护士毛茸茸| 国产高清不卡视频| 久久久爽爽爽美女图片| 色先锋久久影院av| 日日摸天天爽天天爽视频| 国产丝袜在线精品| 亚洲一卡二卡在线| 超碰97人人做人人爱少妇| 日韩欧美一级| 一二三四视频社区在线| 久久综合狠狠综合久久综合88 | 精品日韩一区二区三区| 丁香花在线电影小说观看| 久久99精品久久久久子伦| 日韩中文字幕区一区有砖一区| 在线免费看视频| 欧美一级国产精品| 白浆在线视频| 亚洲国产欧美日韩| 国产精品一二三区在线| 日本一级黄色大片| 伊人久久久久久久久久久久久 | 久久爱www久久做| 久久久国产精华液| 亚洲免费视频观看| 中文成人激情娱乐网| 国产欧美日韩网站| 中文在线资源观看网站视频免费不卡| 国产伦精品一区二区三区免.费| 国产做受高潮69| 日韩精品一卡| 美女搡bbb又爽又猛又黄www| 色老汉一区二区三区| 在线看女人毛片| 国产精品丝袜久久久久久高清 | 中文字幕不卡的av| 成人av手机在线| 国产91精品在线播放| 欧美黄污视频| 亚洲一区 欧美| 亚洲电影在线看| 婷婷精品久久久久久久久久不卡| 精品成在人线av无码免费看| 亚洲国产岛国毛片在线| 天天干天天草天天射| 亚洲精品免费一区二区三区| 久久亚洲国产精品一区二区| 日韩欧美中文字幕视频|