swift 音频编码

2021-12-29  本文已影响0人  我会回来的

音频编码:  

原始音频数据(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数据帧。 

 

上一篇下一篇

猜你喜欢

热点阅读