一、音频
在iOS开发中,主要使⽤用四种⽅式来播放音频:
- System Sound Services (系统声音服务)
- AVAudioPlayer (高级音频播放器) : 只能播放一个完整的音频, 完全下载好的
- AVPlayer(负责视频操作,例如播放,暂停,声音大小,跳到指定时间)
- Audio Queue Services (播放和录制音频服务)
- OpenAL(跨平台的开源的音频处理接口)
1.1 System Sound Services(系统声音服务)
System Sound Services是最底层也是最简单的声音播放服务, 通过调用AudioServicesPlaySystemSound 这个函数就可以播放一些简单的音频文件
使用场景 : 适合播放一些很小的提示或者警告音
局限性:
1、声音长度小于30秒
2、格式 : IMA4, WAV
3、不能控制播放的进度
4、调用方法后立即播放声音
5、没有循环播放和立体声音播放
OpenAL : 跨平台的开源音频处理借口
优势:
支持更多的格式
可以播放任意长度的音频
支持循环播放
可以同步播放多个音频文件
控制播放进度以及从音频的任意一点开始播放
- (void)playSystemAudio
{
// 系统声音ID列表http://iphonedevwiki.net/index.php/AudioServices
// 直接播放系统指定ID的声音
// AudioServicesPlaySystemSound(1002);
SystemSoundID soundID;
//用NSBundle来返回音频文件路径
NSString *path = [[NSBundle mainBundle] pathForResource:@"msg" ofType:@"wav"];
NSURL *url = [NSURL fileURLWithPath:path];
//建立SystemSoundID对象,但是这里要传地址(加&符号)。 第一个参数需要一个CFURLRef类型的url参数,要新建一个NSString来做桥接转换(bridge),而这个NSString的值,就是上面的音频文件路径
// 将本地的声音注册为系统声音
AudioServicesCreateSystemSoundID((__bridge CFURLRef _Nonnull)(url), &soundID);
// 播放系统声音
// AudioServicesPlaySystemSound(soundID);
// 播放提示音,带震动
AudioServicesPlayAlertSound(soundID);
}
1.2 AVAudioPlayer (高级音频播放器)
使⽤用简单方便,但只能播放本地音频,不支持流媒体播放。⽀持的⾳频格式有:
AAC
AMR(AdaptiveMulti-Rate, aformatforspeech) ALAC(AppleLossless)
iLBC(internetLowBitrateCodec, anotherformatforspeech) IMA4(IMA/ADPCM)
linearPCM(uncompressed)
μ-lawanda-law
MP3(MPEG-1audiolayer3
AVAudioPlayer不可以播放网络URL,但是可以播放NSData,所以我们可以通过网络URL去创建NSData,然后在通过AVAudioPlayer来播放NSData,但此法并不可取,因为AVAudioPlayer只能播放一个完整的文件,并不支持流式播放,所以必须是缓冲完才能播放,所以如果网络文件过大抑或是网速不够岂不是要等很久?所以播放网络音频我们一般用音频队列。
步骤一:AVAudioPlayer 包含在 AVFoundation 框架中,所以开发的时候首先导入音频的框架 AVFoundation.framework
引入头文件
#import <AVFoundation/AVFoundation.h>
步骤二:
创建一个AVAudioPlayer以后你就可以对它的各种属性进行访问或设置了 。
- (AVAudioPlayer *)audioPlayer
{
if (!_audioPlayer) {
// 设置后台播放,先要在info.plist 文件中添加 Required background modes项并且添加item: App plays audio or streams audio/video using AirPlay
AVAudioSession *session = [[AVAudioSession alloc] init];
[session setActive:YES error:nil];
[session setCategory:AVAudioSessionCategoryPlayback error:nil];
//从budle路径下读取音频文件
NSString *path = [[NSBundle mainBundle] pathForResource:@"贰佰-狗日的青春" ofType:@"mp3"];
//把音频文件转换成url格式
NSURL *url = [NSURL fileURLWithPath:path];
_audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:nil];
//设置代理
_audioPlayer.delegate = self;
//设置最大音量
self.progressView.maximumValue = _audioPlayer.duration;
//音量 0.0 ~ 1.0 之间
_audioPlayer.volume = 0.5;
//预播放
[_audioPlayer prepareToPlay];
[self showAudioInfo];
}
return _audioPlayer;
}
1.3 AVPlayer
iOS4.0以后,可以使用AVPlayer播放本地音频和支持流媒体播放,但提供接口较
少,处理音频不够灵活
- (void)palyerCurrentTime:(NSTimer *)timer
{
// 获取播放的时间进度:currentTime
float timeValue = (float)self.player.currentItem.currentTime.value / self.player.currentItem.currentTime.timescale;
NSLog(@"当前时间:%f",timeValue);
// 获取在线播放的媒体加载好的时间: loadedTimeRanges
NSValue *loadTimeValue = [self.player.currentItem.loadedTimeRanges lastObject];
CMTimeRange timeRange;
[loadTimeValue getValue:&timeRange];
NSLog(@"loadTime:%f",(float)timeRange.duration.value/timeRange.duration.timescale);
}
1.4 Audio Queue Services (播放和录制音频服务)
音频队列主要处理流媒体播放,提供了强⼤且灵活的API接口(C函数的接口), 但处理起来也较为复杂
1.5 OpenAL(跨平台的开源的音频处理接口)
最适合开发游戏的音频
OpenAL 包含三个 实体:Listener(听者)、Source(音源)、 Buffer(缓存)
Audio Queue Services 主要用来实现录制音频,为了简化音频文件的处理,通常还需要使用到AudioFileServices
② 开发步骤
1.获取device
2.将context关联到device
3.将数据放入buffer
4.将buffer链接到一个source
5.播放source
功能说明:
简单的实现了播放流式PCM数据的功能
使用方法: (.h文件内也有详细说明)
1. 导入OpenAL.framework
2. alloc/init方法创建对象
3. 调用initOpenAL方法初始化OpenAL
4. 使用insertPCMDataToQueue:size:方法将PCM数据加载到缓冲队列里, 会自动播放
5. 不用的时候, 先调用clean方法关闭OpenAL然后再销毁对象. (不clean的话, 下次初始化会有问题)
二、视频
iOS里面视频播放用的是AVPlayer (包含在AVFoundation框架内) 与AVAudioPlayer有点类似, 但是AVPlayer的功能更加强大, 它可以用来播放音频也可以用来播放视频. 而且在播放音频方面AVPlayer可以直接播放网络音频.
MPMoviePlayerController 与AVAudioPlayer有点类似,前者播放视频,后者播放音频,不过也有很大不同,MPMoviePlayerController 可以直接通过远程URL初始化,而AVAudioPlayer则不可以。
二、属性设置
1.控制器样式
可以使用下列样式:
MPMovieControlModeDefault 显示播放/暂停、音量和时间控制
MPMovieControlModeVolumeOnly 只显示音量控制
MPMovieControlModeHidden 没有控制器
2.屏幕宽高比例
你可以使用下列宽高比值:
MPMovieScallingModeNone 不做任何缩放
MPMovieScallingModeAspectFit 适应屏幕大小,保持宽高比
MPMovieScallingModeAspectFill 适应屏幕大小,保持宽高比,可裁剪
MPMovieScallingModeFill 充满屏幕,不保持宽高比
AVPlayerLayer(负责视频的可视区域,视频的播放模式,注意是CALayer,不能接受触摸)
AVPlayerItem(表示AVPlayer播放的资源对象,可以监听其状态)
三、相机、相册
//使用相机前先判定设备是否可以
if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) {
self.imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
相机拍照设置
// 是否可以编辑
self.imagePicker.allowsEditing = YES;
// 修改相机呈现视图的transform
self.imagePicker.cameraViewTransform = CGAffineTransformMakeRotation(M_PI_2);
/* 设置摄像头的模式
UIImagePickerControllerCameraDeviceRear, 后置
UIImagePickerControllerCameraDeviceFront 前置
*/
self.imagePicker.cameraDevice = UIImagePickerControllerCameraDeviceRear;
// 设置闪光灯,默认自动
self.imagePicker.cameraFlashMode = UIImagePickerControllerCameraFlashModeOff;
摄影设置
// 媒体类型
self.imagePicker.mediaTypes = @[(NSString *)kUTTypeMovie];
// 相机模式为 video
self.imagePicker.cameraCaptureMode = UIImagePickerControllerCameraCaptureModeVideo;
// 视频的质量
self.imagePicker.videoQuality = UIImagePickerControllerQualityType640x480;
[self presentViewController:self.imagePicker animated:YES completion:NULL];
} else {
NSLog(@"相机不可用!");
}