iOS之音频录制及播放

https://www.jianshu.com/p/fb7dfb033989

https://blog.csdn.net/u014084081/article/details/89027144

https://blog.csdn.net/crazy_sunshine/article/details/93715973

1)Demo环境:

Swift4.2,

Xcode10.1

2)Demo地址:

https://github.com/cxymq/RecordForChat

3)AVAudioSession学习记录

https://blog.csdn.net/Crazy_SunShine/article/details/80104838

步骤如下:

1.需要申请麦克风权限

2.调用 AVFoundation 的API 

主要用到 AVAudioRecorder(录音) 、AVAudioPlayer(播放)、AVAudioSession(设置音频硬件设备)

录音开始前,先检测权限,如果允许,则设置音频硬件设备:

audioS.setCategory(AVAudioSession.Category.playAndRecord, mode: AVAudioSession.Mode.default, options: AVAudioSession.CategoryOptions.defaultToSpeaker)
audioS.setActive(true, options: AVAudioSession.SetActiveOptions.init(rawValue: 0))

设置存放路径:

  1.  
    letpath: String= (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?? nil)!
  2.  
     
  3.  
    let order = voiceList.count as Int
  4.  
     
  5.  
    let namePath = "/Record(String(describing: order)).wav"
  6.  
     
  7.  
    let voiceFilePath = path.appending(namePath)

进行录音设置:

(详情见附录1)

  1.  
    letrecordSetting = [
  2.  
     
  3.  
    AVFormatIDKey: kAudioFormatLinearPCM,
  4.  
     
  5.  
    AVSampleRateKey: 8000.0,
  6.  
     
  7.  
    AVNumberOfChannelsKey: 1,
  8.  
     
  9.  
    AVLinearPCMBitDepthKey: 16,
  10.  
     
  11.  
    AVLinearPCMIsNonInterleaved: false,
  12.  
     
  13.  
    AVLinearPCMIsFloatKey: false,
  14.  
     
  15.  
    AVLinearPCMIsBigEndianKey: false
  16.  
     
  17.  
    ] as [String : Any]

然后调用 record() 开始录音。

播放录音,只需要提供音频路径,调用 play() 即可。

 附录:

