如何播放視頻
iOS提供了MPMoviePlayerController、MPMoviePlayerViewController兩個類,可以用來輕松播放視頻和網絡流媒體/網絡音頻
提示:網絡音頻同樣使用此控制器播放
YouTobe就是用MPMoviePlayerController實現的
MPMoviePlayerViewController只能全屏播放視頻
上述兩個類都定義在了MediaPlayer框架中
MPMoviePlayerController支持的格式
? MPMoviePlayerController
○ 繼承自NSObject
○ 內部有個view可以展示視頻內容
○ 將該視圖添加其他控制器的view上,即可顯示視頻內容
? MPMoviePlayerController可以播放的視頻格式包括:
○ H.264、MPEG-4等
? 支持的文件擴展名包括:avi,mkv,mov,m4v,mp4等
? 可以從蘋果官網:http://support.apple.com/kb/HT1425下載一些用來測試的視頻文件,文件都比較小
? 提示:MPMoviePlayerController并不支持所有的視頻格式,如果要播放不支持的視頻格式,需要借助第三方框架進行解碼,如VLC
? https://github.com/videolan/vlc
MPMoviePlayerController的使用
? 加載視頻資源(注意,如果url為nil同樣可以加載)
NSAssert(self.url, @"URL不能為空");
[[MPMoviePlayerController alloc] initWithContentURL:self.url];
? 顯示
[self.view addSubview:self.moviePlayer.view];
通過設置AutoresizingMask屬性可以在橫豎屏轉換時自動調整視圖大小
? 播放
[self.moviePlayer play];
? 全屏
[self.moviePlayer setFullscreen:YES animated:YES];
? MPMoviePlayerController的播放狀態是通過通知中心監聽的
常用監聽通知事件
? 狀態變化
MPMoviePlayerPlaybackStateDidChangeNotification
? 播放結束
MPMoviePlayerPlaybackDidFinishNotification
? 退出全屏
MPMoviePlayerDidExitFullscreenNotification
? 截屏完成
MPMoviePlayerThumbnailImageRequestDidFinishNotification
? 截屏方法
-requestThumbnailImagesAtTimes:timeOption:
二維碼的生成
? 從iOS7開始集成了二維碼的生成和讀取功能
? 此前被廣泛使用的zbarsdk目前不支持64位處理器
? 生成二維碼的步驟:
- 導入CoreImage框架
- 通過濾鏡CIFilter生成二維碼
? 二維碼的內容(傳統的條形碼只能放數字):
? 純文本
? URL
生成二維碼
- 實例化二維碼濾鏡
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"]; - 恢復濾鏡的默認屬性
[filter setDefaults]; - 將字符串轉換成NSData
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding]; - 通過KVO設置濾鏡inputMessage數據
[filter setValue:data forKey:@"inputMessage"]; - 獲得濾鏡輸出的圖像
CIImage *outputImage = [filter outputImage]; - 將CIImage轉換成UIImage,并放大顯示
return [UIImage imageWithCIImage:outputImage scale:20.0 orientation:UIImageOrientationUp];
讀取二維碼
? 讀取二維碼需要導入AVFoundation框架
? 利用攝像頭識別二維碼中的內容(模擬器不行)
- 輸入(攝像頭)
- 由會話將攝像頭采集到的二維碼圖像轉換成字符串數據
- 輸出(數據)
- 由預覽圖層顯示掃描場景
設置拍攝會話
實例化拍攝設備
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];設置輸入設備
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];設置元數據輸出
3.1 實例化拍攝元數據輸出
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
3.3 設置輸出數據代理
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];添加拍攝會話
4.1 實例化拍攝會話
AVCaptureSession *session = [[AVCaptureSession alloc] init];
4.2 添加會話輸入
[session addInput:input];
4.3 添加會話輸出
[session addOutput:output];
4.3 設置輸出數據類型,需要將元數據輸出添加到會話后,才能指定元數據類型,否則會報錯
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
設置拍攝視頻預覽圖層
視頻預覽圖層
5.1 實例化預覽圖層
AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];
preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
preview.frame = self.view.bounds;
5.2 將圖層插入當前視圖
[self.view.layer insertSublayer:preview atIndex:100];
self.previewLayer = preview;啟動會話
[_session startRunning];
**************************筆記***************************
一. 視頻播放介紹
實現方案四種
1.AVPlayer
優點:
可以自定義UI, 進行控制
缺點:
單純的播放, 沒有控制UI, 而且如果要顯示播放界面, 需要借助AVPlayerLayer, 添加圖層到需要展示的圖層上
2.MPMoviePlayerController
優點:
自帶的播放控制UI, 不需要手動添加
缺點:
不能自定義UI
只能將此控制器視圖添加到其他視圖進行展示
此控制器不是視圖控制器, 不能彈出
3.MPMoviePlayerViewController
優點:
自帶的播放控制UI, 不需要手動添加
此控制器是視圖控制器, 可以彈出, 可以壓棧
也可以手動調整視圖大小, 添加到其他視圖上
缺點:
不能自定義UI
4.針對于第2種和第3種實現方案, 在iOS9.0之后, 統一使用AVPlayerViewController
優點:
自帶的播放控制UI, 不需要手動添加
此控制器是視圖控制器, 可以彈出, 可以壓棧
也可以手動調整視圖大小, 添加到其他視圖上
缺點:
不能自定義UI
二. 使用AVPlayer 播放遠程視頻
- 實現播放功能
1.通過遠程URL創建AVPlayer對象
NSURL *remoteURL = [NSURL URLWithString:@"http://v1.mukewang.com/57de8272-38a2-4cae-b734-ac55ab528aa8/L.mp4"];
_player = [AVPlayer playerWithURL:remoteURL];
2.開始播放
[self.player play];
3.存在問題
只能播放聲音, 看不到圖像
解決方案: 需要借助AVPlayerLayer對象, 根據player創建圖層, 添加到視圖上
- 實現視頻顯示功能
1.根據player對象, 創建 AVPlayerLayer對象
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:self.player];
2.設置圖層 AVPlayerLayer 的大小
layer.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height * 9 / 16);
3.添加到需要展示的視圖上即可
[self.view.layer addSublayer:layer];
- 封裝專門用于播放的視圖
主要封裝一些操作的工具條
備注
iOS9.0 網絡請求適配 (HTTPS-->HTTP)
NSAppTransportSecurity NSAllowsArbitraryLoads
三. 使用MPMoviePlayerController播放視頻
相比于AVPlayer播放, 自帶一些控制按鈕
1.導入框架
import <MediaPlayer/MediaPlayer.h>
2.根據URL, 創建控制器 MPMoviePlayerController
NSURL *remoteURL = [NSURL URLWithString:@"http://v1.mukewang.com/57de8272-38a2-4cae-b734-ac55ab528aa8/L.mp4"];
_moviePlayer = [[MPMoviePlayerController alloc] initWithContentURL:remoteURL];
3.設置播放視圖frame, 添加到需要展示的視圖上
設置播放視圖的frame
self.moviePlayer.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height * 9 / 16);
設置播放視圖控制樣式
self.moviePlayer.controlStyle = MPMovieControlStyleFullscreen;
添加播放視圖到要顯示的視圖
[self.view addSubview:self.moviePlayer.view];
4.播放
[self.moviePlayer play];
注意: 此控制器不是視圖控制器, 不能直接彈出
播放器的播放狀態, 是通過通知的方式告訴外界
iOS9.0之后, 需要使用AVPlayerViewController
1.導入框架
import <AVFoundation/AVFoundation.h>
import <AVKit/AVKit.h>
2.根據URL創建AVPlayer
NSURL *remoteURL = [NSURL URLWithString:@"http://v1.mukewang.com/57de8272-38a2-4cae-b734-ac55ab528aa8/L.mp4"];
AVPlayer *player = [AVPlayer playerWithURL:remoteURL];
3.根據AVPlayer, 創建AVPlayerViewController控制器
_playerVC = [[AVPlayerViewController alloc] init];
_playerVC.player = player;
4.設置播放視圖frame, 添加到需要展示的視圖上
設置播放視圖的frame
self.playerVC.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height * 9 / 16);
添加播放視圖到要顯示的視圖
[self.view addSubview:self.playerVC.view];
或者
[self presentViewController:self.playerVC animated:YES completion:nil];
5.播放
開始播放
[self.playerVC.player play];
四. 使用MPMoviePlayerViewController播放視頻
- 實現步驟
1.導入框架
import <MediaPlayer/MediaPlayer.h>
2.根據URL, 創建控制器 MPMoviePlayerViewController
NSURL *remoteURL = [NSURL URLWithString:@"http://v1.mukewang.com/57de8272-38a2-4cae-b734-ac55ab528aa8/L.mp4"];
_playerVC = [[MPMoviePlayerViewController alloc] initWithContentURL:remoteURL];
3.直接模態彈出該控制器(或者: 設置播放視圖frame, 添加到需要展示的視圖上)
[self presentViewController:self.playerVC animated:YES completion:^{
[self.playerVC.moviePlayer play];
}];
4.播放
[self.playerVC.moviePlayer play];
iOS9.0之后, 需要使用AVPlayerViewController
1.導入框架
import <AVFoundation/AVFoundation.h>
import <AVKit/AVKit.h>
2.根據URL創建AVPlayer
NSURL *remoteURL = [NSURL URLWithString:@"http://v1.mukewang.com/57de8272-38a2-4cae-b734-ac55ab528aa8/L.mp4"];
AVPlayer *player = [AVPlayer playerWithURL:remoteURL];
3.根據AVPlayer, 創建AVPlayerViewController控制器
_playerVC = [[AVPlayerViewController alloc] init];
_playerVC.player = player;
4.設置播放視圖frame, 添加到需要展示的視圖上
設置播放視圖的frame
self.playerVC.view.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height * 9 / 16);
添加播放視圖到要顯示的視圖
[self.view addSubview:self.playerVC.view];
或者
[self presentViewController:self.playerVC animated:YES completion:nil];
5.播放
開始播放
[self.playerVC.player play];
一. 二維碼生成和掃描
二維碼概念
二維碼, 是用某種特定的幾何圖形按一定規律在平面(二維方向上)分布的黑白相間的圖形記錄數據符號信息的;二維碼的使用場景
● 信息獲取(名片、地圖、WIFI密碼、資料)
● 網站跳轉(跳轉到微博、手機網站、網站)
● 廣告推送(用戶掃碼,直接瀏覽商家推送的視頻、音頻廣告)
● 手機電商(用戶掃碼、手機直接購物下單)
● 防偽溯源(用戶掃碼、即可查看生產地;同時后臺可以獲取最終消費地)
● 優惠促銷(用戶掃碼,下載電子優惠券,抽獎)
● 會員管理(用戶手機上獲取電子會員信息、VIP服務)
● 手機支付(掃描商品二維碼,通過銀行或第三方支付提供的手機端通道完成支付)二維碼生成方式
從iOS7開始集成了二維碼的生成和讀取功能
此前被廣泛使用的zbarsdk目前不支持64位處理器
- 生成二維碼步驟
1.導入CoreImage框架
import <CoreImage/CoreImage.h>
2.通過濾鏡CIFilter生成二維碼
- 實例化二維碼濾鏡
CIFilter *filter = [CIFilter filterWithName:@"CIQRCodeGenerator"];
- 恢復濾鏡的默認屬性
[filter setDefaults];
- 將字符串轉換成NSData
NSData *data = [@"小碼哥" dataUsingEncoding:NSUTF8StringEncoding];
- 通過KVC設置濾鏡inputMessage數據
[filter setValue:data forKey:@"inputMessage"];
- 獲得濾鏡輸出的圖像
CIImage *outputImage = [filter outputImage];
- 將CIImage轉換成UIImage,并放大顯示
return [UIImage imageWithCIImage:outputImage scale:20.0 orientation:UIImageOrientationUp];
- 讀取二維碼
讀取二維碼需要導入AVFoundation框架
利用攝像頭識別二維碼中的內容(模擬器不行)
1.實例化拍攝設備
AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
2.設置輸入設備
AVCaptureDeviceInput *input = [AVCaptureDeviceInput deviceInputWithDevice:device error:nil];
3.設置元數據輸出
3.1 實例化拍攝元數據輸出
AVCaptureMetadataOutput *output = [[AVCaptureMetadataOutput alloc] init];
3.2 設置輸出數據代理
[output setMetadataObjectsDelegate:self queue:dispatch_get_main_queue()];
4.添加拍攝會話
4.1 實例化拍攝會話
AVCaptureSession *session = [[AVCaptureSession alloc] init];
4.2 添加會話輸入
[session addInput:input];
4.3 添加會話輸出
[session addOutput:output];
4.3 設置輸出數據類型,需要將元數據輸出添加到會話后,才能指定元數據類型,否則會報錯
[output setMetadataObjectTypes:@[AVMetadataObjectTypeQRCode]];
5.視頻預覽圖層
5.1 實例化預覽圖層
AVCaptureVideoPreviewLayer *preview = [AVCaptureVideoPreviewLayer layerWithSession:_session];
preview.videoGravity = AVLayerVideoGravityResizeAspectFill;
preview.frame = self.view.bounds;
5.2 將圖層插入當前視圖
[self.view.layer addSublayer:preview];
self.previewLayer = preview;
啟動會話
[_session startRunning];