美文网首页
AV Foundation(二.录制和播放音频)

AV Foundation(二.录制和播放音频)

作者: Trigger_o | 来源:发表于2019-01-09 18:00 被阅读0次

    1.音频会话

    简单的理解,音频会话就是音频功能的抽象类,封装了音频的模式和一些功能.

    1.1音频会话

    AVAudioSessionCategoryAmbient : 游戏,效率应用程序 (混音模式,只能输出音频)
    AVAudioSessionCategorySoloAmbient : 默认模式,游戏,效率应用程序(不能混音,只能输出音频)
    AVAudioSessionCategoryPlayback : 音视频播放(可以选择是否混音,只能输出音频)
    AVAudioSessionCategoryRecord : 录音(不能混音,只能输入音频)
    AVAudioSessionCategoryPlayAndRecord : 语音聊天(可以选择是否混音,可以输入和输出音频)
    AVAudioSessionCategoryAudioProcessing : 离线会话和处理(没有混音,不能输入输出音频)
    AVAudioSessionCategoryMultiRoute : 外部硬件(不能混音,可以输入输出音频)
    根据应用程序的功能,去选择音频会话的模式,另外一些模式下还有可选的options和modes来进一步满足需求.
    配置音频会话

    AVAudioSession * session = [AVAudioSession sharedInstance];
    [session setCategory:AVAudioSessionCategoryRecord error:nil];
    

    2 AVAudioPlayer

    AVAudioPlayer只能播放本地音频,通过文件url或者音频NSData创建播放器示例.

    NSURL *fileUrl = [[NSBundle mainBundle]URLForResource:@"audio" withExtension:@"mp3"];
    AVAudioPlayer *player = [[AVAudioPlayer alloc]initWithContentsOfURL:fileUrl error:nil];
    [player prepareToPlay];
    

    [player prepareToPlay];是预备播放,把音频加载到缓冲器,可以减小播放的延迟.

    [player play];
    [player pause];
    [player stop];
    

    play即播放,pause和stop都会暂停播放,不过stop会撤销prepareToPlay时做的设置.
    音量 volume 音量是从0.0到1.0
    pan值 pan值是立体声效果,从-1.0(左)到1.0(右),默认是0.0(居中)
    倍速 首先需要在prepareToPlay之前设置enableRate为YES.之后修改rate才会起效,范围是0.5到2.0,这个倍速不会改变音调.
    循环 numberOfLoops 设置n为循环n次,-1位无限循环
    音频计量可以获取音频的音量力度的平均值和峰值

    一个完整的例子

    2.1 处理中断事件

    AVAudioPlayer播放音频时,电话呼入,闹钟响起等都会中断音频播放,但是在这之后,音频不会自动恢复,需要代码来实现
    音频会话会在中断事件时发送通知(AVAudioSessionInterruptionNotification). 在通知的userInfo字典中,有一个key(AVAudioSessionInterruptionTypeKey)对应的枚举值(AVAudioSessionInterruptionType)是中断事件的类型,只有两种,开始和结束.
    并且如果是结束中断的通知,userInfo还有一个AVAudioSessionInterruptionOptions的值来表明是否可以继续播放音频.

    2.2 处理线路改变

    当输出线路改变时,比如切换耳机,外置麦克风等设备,音频会话会发送一个通知(AVAudioSessionRouteChangeNotification),userInfo中包含了前一个线路的信息,AVAudioSessionRouteChangeReasonKey对应的值描述了线路变化的原因,其中耳机断开包含在类型AVAudioSessionRouteChangeReasonOldDeviceUnavailable中
    仅仅判断类型是OldDeviceUnavailable是不够的,userInfo中有一个AVAudioSessionRouteChangePreviousRouteKey,代码示例如下

    AVAudioSessionRouteDescription *desc = info[AVAudioSessionRouteChangePreviousRouteKey];
    AVAudioSessionPortDescription *outPut = desc.outputs.firstObject;
    NSString *type = outPut.portType;
    

    portType是字符串,有很多种,其中AVAudioSessionPortHeadphones是耳机.

    3 录制音频

    需要一个用来存储的路径, 一个配置信息字典

    NSDictionary *settings = @{AVFormatIDKey:@(kAudioFormatMPEG4AAC),AVSampleRateKey:@22050.0f,AVNumberOfChannelsKey:@1,AVEncoderBitDepthHintKey:@16,AVEncoderAudioQualityKey:@(AVAudioQualityMedium)};
     AVAudioRecorder * recoder = [[AVAudioRecorder alloc]initWithURL:[NSURL URLWithString:@""] settings:settings error:nil];
    [recoder record];
    [recoder pause];
    [recoder stop];
    

    **3.1 音频格式AVFormatIDKey
    不同的格式需要对应不同的扩展名,最常用的是kAudioFormatMPEG4AAC的".aac"格式,另外caf扩展名可以存储所以音频格式
    **3.2 采样率AVSampleRateKey
    采样率建议使用标准采样率,8000,16000,22050,44100.采样率越高,音频质量越高,文件越大.
    **3.3通道数AVNumberOfChannelsKey
    1是单声道,2是立体声
    **3.4位深AVEncoderBitDepthHintKey
    位深和采样率一样影响音频的质量,单位是dB,常用有8,16,24,32
    **3.5质量AVEncoderAudioQualityKey

    4.测量音频

    [recoder updateMeters];
    [recoder averagePowerForChannel:0];
    [recoder peakPowerForChannel:0];
    

    音频的分贝是从-160dB到0dB,每当要获取分贝值时,首先需要调用[recoder updateMeters];,然后averagePowerForChannel获取平均值,peakPowerForChannel获取峰值,其中0是声道,单声道时,0就是唯一的声道.

    相关文章

      网友评论

          本文标题:AV Foundation(二.录制和播放音频)

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