美文网首页
swift 音频解码

swift 音频解码

作者: 我会回来的 | 来源:发表于2022-01-07 16:43 被阅读0次

swift 音频解码

ADTS是AAC音频的传输流格式 

 1、首先创建解码器

 AudioConverterNewSpecific(&sourceASBD,&destASBD, 1, &classspecific, &_audioConverter))中的参数 sourceASBD和destASBD调换一下即可

 2、AAC解码为PCM 

有两个库faad ffmpeg 

Ffmpeg : 体积庞大,功能丰富, API略显复杂。

使用Ffmpeg 库,将AAC 解码为pcm采样数据。    


代码如下:

  private func pushAudioBuffer(_ data: UnsafeRawPointer, size: Int, metadata: AudioBufferMetadata) {

        guardletassetWriter =assetWriterelse{return}

        letdata = data.assumingMemoryBound(to:UInt8.self)

        ifaudioFormat!=nil{

            guardletfirstVideoFrameTime =firstVideoFrameTime,

                firstVideoFrameTime < metadata.ptselse{

                return

            }

            // 解码器大小

            varbufferOut:CMBlockBuffer?

            letmemoryBlock =UnsafeMutableRawPointer.allocate(byteCount: size,

                                                               alignment:MemoryLayout.alignment)

            memoryBlock.initializeMemory(as:UInt8.self,from: data,count: size)

             // 接口构造 CMBlockBufferRef

            let status = CMBlockBufferCreateWithMemoryBlock(

                allocator: kCFAllocatorDefault,

                memoryBlock: memoryBlock,

                blockLength: size,

                blockAllocator: kCFAllocatorDefault,

                customBlockSource:nil,

                offsetToData:0,

                dataLength: size,

                flags: kCMBlockBufferAssureMemoryNowFlag,

                blockBufferOut: &bufferOut)

            //得到CMSampleBuffer 这个待解码的原始数据

            guardletbuffer = bufferOutelse{

                VCLogger.debug("unexpected return")

                return

            }

            vartimingInfo:CMSampleTimingInfo= .init()

            timingInfo.presentationTimeStamp= metadata.pts

            timingInfo.decodeTimeStamp= metadata.dts.isNumeric? metadata.dts: metadata.pts

            writingQueue.async{ [weakself]in

                guardletstrongSelf =self, !strongSelf.exiting.valueelse{return}

                strongSelf.audioSamples.insert(.init(buffer: buffer,timingInfo: timingInfo,size: size,isKeyframe: metadata.isKey),at:0)

                strongSelf.cond.signal()

            }

        }else{

            letmd = metadata

            guardletmetaData = md.dataelse{

                VCLogger.debug("unexpected return")

                return

            }

            ifvideoInput==nil|| !assetWriter.inputs.contains(videoInput!) {

                return

            }

            varacl:AudioChannelLayout= .init()

            acl.mChannelLayoutTag = kAudioChannelLayoutTag_Mono

            // 配置解码后ASBD音频流信息

            var asbd = AudioStreamBasicDescription(

                mSampleRate:48000,

                mFormatID: kAudioFormatMPEG4AAC,

                mFormatFlags:0,

                mBytesPerPacket:0,

                mFramesPerPacket:1024,

                mBytesPerFrame:0,

                mChannelsPerFrame:1,

                mBitsPerChannel:16,

                mReserved:0)

            // 为音频媒体流创建格式描述

            CMAudioFormatDescriptionCreate(

                allocator: kCFAllocatorDefault,

                asbd: &asbd,

                layoutSize: MemoryLayout<AudioChannelLayout>.size,

                layout: &acl,

                magicCookieSize:Int(md.cookieSize),

                magicCookie: &md.cookie,

                extensions:nil,

                formatDescriptionOut: &audioFormat)

             //音频设置

            let audio = AVAssetWriterInput(mediaType: .audio, outputSettings: nil, sourceFormatHint: audioFormat)

            audio.expectsMediaDataInRealTime = true

            audio.languageCode="und"

            ifassetWriter.canAdd(audio) {

                assetWriter.add(audio)

                audioInput= audio

                print("Writer Debug: Add Auido Input Finish")

            }else{

                VCLogger.error("cannot add audio input")

            }

        }

    }

相关文章

  • swift 音频解码

    swift 音频解码 ADTS是AAC音频的传输流格式 1、首先创建解码器 AudioConverterNewSp...

  • FFmpeg小白学习记录(四)音频流编解码流程

    音频解码与编码流程 解码流程 音频编解码流程与视频编解码流程一致,我们可以对 mp4 文件的音频流进行解码,并将解...

  • 多媒体音频播放简单介绍

    概述 基础知识-音频编解码,音频格式,音频会话(session) ios软硬件音频编解码器 音频会话(Audio ...

  • 音频解码流程

    音频解码流程

  • 音视频开发之旅(35) -FFmpeg + AudioTrack

    目录 音频解码流程 解码音频为pcm 使用AudioTrack播放音频 资料 收获 上一篇我们了解了FFmpeg解...

  • 音频解码

    之前写过视频的解码,这里我开始简单介绍音频解码,使用流程基本一样,如果没有看过视频解码请移步 废话不多说,直接开干...

  • 音频解码

    1. 音频格式 有两类主要的音频文件格式: 无损格式,例如WAV,PCM,TTA,FLAC,AU,APE,TAK,...

  • FFmpeg视频解码播放

    在上篇文章中讲到了FFmpeg解码音频,对于FFmpeg解码视频与音频解码流程大致相同。其区别在于播放的方式与逻辑...

  • FFMpeg 解码流程

    1. FFMpeg 解码流程 1.1 FFMpeg解码流程图解 1.2 FFMpeg解码代码流程 以下的音频解码的...

  • FFmpeg4Android:音频解码

    6 FFmpeg4Android:音频解码 音频解码,就是将视频文件中的音频部分抽离出来,生成PCM文件,并使用A...

网友评论

      本文标题:swift 音频解码

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