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];} }


0 0
原创粉丝点击