iOS - 音频播放简介
来源:互联网 发布:潘粤明 董洁 知乎 编辑:程序博客网 时间:2024/05/23 11:54
音频播放
1.利用System Sound Services
System Sound Services提供C语言风格接口用于播放短的声音,如果对应的设备支持振动,还可以调用振动。
使用 System Sound Services限制
1.音频文件播放长度不能大于30秒
2.必须是线性的音频格式:PCM or IMA4 (IMA/ADPCM)
3.文件格式必须是.caf, .aif, or .wav file
4.声音大小不能改变,依赖于设备设置
5.声音立即播放
6.不支持循环播放 立体声和定位
7.不支持同时播放,即一次只能播放一个声音
实例展示
@interface ViewController ()//用于表示系统音频文件对象@property (nonatomic, assign) SystemSoundID soundFileObject;//可以理解为音频文件的位置和目录@property (nonatomic, assign) CFURLRef soudnFileURLRef;@end
- (void)viewDidLoad {[super viewDidLoad];NSURL *soundFileURL = [[NSBundle mainBundle] URLForResource:@"Two" withExtension:@"caf"];self.soudnFileURLRef = (CFURLRef)[soundFileURL retain];OSStatus ret = AudioServicesCreateSystemSoundID(self.soudnFileURLRef, &_soundFileObject);if (ret != 0) {NSLog(@"create systemSound id failure。");}
//系统声音播放
- (IBAction)playSystemSoud:(UIButton *)sender{AudioServicesPlaySystemSound(self.soundFileObject);}
//系统警告声音播放
- (IBAction)playAlterSound:(UIButton *)sender {AudioServicesPlayAlertSound(self.soundFileObject);}
//震动播放,前提是设备需要支持震动
- (IBAction)playVibate:(UIButton *)sender {AudioServicesPlaySystemSound(kSystemSoundID_Vibrate);}
}
2.利用AVAudioPlayer展示本地音频
1.基本介绍
AVPlayer的实例对象,调用音频播放器可以播放来自文件和内存的音频数据。
在音频播放方面,苹果公司推荐使用AVPlayer,除非你播放的音频数据是来自网络的流媒体,或者需要调用更低层的I/O接口播放音频数据。
可以播放在iOS上可用的任意一种音频文件格式
AVPlayer的控制能力
1.播放任何时长的音乐
2.播放来自文件或内存的音频数据
3.支持循环播放
4.能同时播放多个音频数据,需要多个实例
5.可以直接定位到音频播放的任意一个位置,支持快进,快退
2.AVAudioPlayer常用属性
1、音量
player.volume =0.8; //0.0-1.0之间
2、循环次数
player.numberOfLoops =3; //默认只播放一次,如果是-1表示无限循环
3、播放位置
player.currentTime =15.0; //可以指定从任意位置开始播放
4、声道数
NSUInteger channels = player.numberOfChannels; //只读属性
5、持续时间
NSTimeInterval duration = player.duration; //获取持续时间
3.例子展示
向大家展示的功能是一个简单的播放器,可以用一个UISlider控制进度和显示进度,用另一个UISlider控制音量,一个播放和暂停按钮,一个停止按钮。
1.在文件头加入头文件,因为不加入此头文件,音频类无法使用
#import <AVFoundation/AVFoundation.h>
2.代码
xib上拉过来的一些属性
@interface ViewController ()@property (weak, nonatomic) IBOutlet UISlider *sliderVolume;@property (weak, nonatomic) IBOutlet UISlider *sliderProgress;@property (weak, nonatomic) IBOutlet UIButton *btnPlayAndPause;@property (strong,nonatomic) AVAudioPlayer *audioPlayer;@end
//在viewDidLoad中设置一些属性
- (void)viewDidLoad {[super viewDidLoad];// 创建表示文件路径的对象,音乐为本地音乐NSURL *soundFileURL = [[NSBundle mainBundle] URLForResource:@"倩女幽魂" withExtension:@"mp3"];// 实例化audioPlayer对象NSError *error = nil;self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:soundFileURL error:&error];if (nil != error) {NSLog(@"create AVAudioPlaer instance error.%@",error);return;}// 如果设置成为-1无限循环播放, 类似于单典循环self.audioPlayer.numberOfLoops = 2;// 准备播放audiPlayer[self.audioPlayer prepareToPlay];self.sliderVolume.value = 0.5;self.audioPlayer.volume = self.sliderVolume.value;// 对界面对象做一些配置self.sliderProgress.minimumValue = 0;self.sliderProgress.maximumValue = self.audioPlayer.duration;}
//点击播放按钮,开发播放音乐
- (IBAction)onPalyAndPause:(UIButton *)sender {[NSTimer scheduledTimerWithTimeInterval:0.1 target:self selector:@selector(onTimer:) userInfo:nil repeats:YES];if ([self.audioPlayer isPlaying]) {[self.btnPlayAndPause setTitle:@"播放" forState:UIControlStateNormal];[self.audioPlayer pause];}else{[self.btnPlayAndPause setTitle:@"暂停" forState:UIControlStateNormal];[self.audioPlayer play];}
- (IBAction)onStop:(UIButton *)sender {if ([self.audioPlayer isPlaying]) {[self.audioPlayer stop];self.audioPlayer.currentTime = 0;// 如果调用stop之后, 我们城要调用prepareToPlay为下次播放做准备[self.audioPlayer prepareToPlay]; [self.btnPlayAndPause setTitle:@"播放" forState:UIControlStateNormal];}}
//利用定时器让进度条显示歌曲进度
- (void)onTimer:(NSTimer *)timer{self.sliderProgress.value = self.audioPlayer.currentTime;}
//控制声音大小
- (IBAction)onSliderValueChange:(UISlider *)sender {self.audioPlayer.volume = sender.value;}//控制进度
- (IBAction)onSliderProgresChange:(UISlider *)sender {self.audioPlayer.currentTime = sender.value;}
3.利用AVPlayer展示音频
1.简单的音频展示
- (void)viewDidLoad{[super viewDidLoad];NSString *strURL = @"http://music.baidu.com/data/music/file?link=http://yinyueshiting.baidu.com/data2/music/123850666/12385061093600128.mp3?xcode=af4496becdf45f97ed0afeb1a7a3796c17a5fcb5a3da7702&song_id=123850610";self.player = [[AVPlayer alloc]initWithURL:[NSURL URLWithString:strURL]];}
- (IBAction)onPlayButton:(UIButton *)sender {[self.player play];}
点击播放按钮
即可播放声音,由于苹果公司封装的很好,所以十分容易
2.如何让音频支持后台
在 - (void)viewDidLoad中调用方法
[self setAVPlayerSupportBackgroundPlay];
//让音频支持后台方法
- (void)setAVPlayerSupportBackgroundPlay{UIDevice *device = [UIDevice currentDevice];if ([device respondsToSelector:@selector(isMultitaskingSupported)]) {if (device.multitaskingSupported) {AVAudioSession *audioSession = [AVAudioSession sharedInstance];NSError *error = nil;[audioSession setCategory:AVAudioSessionCategoryPlayback error:&error];if (error!=nil) {NSLog(@"active category error");}}}else{NSLog(@"unSupported background");}}
同时需要在plist文件中增加一行 required background modes
把对应的value值设置为:App plays audio or streams audio/video using AirPlay
3.如何支持远程控制(耳机)
//系统会回调此方法,用来支持远程控制程序
//界面将要呈现的时候, ,设置开始接受远程事件。前且将当前ViewController变成第一响应者
- (void)viewWillAppear:(BOOL)animated{[super viewWillAppear:animated];[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];[self becomeFirstResponder];}
<p>//界面将要消失的时候, 设置结束按收远程事件,并且将当前ViewController取消第一响应者, 以达到不接收远程事件的目的。</p><div></div>- (void)viewDidDisappear:(BOOL)animated{[super viewDidDisappear:animated];[[UIApplication sharedApplication] endReceivingRemoteControlEvents];[self resignFirstResponder];}
//此方法系统自己调用,用来执行远程控制功能
<p></p>- (void)remoteControlReceivedWithEvent:(UIEvent *)event{if (event.type == UIEventTypeRemoteControl) {switch (event.subtype) {case UIEventSubtypeRemoteControlPause://调用音频文件的暂停操作{[self pauseMusic:nil];}break;case UIEventSubtypeRemoteControlPlay://调用播放器的播放动作{[self playMusic];}break;case UIEventSubtypeRemoteControlPreviousTrack:{NSString *str = @"http://music.baidu.com/data/music/file?link=http://yinyueshiting.baidu.com/data2/music/264925/2648931413748861128.mp3?xcode=9d798c1a7c0ff254b41b4256fdb8922c718421d4f4bf1a8b&song_id=264893";self.player = [AVPlayer playerWithURL:[NSURL URLWithString:str]];[self playMusic];//播放上一首音频数据}break;case UIEventSubtypeRemoteControlNextTrack:{//播放下一首音频文件NSString *str = @"http://music.baidu.com/data/music/file?link=http://yinyueshiting.baidu.com/data2/music/122870192/58375641413802861128.mp3?xcode=840e0f17068984974e7ec0f052a053fdeda79a93c0bfc1e7&song_id=5837564";self.player = [AVPlayer playerWithURL:[NSURL URLWithString:str]];[self playMusic];}break;default:break;}}
- (void)pauseMusic:(UIButton*)sender{[self.player pause];}
- (void)playMusic{[self.player play];}
4.利用AVAudioRecorder录制音频
1.头文件
在头文件中加#import <AVFoundation/AVFoundation.h>
2.成员变量
@interface ViewController ()@property (nonatomic, strong) AVAudioRecorder audioReconder; @property (nonatomic, strong) AVAudioPlayer audioPlayer;@property (nonatomic, strong) NSURL soundFilePath; @property (weak, nonatomic) IBOutlet UIButton btnReconder; @property (weak, nonatomic) IBOutlet UIButton *btnPlay;@end
3.viewDidLoad
- (void)viewDidLoad {[super viewDidLoad];self.soundFilePath = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/recordTest.caf",[[NSBundle mainBundle] resourcePath]]];NSError *error = nil;NSMutableDictionary *recordSettings = [[NSMutableDictionary alloc] initWithCapacity:10];NSNumber *formatObject = [NSNumber numberWithInt:kAudioFormatAppleIMA4];[recordSettings setObject:formatObject forKey:AVFormatIDKey];[recordSettings setObject:[NSNumber numberWithFloat:44100.0] forKey:AVSampleRateKey];[recordSettings setObject:[NSNumber numberWithInt:2] forKey:AVNumberOfChannelsKey]; //1.单声道 2.立体声[recordSettings setObject:[NSNumber numberWithInt:16] forKey:AVLinearPCMBitDepthKey]; //采样位[recordSettings setObject:[NSNumber numberWithInt:AVAudioQualityHigh] forKey:AVEncoderAudioQualityKey];self.audioReconder = [[AVAudioRecorder alloc] initWithURL:self.soundFilePath settings:recordSettings error:&error];if (error != nil) {NSLog(@"instance audioReconder error.%@",error);}[self.audioReconder prepareToRecord];
4.点击录制按钮开始录制
- (IBAction)recordAudio:(UIButton *)sender {if ([self.audioReconder isRecording]) {[self.btnReconder setTitle:@"录音" forState:UIControlStateNormal];[self.audioReconder stop];}else{[self.btnReconder setTitle:@"停止" forState:UIControlStateNormal];[self.audioReconder record];}}
5.点击播放按钮,播放音乐
- (IBAction)playAudio:(UIButton *)sender {if ([self.audioPlayer isPlaying]) { [self.btnPlay setTitle:@"播放" forState:UIControlStateNormal]; [self.audioPlayer pause]; }else { NSError *error = nil; self.audioPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:self.soundFilePath error:&error]; if (error != nil) { NSLog(@"instance audioPlayer error.%@",error); } [self.audioPlayer prepareToPlay]; [self.btnPlay setTitle:@"暂停" forState:UIControlStateNormal]; [self.audioPlayer play];} }
- iOS - 音频播放简介
- iOS音频播放编程简介
- ios音频播放--归纳
- ios播放音频
- ios 播放音频
- ios音频播放
- ios音频播放
- IOS音频播放概述
- iOS开发>>>音频播放
- ios音频播放
- iOS 音频播放 AVAudioPlayer
- iOS播放MP3音频
- IOS:音频播放
- IOS AVAudioPlayer 音频播放
- iOS音频播放
- iOS音频播放问题
- IOS开发 音频播放
- IOS 音频播放方法
- 浏览器userAgent大全
- SQL Server UPDATE语句用于更新数据
- BZOJ 3123 SDOI 2013 森林 可持久化线段树+启发式合并
- ios android图设计
- Android开发之数据库Sqlite
- iOS - 音频播放简介
- jsp中的include和forward
- UserAgent的历史变迁
- 情报学的主要学术期刊
- Java核心技术卷I:基础知识(原书第8版):12.2 简单泛型类的定义
- Java继承、抽象、接口、多态
- JSON-LIB使用
- qt arm 中文显示解决
- iOS 多线程 (一)