swift 音频编码
音频编码:
原始音频数据(PCM)---------------(编码)------------------ 压缩数据类型(AAC)
第一步:------------------------初始化编码器
// 初始化音频文件结构信息
// 使用音频文件的结构 :AudioStreamBasicDescription
保存录制的音频
创建编码器 : 使用 AudioConverterNewSpecific
设置: 码率使用AudioConverterSetProperty
估算音频大小:使用AudioConverterGetProperty
采样率指数: 获取音频位流中的通道数
AAC音频文件的每一帧由ADTS Header和AAC Audio Data组成。
AAC原始数据块长度是可变的,对原始帧加上ADTS头进行ADTS封装,就形成了ADTS帧。
----------------------------------------------------------------------------------------------
iOS 下 如何进行 AAC 编码
设置输入、输出格式 ( AudioStreamBasicDescription:音频文件的结构)
创建AAC编码器。
转码。
增加ADTS头。
代码如下:
https://blog.csdn.net/jay100500/article/details/52955232 AAC的ADTS头文件
赋给值
// 添加编码器
letaacEncoder =
AACEncode(frequencyInHz: Int(audioSampleRate), channelCount: audioChannelCount,
averageBitrate: audioChannelCount > 1 ? 105000 : 88000)
—————————————— AAC 初始化 : 设置AAC编器的输入、输出格式 ———————————————————————————
// 输入格式
varinDesc: AudioStreamBasicDescription = .init()
// 输出格式
varoutDesc: AudioStreamBasicDescription = .init()
// passing anything except 48000, 44100, and 22050 for mSampleRate results in "!dat"
// OSStatus when querying for kAudioConverterPropertyMaximumOutputPacketSize property
// below
inDesc.mSampleRate = Float64(frequencyInHz)
// passing anything except 2 for mChannelsPerFrame results in "!dat" OSStatus when
// querying for kAudioConverterPropertyMaximumOutputPacketSize property below
inDesc.mChannelsPerFrame = UInt32(channelCount)
inDesc.mBitsPerChannel = 16
inDesc.mFormatFlags = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked
inDesc.mFormatID = kAudioFormatLinearPCM
inDesc.mFramesPerPacket = 1
inDesc.mBytesPerFrame = inDesc.mBitsPerChannel * inDesc.mChannelsPerFrame / 8
inDesc.mBytesPerPacket = inDesc.mFramesPerPacket*inDesc.mBytesPerFrame
self.inDesc = inDesc
outDesc.mFormatID = kAudioFormatMPEG4AAC
outDesc.mFormatFlags = 2
outDesc.mFramesPerPacket = kSamplesPerFrame
outDesc.mSampleRate = Float64(frequencyInHz)
outDesc.mChannelsPerFrame = UInt32(channelCount)
self.outDesc = outDesc
————————————————— 创建AAC编码器————————————————————————
// 保存录制的音频
letsubtype = kAudioFormatMPEG4AAC
// 音频类描述
/*
AudioClassDescription: 用于描述系统中安装的编解码工具
音频编码器组件类型
音频格式AAC
软编码和硬编码
*/
letrequestedCodecs: [AudioClassDescription] = [
.init(
mType: kAudioEncoderComponentType,
mSubType: subtype,
mManufacturer: kAppleSoftwareAudioCodecManufacturer),
.init(
mType: kAudioEncoderComponentType,
mSubType: subtype,
mManufacturer: kAppleHardwareAudioCodecManufacturer)
]
/*
用特定的编码器创建一个音频转换工具对象
param1. 输入格式
param2. 输出格式
param3. 编码器描述类个数
param4. 编码器描述类
param5. 编码器地址
*/
result = AudioConverterNewSpecific(&inDesc, &outDesc, 2, requestedCodecs, &audioConverter)
—————————————————转码————————————————————————————————
/*
用特定的编码器创建一个音频转换工具对象
param1. 输入格式
param2. 输出格式
param3. 编码器描述类个数
param4. 编码器描述类
param5. 编码器地址
*/
result = AudioConverterNewSpecific(&inDesc, &outDesc, 2, requestedCodecs, &audioConverter)
// 采样频率 采样帧队列 (13)
http://wiki.multimedia.cx/index.php?title=MPEG-4_Audio#Audio_Specific_Config
———————————————加ADTS---------------------——————————————————————
得到AAC编码数据后,增加ADTS头。该头用于区分每个AAC数据帧。