iOS音频

作者: solozyx | 来源:发表于2016-08-18 13:41 被阅读597次

iOS中支持的音频播放类型
播放音效System Sound Service
播放本地音频AVFoundataion
播放流媒体音频Audio Queue Service

简单来说,音频可以分为2种
音效
又称短音频,通常在程序中的播放时长为1~2秒
在应用程序中起到点缀效果,提升整体用户体验

音乐
比如游戏中的背景音乐,一般播放时间较长

1.音效的播放

音效又称短音频,是一个声音文件,在应用程序中起到点缀效果,用于提升应用程序的整体用户体验
通常短音效在程序中的播放时长为1~2秒,对于某些特殊动画效果的点缀音效可以略长
由于音效的播放相对比较频繁,为了不影响应用程序的性能,在实际应用中通常使用非压缩的音频格式(AIFF)或者CAF音频格式,从而减低系统在音频解码上的消耗,达到省电的目的
使用系统声音服务播放音效,需要导入AudioToolbox框架
系统声音服务通过SystemSoundID来播放声音文件,对于同一个声音文件,可以创建多个SystemSoundID
系统声音服务是一套C语言的框架
为了提高应用程序性能,避免声音文件被重复加载,通常采用单例模式处理系统声音的播放

// 1.获得音效文件的路径
NSURL *url = [[NSBundle mainBundle] URLForResource:@"m_03.wav" withExtension:nil];

// 2.加载音效文件,得到对应的音效ID
SystemSoundID soundID = 0;
AudioServicesCreateSystemSoundID((__bridge CFURLRef)(url), &soundID);

// 3.播放音效
AudioServicesPlaySystemSound(soundID);

音效文件只需要加载1次

音效播放常见函数总结

加载音效文件
AudioServicesCreateSystemSoundID(CFURLRef inFileURL, SystemSoundID *outSystemSoundID)

释放音效资源
AudioServicesDisposeSystemSoundID(SystemSoundID inSystemSoundID)

播放音效
AudioServicesPlaySystemSound(SystemSoundID inSystemSoundID)

播放音效同时振动(当用户静音时,可以通过振动提示用户注意重要操作)
AudioServicesPlayAlertSound(SystemSoundID inSystemSoundID)
1-音效格式.png

注意:硬件解码器一次只能对一个音频文件解码。在实际应用中通常使用非压缩的音频格式(AIFF)或者CAF音频格式,从而减低系统在音频解码上的消耗,达到省电的目的

2.音频转换工具

转换aiff格式

afconvert -f AIFF -d I8 filename

转换caf格式

afconvert -f caff -d aac -b 32000 filename

批量转换

find . -name '*.mp3' -exec afconvert -f caff -d aac -b 32000 {} \;

3.音乐的播放 AVAudioPlayer

使用AVAudioPlayer可以播放本地音乐,具备以下特点:

能够预先缓存,提高播放的流畅性prepareToPlay
播放起始时间playAtTime
播放控制play/pause/stop
循环播放次数numberOfLoops
播放音量volume
设置播放速度enableRate/rate
音量监控meteringEnabled/peakPowerForChannel/averagePowerForChannel

还可以通过AVAudioPlayer的代理方法监控音乐的播放进度

是否正在播放
@property(readonly, getter=isPlaying) BOOL playing;

时长
@property(readonly) NSTimeInterval duration;

当前的播放位置
@property(readonly) NSTimeInterval currentTime;

播放次数(-1代表无限循环播放,其他代表播放numberOfLoops+1次)
@property NSInteger numberOfLoops;

音量
@property float volume;

是否允许更改速率
@property BOOL enableRate;

播放速率(1是正常速率,0.5是一般速率,2是双倍速率)
@property float rate;

有多少个声道
@property(readonly) NSUInteger numberOfChannels;

加载音乐文件
- (id)initWithContentsOfURL:(NSURL *)url error:(NSError **)outError;
- (id)initWithData:(NSData *)data error:(NSError **)outError;

准备播放(缓冲,提高播放的流畅性)
- (BOOL)prepareToPlay;

