亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

ios使用AVFoundation讀取二維碼的方法

2019-10-21 18:42:35
字體:
來源:轉載
供稿:網友

二維碼(Quick Response Code,簡稱QR Code)是由水平和垂直兩個方向上的線條設計而成的一種二維條形碼(barcode)??梢跃幋a網址、電話號碼、文本等內容,能夠存儲大量的數據信息。自iOS 7以來,二維碼的生成和讀取只需要使用Core Image框架和AVFoundation框架就能輕松實現。在這里,我們主要介紹二維碼的讀取。關于二維碼的生成,可以查看使用CIFilter生成二維碼文章中的介紹。

ios,二維碼,AVFoundation

1 二維碼的讀取

讀取二維碼也就是通過掃描二維碼圖像以獲取其所包含的數據信息。需要知道的是,任何條形碼(包括二維碼)的掃描都是基于視頻采集(video capture),因此需要使用AVFoundation框架。

掃描二維碼的過程即從攝像頭捕獲二維碼圖像(input)到解析出字符串內容(output)的過程,主要是通過AVCaptureSession對象來實現的。該對象用于協調從輸入到輸出的數據流,在執行過程中,需要先將輸入和輸出添加到AVCaptureSession對象中,然后通過發送startRunning或stopRunning消息來啟動或停止數據流,最后通過AVCaptureVideoPreviewLayer對象將捕獲的視頻顯示在屏幕上。在這里,輸入對象通常是AVCaptureDeviceInput對象,主要是通過AVCaptureDevice的實例來獲得,而輸出對象通常是AVCaptureMetaDataOutput對象,它是讀取二維碼的核心部分,與AVCaptureMetadataOutputObjectsDelegate協議結合使用,可以捕獲在輸入設備中找到的任何元數據,并將其轉換為可讀的格式。下面是具體步驟:

1、導入AVFoundation框架。

#import <AVFoundation/AVFoundation.h>

2、創建一個AVCaptureSession對象。

AVCaptureSession *captureSession = [[AVCaptureSession alloc] init];

3、為AVCaptureSession對象添加輸入和輸出。

// add inputNSError *error;AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error]; [captureSession addInput:deviceInput]; // add outputAVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init];[captureSession addOutput:metadataOutput];

4、配置AVCaptureMetaDataOutput對象,主要是設置代理和要處理的元數據對象類型。

dispatch_queue_t queue = dispatch_queue_create("MyQueue", NULL);[metadataOutput setMetadataObjectsDelegate:self queue:queue];[metadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];

需要注意的是,一定要在輸出對象被添加到captureSession之后才能設置要處理的元數據類型,否則會出現下面的錯誤:

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: [AVCaptureMetadataOutput setMetadataObjectTypes:] Unsupported type found - use -availableMetadataObjectTypes'

5、創建并設置AVCaptureVideoPreviewLayer對象來顯示捕獲到的視頻。

AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:captureSession];[previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill];[previewLayer setFrame:self.view.bounds];[self.view.layer addSublayer:previewLayer];

6、給AVCaptureSession對象發送startRunning消息以啟動視頻捕獲。

[captureSession startRunning];

7、實現AVCaptureMetadataOutputObjectsDelegate的captureOutput:didOutputMetadataObjects:fromConnection:方法來處理捕獲到的元數據,并將其讀取出來。

- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ if (metadataObjects != nil && metadataObjects.count > 0) {  AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;  if ([[metadataObject type] isEqualToString:AVMetadataObjectTypeQRCode]) {   NSString *message = [metadataObject stringValue];   [self.label performSelectorOnMainThread:@selector(setText:) withObject:message waitUntilDone:NO];  } }}

需要提醒的是,由于AVCaptureMetaDataOutput對象代理的設置,該代理方法會在setMetadataObjectsDelegate:queue:指定的隊列上調用,如果需要更新用戶界面,則必須在主線程中進行。

2 應用示例

下面,我們就做一個如下圖所示的二維碼閱讀器:

ios,二維碼,AVFoundation

其中主要實現的功能有:

  1. 通過攝像頭實時掃描并讀取二維碼。
  2. 解析從相冊中選擇的二維碼圖片。

