Audio
1. 引入AVFoundation 库,此库用于处理音频的播放。
> 使用AVAudioPlayer 播放音频,此类只能播放本地音频文件。对于流媒体(边下边播)的播放使用第三方框架实现,比较优秀的有:AudioStreamer, FreeStreamer
[[AVAudioPlayer alloc] initWithContentsOfURL: error:nil]; // 此处的url是指本地文件的位置,以file:// 开头
> AVAudioPlayer 方法及属性
// 准备播放
[player prepareToPlay];
// 播放
[player play];
// 暂停
[player pause];
// 停止
[player stop];
// 是否在播放
player.playing
// 音频的总时长
player.duration
// 音频的音量
player.volume
// 音频播放的当前时间
player.currentTime
// 音频播放时的循环次数
player.numberOfLoops // 0 表示播放一次,1 表示播放两次,依次类推。任何负数表示无限循环播放。
// 代理对象
player.delegate 协议名称:AVAudioPlayerDelegate
// 协议方法
// 一个音频播放完毕时触发此方法
- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
> *若音频需支持后台播放,需以下两步操作:
— 在工程 Info.plist 在根级添加 Required background modes, 再在此项下添加子项:App plays audio or streams audio/video using AirPlay
— 在代码里配置音频会话 AVAudioSession
// 每个ios应用都有一个音频会话
[AVAudioSession sharedInstance]; // 获取唯一实例
// 设置音频会话类别
[[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayback error:nil]; // 告知系统静止其他应用的音频回放,在锁屏或后台时,仍然可以播放。
// 激活会话
[[AVAudioSession sharedInstance] setActive:YES error:nil];
> *若音频需要远程控制,即由设备下方经滑动弹出显示的控制界面
- 在播放音频的控制器视图将要显示时,开始接收远程控制事件
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
[self becomeFirstResponder]; // 使当前视图成为第一响应者
}
- 在播放音频的控制器视图将要消失时,结束接收远程控制事件
- (void)viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[[UIApplication sharedApplication] endReceivingRemoteControlEvents];
[self resignFirstResponder];
}
- 实现父类方法
- (BOOL)canBecomeFirstResponder {
return YES;
} // 此方法默认返回NO
- 实现父类方法,远程事件接收后的处理
- (void)remoteControlReceivedWithEvent:(UIEvent *)event {
if (event.type == UIEventTypeRemoteControl) {
switch (event.subtype) {
case UIEventSubtypeRemoteControlPlay:
case UIEventSubtypeRemoteControlPause:
// 播放,暂停音频播放
break;
case UIEventSubtypeRemoteControlPreviousTrack:
// 播放上一首
break;
case UIEventSubtypeRemoteControlNextTrack:
// 播放下一首
break;
default:
break;
}
}
}
2.音频录音 AVAudioRecorder ,使用方式类似AVAudioPlayer,录音保存的路径需设置到沙盒目录下。
Movie
1. iOS 视频播放 MediaPlayer 库中的MPMoviePlayerController, 支持本地视频和网络视频播放. .
> 使用MPMoviePlayerController
// 初始化
[MPMoviePlayerController alloc] initWithContentURL:]
// 设置播放器视图的frame
moviePlayer.view.frame
// *将播放视图添加的父视图上
[superview addSubview:moviePlayer.view]
> MPMoviePlayerController 视频播放时,播放状态等信息不是通过代理来与外界交互,而是通过通知中心。
// 注册通知
// 播放状态改变
[NSNotificationCenter defaultCenter] addObserver: 观察者 selector: 方法 name:MPMoviePlayerPlaybackStateDidChangeNotification object:通知的附加内容 ]
// 播放完成
[NSNotificationCenter defaultCenter] addObserver: 观察者 selector: 方法 name:MPMoviePlayerPlaybackDidFinishNotification object:通知的附加内容 ]
[扩展] 若想定制播放控制,则需设置player.controlStyle = MPMovieControlStyleNone;
2. 除此之外,iOS中还可以使用视频视图控制器播放视频MPMoviePlayerViewController
一般以模态的方式弹出全屏播放。
> 使用 MPMoviePlayerViewController
// 初始化
[[MPMoviePlayerViewController alloc] initWithContentURL:]
// 注册通知
// 播放状态改变,播放完成是暂停
[NSNotificationCenter defaultCenter] addObserver: 观察者 selector: 方法 name:MPMoviePlayerPlaybackStateDidChangeNotification object:通知的附加内容 ]
// 播放完成
[NSNotificationCenter defaultCenter] addObserver: 观察者 selector: 方法 name:MPMoviePlayerPlaybackDidFinishNotification object:通知的附加内容 ]
// 模态方式弹出显示视频播放,不直接将播放起放到父视图控制器上
[self presentMoviePlayerViewControllerAnimated:moviePlayerViewController]
/* 此方法是MPMoviePlayerViewController 对UIViewControler 扩展的模态展示方法,增加了一种下拉展示动画效果。仍然可以使用原来的presentViewController: animated: completion:] */
3. 以上两个播放视频的类,自iOS9开始被弃用,替换使用自iOS8开始的AVKit 下的AVPlayerViewController
Image
1. 使用UIImagePickerController (图片选择器) 选择单个图片
> 初始化
[[UIImagePickerController alloc] init]
> 指定代理对象
imagePicker.delegate 协议名字<UINavigationControllerDelegate,UIImagePickerControllerDelegate>
> 设置资源类型/图片来源
imgPicker.sourceType
— UIImagePickerControllerSourceTypePhotoLibrary // 来自设备图片库
— UIImagePickerControllerSourceTypeCamera // 来自照相机
— UIImagePickerControllerSourceTypeSavedPhotosAlbum // 来自相机保存的相册
> 显示图片选择器
[self presentViewController:imgPicker animated: completion:]
> 实现协议方法获取图片数据
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString *,id> *)info
/* info 参数中存储了所选择的图片,注意这里只能是单选的。可通过info中的土资源类型UIImagePickerControllerMediaType判断是否是图片,通过UIImagePickerControllerOriginalImage 获取所选图片的原始图片。
在获取图片后,要压缩图片,UIImageJPEGRepresentation(imgData, 0.1)一般采用此种方式,第二个参数“压缩因子”,越小,图片就越小。也可采用UIImagePNGRepresentation(imgData) 方式,这种方式比前者压缩后要大些。 */
2.[扩展] 使用AssetsLibrary或者PhotoLibrary 实现多选图片,也可借助第三方库实现