iOS - 音频播放简介

音频播放

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
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值