如何播放视频
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];