由于二維碼的掃描是基于實時的視頻捕獲,因此相關的操作無法在模擬器上進行測試,也不能在沒有相機的設備上進行測試。如果想要查看該應用,需要連接自己的iPhone設備來運行。

2.1 創建項目

打開Xcode,創建一個新的項目(File/New/Project...),選擇iOS一欄下的Application中的Single View Application模版,然后點擊Next,填寫項目選項。在Product Name中填寫QRCodeReaderDemo,選擇Objective-C語言,點擊Next,選擇文件位置,并單擊Create創建項目。

ios,二維碼,AVFoundation

2.2 構建界面

打開Main.storyboard文件,在當前控制器中嵌入導航控制器,并添加標題QR Code Reader:

ios,二維碼,AVFoundation

在視圖控制器中添加ToolBar、Flexible Space Bar Button Item、Bar Button Item、View,布局如下:

ios,二維碼,AVFoundation

其中,各元素及作用:

  1. ToolBar:添加在控制器視圖的最底部,其Bar Item標題為Start,具有雙重作用,用于啟動和停止掃描。
  2. Flexible Space Bar Button Item:分別添加在Start的左右兩側,用于固定Start 的位置使其居中顯示。
  3. Bar Button Item:添加在導航欄的右側,標題為Album,用于從相冊選擇二維碼圖片進行解析。
  4. View:添加在控制器視圖的中間,用于稍后設置掃描框。在這里使用自動布局固定寬高均為260,并且水平和垂直方向都是居中。

創建一個名為ScanView的新文件(File/New/File…),它是UIView的子類。然后選中視圖控制器中間添加的View,將該視圖的類名更改為ScanView:

ios,二維碼,AVFoundation

打開輔助編輯器,將storyboard中的元素連接到代碼中:

ios,二維碼,AVFoundation

注意,需要在ViewController.m文件中導入ScanView.h文件。

2.3 添加代碼

2.3.1 掃描二維碼

首先在ViewController.h文件中導入AVFoundation框架:

#import <AVFoundation/AVFoundation.h>

切換到ViewController.m文件,添加AVCaptureMetadataOutputObjectsDelegate協議,并在接口部分添加下面的屬性:

@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate>// properties@property (assign, nonatomic) BOOL isReading;@property (strong, nonatomic) AVCaptureSession *captureSession;@property (strong, nonatomic) AVCaptureVideoPreviewLayer *previewLayer;

在viewDidLoad方法中添加下面代碼:

- (void)viewDidLoad{ [super viewDidLoad];  self.isReading = NO; self.captureSession = nil;}

然后在實現部分添加startScanning方法和stopScanning方法及相關代碼:

