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))
设置存放路径:
-
letpath: String= (NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last?? nil)!
-
-
let order = voiceList.count as Int
-
-
let namePath = "/Record\(String(describing: order)).wav"
-
-
let voiceFilePath = path.appending(namePath)
进行录音设置:
(详情见附录1)
-
letrecordSetting = [
-
-
AVFormatIDKey: kAudioFormatLinearPCM,
-
-
AVSampleRateKey: 8000.0,
-
-
AVNumberOfChannelsKey: 1,
-
-
AVLinearPCMBitDepthKey: 16,
-
-
AVLinearPCMIsNonInterleaved: false,
-
-
AVLinearPCMIsFloatKey: false,
-
-
AVLinearPCMIsBigEndianKey: false
-
-
] 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/
---------------------