美文网首页
swift 音频编码

swift 音频编码

作者: 我会回来的 | 来源:发表于2021-12-29 18:04 被阅读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数据帧。 

     

    相关文章

      网友评论

          本文标题:swift 音频编码

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