1.录音设置标注(参考:https://www.jianshu.com/p/692304a8fc95

AVFormatIDKey

录音的文件格式

CF_ENUM(AudioFormatID)

{

    kAudioFormatLinearPCM               = 'lpcm',

    kAudioFormatAC3                     = 'ac-3',

    kAudioFormat60958AC3                = 'cac3',

    kAudioFormatAppleIMA4               = 'ima4',

    kAudioFormatMPEG4AAC                = 'aac ',

    kAudioFormatMPEG4CELP               = 'celp',

    kAudioFormatMPEG4HVXC               = 'hvxc',

    kAudioFormatMPEG4TwinVQ             = 'twvq',

    kAudioFormatMACE3                   = 'MAC3',

    kAudioFormatMACE6                   = 'MAC6',

    kAudioFormatULaw                    = 'ulaw',

    kAudioFormatALaw                    = 'alaw',

    kAudioFormatQDesign                 = 'QDMC',

    kAudioFormatQDesign2                = 'QDM2',

    kAudioFormatQUALCOMM                = 'Qclp',

    kAudioFormatMPEGLayer1              = '.mp1',

    kAudioFormatMPEGLayer2              = '.mp2',

    kAudioFormatMPEGLayer3              = '.mp3',

    kAudioFormatTimeCode                = 'time',

    kAudioFormatMIDIStream              = 'midi',

    kAudioFormatParameterValueStream    = 'apvs',

    kAudioFormatAppleLossless           = 'alac',

    kAudioFormatMPEG4AAC_HE             = 'aach',

    kAudioFormatMPEG4AAC_LD             = 'aacl',

    kAudioFormatMPEG4AAC_ELD            = 'aace',

    kAudioFormatMPEG4AAC_ELD_SBR        = 'aacf',

    kAudioFormatMPEG4AAC_ELD_V2         = 'aacg',   

    kAudioFormatMPEG4AAC_HE_V2          = 'aacp',

    kAudioFormatMPEG4AAC_Spatial        = 'aacs',

    kAudioFormatAMR                     = 'samr',

    kAudioFormatAMR_WB                  = 'sawb',

    kAudioFormatAudible                 = 'AUDB',

    kAudioFormatiLBC                    = 'ilbc',

    kAudioFormatDVIIntelIMA             = 0x6D730011,

    kAudioFormatMicrosoftGSM            = 0x6D730031,

    kAudioFormatAES3                    = 'aes3',

    kAudioFormatEnhancedAC3             = 'ec-3',

    kAudioFormatFLAC                    = 'flac',

    kAudioFormatOpus                    = 'opus'

};

  • kAudioFormatLinearPCM: 音频的原始文件(caf)

  • kAudioFormatMPEG4AAC: aac文件格式的音频

注意

文件格式不可以直接.mp3格式,会报错

AVSampleRateKey

采用率(赫兹)``

常用的有

  • 8,000 Hz: 电话所用采样率, 对于人的说话已经足够

  • 11,025 Hz: 说话

参考文章:

https://baike.baidu.com/item/%E9%9F%B3%E9%A2%91%E9%87%87%E6%A0%B7%E7%8E%87/9023551

AVNumberOfChannelsKey

采用通道数,一般有:

  • 1: 单声道

  • 2: 双声道

linear PCM keys

AVLinearPCMBitDepthKey

采样深度,影响声音质量,比如从caf转mp3,如果设置为8的话,声音可能会失真,需要设置更高一点(比如16)

取值有: 8, 16, 24, 32

AVLinearPCMIsBigEndianKey

  • YES: 大端模式

  • NO: 小端模式

参考文章:

https://blog.csdn.net/chivalrousli/article/details/38419995

AVLinearPCMIsFloatKey

是否支持浮点处理

AVLinearPCMIsNonInterleaved

交叉的

audio file type key11.0 之后

AVAudioFileTypeKey

AudioFile.h文件中可以查看具体的

encoder property keys

编码属性

AVEncoderAudioQualityKey

编码质量

取值有:

typedef NS_ENUM(NSInteger, AVAudioQuality) {

    AVAudioQualityMin    = 0,

    AVAudioQualityLow    = 0x20,

    AVAudioQualityMedium = 0x40,

    AVAudioQualityHigh   = 0x60,

    AVAudioQualityMax    = 0x7F

};

AVEncoderAudioQualityForVBRKey

动态比特率,取值是 AVAudioQuality,只和AVAudioBitRateStrategy_Variable有关

AVEncoderBitRateKey

编码比特率

注意

AVEncoderBitRateKey和AVEncoderBitRatePerChannelKey只需要设置一个 ;only one of AVEncoderBitRateKey and AVEncoderBitRatePerChannelKey should be provided.

AVEncoderBitRatePerChannelKey

每个声道的比特率

AVEncoderBitRateStrategyKey

编码比特率的策略

取值有:

/* values for AVEncoderBitRateStrategyKey */

AVF_EXPORT NSString *const AVAudioBitRateStrategy_Constant              NS_AVAILABLE(10_9, 7_0);

AVF_EXPORT NSString *const AVAudioBitRateStrategy_LongTermAverage       NS_AVAILABLE(10_9, 7_0);

AVF_EXPORT NSString *const AVAudioBitRateStrategy_VariableConstrained   NS_AVAILABLE(10_9, 7_0);

AVF_EXPORT NSString *const AVAudioBitRateStrategy_Variable              NS_AVAILABLE(10_9, 7_0);

AVEncoderBitDepthHintKey

取值 8 to 32

-----------------------------------------------------------

个人博客:https://blog.csdn.net/Crazy_SunShine

Github:https://github.com/cxymq

个人公众号:Flutter小同学

个人网站:http://chenhui.today/
--------------------- 

原文地址:https://www.cnblogs.com/itlover2013/p/14414236.html