播放(异步播放)
- (BOOL)play;

暂停
- (void)pause;

停止
- (void)stop;

3.AVAudioSession单例

AVAudioSession是一个单例,无需实例化即可直接使用。AVAudioSession在各种音频环境中起着非常重要的作用
针对不同的音频应用场景,需要设置不同的音频会话分类

AVAudioSessionCategoryAmbient
混音播放,例如雨声、汽车引擎等,可与其他音乐一起播放

AVAudioSessionCategorySoloAmbient
后台播放,其他音乐将被停止

AVAudioSessionCategoryPlayback
独占音乐播放

AVAudioSessionCategoryRecord
录制音频

AVAudioSessionCategoryPlayAndRecord
播放和录制音频

AVAudioSessionCategoryAudioProcessing
使用硬件解码器处理音频,该音频会话使用期间,不能播放或录音
2-AVAudioSessionCategory音频会话分类.png

后台播放音乐——设置后台任务

+ (UIBackgroundTaskIdentifier)backgroundPlayerID:(UIBackgroundTaskIdentifier)backTaskId
{
    // 1. 设置并激活音频会话类别
    AVAudioSession *session = [AVAudioSession sharedInstance];
    [session AVAudioSessionCategoryPlayback error:nil];
    [session setActive:YES error:nil];
    // 2. 允许应用程序接收远程控制
    [[UIApplication sharedApplication] beginReceivingRemoteControlEvents];
    // 3. 设置后台任务ID
    UIBackgroundTaskIdentifier newTaskId = UIBackgroundTaskInvalid;
    newTaskId = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:nil];
    if (newTaskId != UIBackgroundTaskInvalid && backTaskId != UIBackgroundTaskInvalid) {
        [[UIApplication sharedApplication] endBackgroundTask:backTaskId];
    }
    return newTaskId;
}
3-AirPlay.png
// 后台播放任务Id
UIBackgroundTaskIdentifier  _bgTaskId;

// 设置音频会话,允许后台播放
_bgTaskId = [SoundTool backgroundPlayerID:_bgTaskId];

4.录音

音频录音机参数字典

NSMutableDictionary *setting = [[NSMutableDictionary alloc] init];

// 音频格式
[setting setValue:[NSNumber numberWithInt:kAudioFormatAppleIMA4] forKey:AVFormatIDKey];
// 音频采样率
[setting setValue:[NSNumber numberWithFloat:8000.0] forKey:AVSampleRateKey];
// 音频通道数
[setting setValue:[NSNumber numberWithInt:1] forKey:AVNumberOfChannelsKey];
// 线性音频的位深度
[setting setValue:[NSNumber numberWithInt:8]for Key:AVLinearPCMBitDepthKey];

return setting;
4-AVAudioRecorder录音.png

5.音频队列服务

iOSMac OS X中,音频队列服务提供了一种直接、低开销的方式来录制播放音频。也是苹果公司推荐在iOS和Mac OS X程序中添加录制和播放功能使用的技术

音频队列服务允许录制和播放以下格式的音频:
线性PCM(Linear PCM)
任何苹果平台原生支持的压缩格式
任何用户已经安装相应编码器的其他格式

音频队列服务是纯C接口

音频队列的架构

所有的音频队列都含有相同的基础结构,其中包含:

一组音频队列缓冲区(audio queue buffers),每个音频队列缓冲区都是一个存储音频数据的临时仓库,通常是3个
一个缓冲区队列(buffer queue),音频队列缓冲区的有序列表
一个自己编写的音频队列回调函数(audio queue callback

在录制音频时:回调函数负责将缓冲区中的数据写入磁盘
在播放音频时:回调函数负责从磁盘加载音频数据到缓冲区

5-音频队列服务的录音示意图.png 6-音频队列服务的录音示意图.png 7-音频队列服务的播放示意图.png 8-音频队列服务的播放示意图.png

相关文章

网友评论

      本文标题:iOS音频

      本文链接:https://www.haomeiwen.com/subject/ucyvsttx.html