在iOS开发中,主要使⽤用四种⽅式来播放音频:php
System Sound Services是最底层也是最简单的声音播放服务, 经过调用AudioServicesPlaySystemSound 这个函数就能够播放一些简单的音频文件缓存
使用场景 : 适合播放一些很小的提示或者警告音网络
局限性:session
一、声音长度小于30秒框架
二、格式 : IMA4, WAVless
三、不能控制播放的进度iphone
四、调用方法后当即播放声音ide
五、没有循环播放和立体声音播放函数
OpenAL : 跨平台的开源音频处理借口ui
优点:
支持更多的格式
能够播听任意长度的音频
支持循环播放
能够同步播放多个音频文件
控制播放进度以及从音频的任意一点开始播放
- (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); }
使⽤用简单方便,但只能播放本地音频,不支持流媒体播放。⽀持的⾳频格式有:
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; }
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); }
音频队列主要处理流媒体播放,提供了强⼤且灵活的API接口(C函数的接口), 但处理起来也较为复杂
最适合开发游戏的音频
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则不能够。
2、属性设置
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(@"相机不可用!"); }