- (void)startScanning{ self.captureSession = [[AVCaptureSession alloc] init];  // add input NSError *error; AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo]; AVCaptureDeviceInput *deviceInput = [[AVCaptureDeviceInput alloc] initWithDevice:device error:&error]; if (!deviceInput) {  NSLog(@"%@", [error localizedDescription]); } [self.captureSession addInput:deviceInput];  // add output AVCaptureMetadataOutput *metadataOutput = [[AVCaptureMetadataOutput alloc] init]; [self.captureSession addOutput:metadataOutput];  // configure output dispatch_queue_t queue = dispatch_queue_create("MyQueue", NULL); [metadataOutput setMetadataObjectsDelegate:self queue:queue]; [metadataOutput setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];  // configure previewLayer self.previewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:self.captureSession]; [self.previewLayer setVideoGravity:AVLayerVideoGravityResizeAspectFill]; [self.previewLayer setFrame:self.view.bounds]; [self.view.layer addSublayer:self.previewLayer];  // start scanning [self.captureSession startRunning];}- (void)stopScanning{ [self.captureSession stopRunning]; self.captureSession = nil;  [self.previewLayer removeFromSuperlayer];}

找到startStopAction:并在該方法中調用上面的方法:

- (IBAction)startStopAction:(id)sender{ if (!self.isReading) {  [self startScanning];  [self.view bringSubviewToFront:self.toolBar];  [self.startStopButton setTitle:@"Stop"]; } else {  [self stopScanning];  [self.startStopButton setTitle:@"Start"]; }  self.isReading = !self.isReading;}

至此,二維碼掃描相關的代碼已經完成,如果想要它能夠正常運行的話,還需要在Info.plist文件中添加NSCameraUsageDescription鍵及相應描述以訪問相機:

ios,二維碼,AVFoundation

需要注意的是,現在只能掃描二維碼但是還不能讀取到二維碼中的內容,不過我們可以連接設備,運行試下:

ios,二維碼,AVFoundation

2.3.2 讀取二維碼

讀取二維碼需要實現AVCaptureMetadataOutputObjectsDelegate協議的captureOutput:didOutputMetadataObjects:fromConnection:方法:

- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ if (metadataObjects != nil && metadataObjects.count > 0) {  AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;  if ([[metadataObject type] isEqualToString:AVMetadataObjectTypeQRCode]) {   NSString *message = [metadataObject stringValue];   [self performSelectorOnMainThread:@selector(displayMessage:) withObject:message waitUntilDone:NO];      [self performSelectorOnMainThread:@selector(stopScanning) withObject:nil waitUntilDone:NO];   [self.startStopButton performSelectorOnMainThread:@selector(setTitle:) withObject:@"Start" waitUntilDone:NO];   self.isReading = NO;  } }}- (void)displayMessage:(NSString *)message{ UIViewController *vc = [[UIViewController alloc] init];  UITextView *textView = [[UITextView alloc] initWithFrame:vc.view.bounds]; [textView setText:message]; [textView setFont:[UIFont preferredFontForTextStyle:UIFontTextStyleBody]]; textView.editable = NO;  [vc.view addSubview:textView];  [self.navigationController showViewController:vc sender:nil];}

在這里我們將掃碼結果顯示在一個新的視圖中,如果你運行程序的話應該可以看到掃描的二維碼內容了。

另外,為了使我們的應用更逼真,可以在掃描到二維碼信息時讓它播放聲音。這首先需要在項目中添加一個音頻文件:

ios,二維碼,AVFoundation

然后在接口部分添加一個AVAudioPlayer對象的屬性:

@property (strong, nonatomic) AVAudioPlayer *audioPlayer;

在實現部分添加loadSound方法及代碼,并在viewDidLoad中調用該方法:

- (void)loadSound{ NSString *soundFilePath = [[NSBundle mainBundle] pathForResource:@"beep" ofType:@"mp3"]; NSURL *soundURL = [NSURL URLWithString:soundFilePath]; NSError *error;  self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:&error];  if (error) {  NSLog(@"Could not play sound file.");  NSLog(@"%@", [error localizedDescription]); } else {  [self.audioPlayer prepareToPlay]; }}- (void)viewDidLoad{ ...  [self loadSound];}

最后,在captureOutput:didOutputMetadataObjects:fromConnection:方法中添加下面的代碼來播放聲音:

- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection{ if (metadataObjects != nil && metadataObjects.count > 0) {  AVMetadataMachineReadableCodeObject *metadataObject = metadataObjects.firstObject;  if ([[metadataObject type] isEqualToString:AVMetadataObjectTypeQRCode]) {   ...   self.isReading = NO;      // play sound   if (self.audioPlayer) {    [self.audioPlayer play];   }  } }

2.3.3 設置掃描框

目前點擊Start按鈕,整個視圖范圍都可以掃描二維碼?,F在,我們需要設置一個掃描框,以限制只有掃描框區域內的二維碼被讀取。在這里,將掃描區域設置為storyboard中添加的視圖,即scanView。

在實現部分找到startReading方法,添加下面的代碼:

- (void)startScanning{ // configure previewLayer ...  // set the scanning area [[NSNotificationCenter defaultCenter] addObserverForName:AVCaptureInputPortFormatDescriptionDidChangeNotification object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {  metadataOutput.rectOfInterest = [self.previewLayer metadataOutputRectOfInterestForRect:self.scanView.frame]; }];  // start scanning ...}

需要注意的是,rectOfInterest屬性不能在設置 metadataOutput 時直接設置,而需要在AVCaptureInputPortFormatDescriptionDidChangeNotification通知里設置,否則 metadataOutputRectOfInterestForRect:方法會返回 (0, 0, 0, 0)。

為了讓掃描框更真實的顯示,我們需要自定義ScanView,為其繪制邊框、四角以及掃描線。

首先打開ScanView.m文件,在實現部分重寫initWithCoder:方法,為scanView設置透明的背景顏色:

- (instancetype)initWithCoder:(NSCoder *)aDecoder{ self = [super initWithCoder:aDecoder];  if (self) {  self.backgroundColor = [UIColor clearColor]; }  return self;}

然后重寫drawRect:方法,為scanView繪制邊框和四角:

- (void)drawRect:(CGRect)rect{ CGContextRef context = UIGraphicsGetCurrentContext();  // 繪制白色邊框 CGContextAddRect(context, self.bounds); CGContextSetStrokeColorWithColor(context, [UIColor whiteColor].CGColor); CGContextSetLineWidth(context, 2.0); CGContextStrokePath(context);  // 繪制四角: CGContextSetStrokeColorWithColor(context, [UIColor greenColor].CGColor); CGContextSetLineWidth(context, 5.0);  // 左上角: CGContextMoveToPoint(context, 0, 30); CGContextAddLineToPoint(context, 0, 0); CGContextAddLineToPoint(context, 30, 0); CGContextStrokePath(context);  // 右上角: CGContextMoveToPoint(context, self.bounds.size.width - 30, 0); CGContextAddLineToPoint(context, self.bounds.size.width, 0); CGContextAddLineToPoint(context, self.bounds.size.width, 30); CGContextStrokePath(context);  // 右下角: CGContextMoveToPoint(context, self.bounds.size.width, self.bounds.size.height - 30); CGContextAddLineToPoint(context, self.bounds.size.width, self.bounds.size.height); CGContextAddLineToPoint(context, self.bounds.size.width - 30, self.bounds.size.height); CGContextStrokePath(context);  // 左下角: CGContextMoveToPoint(context, 30, self.bounds.size.height); CGContextAddLineToPoint(context, 0, self.bounds.size.height); CGContextAddLineToPoint(context, 0, self.bounds.size.height - 30); CGContextStrokePath(context); }

如果希望在掃描過程中看到剛才繪制的掃描框,還需要切換到ViewController.m文件,在startStopAction:方法中添加下面的代碼來顯示掃描框:

- (IBAction)startStopAction:(id)sender{ if (!self.isReading) {  ...  [self.view bringSubviewToFront:self.toolBar]; // display toolBar  [self.view bringSubviewToFront:self.scanView]; // display scanView  ... } ...}

現在運行,你會看到下面的效果:

ios,二維碼,AVFoundation

接下來我們繼續添加掃描線。

首先在ScanView.h文件的接口部分聲明一個NSTimer對象的屬性:

@property (nonatomic, strong) NSTimer *timer;

然后切換到ScanView.m文件,在實現部分添加loadScanLine方法及代碼,并在initWithCoder:方法中調用:

- (void)loadScanLine{ self.timer = [NSTimer scheduledTimerWithTimeInterval:3.0 repeats:YES block:^(NSTimer * _Nonnull timer) {  UIView *lineView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.bounds.size.width, 1.0)];  lineView.backgroundColor = [UIColor greenColor];  [self addSubview:lineView];    [UIView animateWithDuration:3.0 animations:^{   lineView.frame = CGRectMake(0, self.bounds.size.height, self.bounds.size.width, 2.0);  } completion:^(BOOL finished) {   [lineView removeFromSuperview];  }]; }];}- (instancetype)initWithCoder:(NSCoder *)aDecoder{ ... if (self) {  ...  [self loadScanLine]; } ...}

然后切換到ViewController.m文件,在startStopAction:方法中添加下面代碼以啟用和暫停計時器:

- (IBAction)startStopAction:(id)sender{ if (!self.isReading) {  ...  [self.view bringSubviewToFront:self.scanView]; // display scanView  self.scanView.timer.fireDate = [NSDate distantPast]; //start timer  ... } else {  [self stopScanning];  self.scanView.timer.fireDate = [NSDate distantFuture]; //stop timer  ... }  ...}

最后,再在viewWillAppear:的重寫方法中添加下面代碼:

- (void)viewWillAppear:(BOOL)animated{ [super viewWillAppear:animated];  self.scanView.timer.fireDate = [NSDate distantFuture];}

可以運行看下:

ios,二維碼,AVFoundation

2.3.4 從圖片解析二維碼

從iOS 8開始,可以使用Core Image框架中的CIDetector解析圖片中的二維碼。在這個應用中,我們通過點擊Album按鈕,從相冊選取二維碼來解析。

在寫代碼之前,需要在Info.plist文件中添加NSPhotoLibraryAddUsageDescription鍵及相應描述以訪問相冊:

ios,二維碼,AVFoundation

然后在ViewController.m文件中添加UIImagePickerControllerDelegate和UINavigationControllerDelegate協議:

 

復制代碼 代碼如下:

@interface ViewController ()<AVCaptureMetadataOutputObjectsDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate>

 

在實現部分找到readingFromAlbum:方法,添加下面代碼以訪問相冊中的圖片:

- (IBAction)readingFromAlbum:(id)sender{ UIImagePickerController *picker = [[UIImagePickerController alloc] init]; picker.delegate = self; picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary; picker.allowsEditing = YES;  [self presentViewController:picker animated:YES completion:nil];}

然后實現UIImagePickerControllerDelegate的imagePickerController:didFinishPickingMediaWithInfo:方法以解析選取的二維碼圖片:

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info{ [picker dismissViewControllerAnimated:YES completion:nil];  UIImage *selectedImage = [info objectForKey:UIImagePickerControllerEditedImage]; CIImage *ciImage = [[CIImage alloc] initWithImage:selectedImage];  CIDetector *detector = [CIDetector detectorOfType:CIDetectorTypeQRCode context:nil options:@{CIDetectorAccuracy:CIDetectorAccuracyLow}]; NSArray *features = [detector featuresInImage:ciImage];  if (features.count > 0) {  CIQRCodeFeature *feature = features.firstObject;  NSString *message = feature.messageString;    // display message  [self displayMessage:message];    // play sound  if (self.audioPlayer) {   [self.audioPlayer play];  } }}

現在可以運行試下從相冊選取二維碼來讀?。?/p>

ios,二維碼,AVFoundation  

上圖顯示的是在模擬器中運行的結果。

至此,我們的二維碼閱讀器已經全部完成,如果需要完整代碼,可以下載QRCodeReaderDemo查看。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VEVB武林網。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲二区中文字幕| 国产精品视频一区二区高潮| 91久久嫩草影院一区二区| 欧美成人精品在线视频| 欧美午夜宅男影院在线观看| 国产国语刺激对白av不卡| 精品无人区太爽高潮在线播放| 日韩av电影国产| 91精品久久久久久久久久入口| 精品国产区一区二区三区在线观看| 亚洲精品一区中文字幕乱码| 亚洲va国产va天堂va久久| 尤物九九久久国产精品的分类| 精品国产999| 久久精品国产亚洲一区二区| 久久久999国产精品| 国产精品扒开腿做爽爽爽视频| 国产精品黄页免费高清在线观看| 久久伊人精品视频| 日韩av中文字幕在线播放| 精品久久国产精品| 国产精品激情av在线播放| 国产91在线播放九色快色| 国产精品视频中文字幕91| 久久国产精品久久久久久久久久| 91精品久久久久久久久久入口| 国产精品免费小视频| 日韩成人av在线播放| 色多多国产成人永久免费网站| 亚洲国产成人在线播放| 一区二区国产精品视频| 亚洲成人1234| 欧美电影免费观看电视剧大全| 国产欧美日韩免费看aⅴ视频| 日韩欧美在线免费观看| 欧美最近摘花xxxx摘花| 亚洲级视频在线观看免费1级| 日韩的一区二区| 欧美成人激情视频免费观看| 中文字幕亚洲一区二区三区五十路| 91香蕉嫩草神马影院在线观看| 精品国内产的精品视频在线观看| 欧美精品在线观看| 97热在线精品视频在线观看| 国产精品爽爽ⅴa在线观看| 欧美精品日韩三级| 亚洲女人天堂视频| 激情懂色av一区av二区av| 久久av资源网站| 久久精品国产亚洲精品2020| 国产日韩在线看| 久久国产一区二区三区| 国产91成人video| 国产精品黄页免费高清在线观看| 欧美另类交人妖| 欧美电影免费在线观看| 性欧美亚洲xxxx乳在线观看| 国产成人综合久久| 日韩中文字幕视频| 欧美猛交免费看| 91在线视频精品| 久久久久久久亚洲精品| 亚洲护士老师的毛茸茸最新章节| 北条麻妃一区二区在线观看| 国产亚洲欧洲高清一区| 久久久久久久久久国产精品| 亚洲香蕉成视频在线观看| 色诱女教师一区二区三区| 精品亚洲一区二区三区在线观看| 久久九九有精品国产23| 欧美日韩国产色| 57pao成人永久免费视频| 欧美xxxx做受欧美.88| 久久久久久久久爱| 一区二区三区视频在线| 亚洲黄色在线看| 另类天堂视频在线观看| 91精品久久久久久久久青青| 91精品国产色综合久久不卡98| 欧美日本啪啪无遮挡网站| 久久久精品久久久| 欧美亚洲另类视频| 国产精品老牛影院在线观看| 97久久超碰福利国产精品…| 欧美乱妇40p| 中文字幕亚洲第一| 亚洲精品福利免费在线观看| 亚洲精品suv精品一区二区| 国产乱人伦真实精品视频| 在线成人激情黄色| 中文字幕av一区二区三区谷原希美| www国产91| 日韩中文字在线| 色av吧综合网| 亚洲一级片在线看| 欧美高清在线视频观看不卡| 欧美多人乱p欧美4p久久| 久久久欧美精品| 欧美另类xxx| 久久成人18免费网站| 国产精品丝袜一区二区三区| 91在线色戒在线| 国产色婷婷国产综合在线理论片a| 国产91色在线| 色综合老司机第九色激情| 久久视频国产精品免费视频在线| 日韩风俗一区 二区| 中文字幕欧美日韩在线| 911国产网站尤物在线观看| 欧美亚洲一区在线| 亚洲黄色片网站| 色噜噜狠狠狠综合曰曰曰88av| 国产精品视频久| 欧美高清在线播放| 精品调教chinesegay| 91久久久久久久久久久| 日韩av一卡二卡| 91精品久久久久久久久青青| 亚洲天堂第一页| 久久久久久国产精品| 久久精品国产电影| 精品视频在线观看日韩| 欧美成人黄色小视频| 欧美一级片免费在线| 亚洲国产成人在线视频| 91精品国产91久久久久久吃药| 国内精品视频在线| 欧美第一黄色网| 欧美刺激性大交免费视频| 成人午夜黄色影院| 国产成人啪精品视频免费网| 久久99精品国产99久久6尤物| 久久成年人免费电影| 久久久精品久久久久| 亚洲一区二区三区成人在线视频精品| 欧美大片在线看免费观看| 成人激情视频网| 一级做a爰片久久毛片美女图片| 日韩av在线免费| 亚洲影院高清在线| 亚洲最新av在线| 国产精品视频午夜| 欧美性xxxx极品hd满灌| 38少妇精品导航| 欧美精品xxx| 91免费国产视频| 欧美亚洲午夜视频在线观看| 久久天堂电影网| 亚洲老板91色精品久久| 亚洲综合中文字幕在线观看| 蜜臀久久99精品久久久无需会员| 91chinesevideo永久地址| 亚洲一区二区三区香蕉| 亚洲精品福利资源站| 成人免费网视频| 成人黄色在线播放| 国产精品久久久久91| 日本精品中文字幕| 久久精品视频导航| 亚洲欧美在线第一页| 亚洲人精品午夜在线观看| 最新国产成人av网站网址麻豆| 国产69久久精品成人看| 国产一区二区三区高清在线观看|