上一回说到音频AAC编码,这回我们把编码后的文件解码,解码的文件就是上一章录制的音频。

在iOS下进行音频解码及播放的大体流程如下:
1、打开 AAC 文件。
2、获取音频格式信息。如通道数,采样率等。
3、从 AAC 文件中取出一帧 AAC 数据。
4、使用 AudioToolbox 解码 AAC 数据包。
5、将解码后的 PCM 数据送给 AudioUnit 播放声音。
6、重复 3-5 步,直到整个 AAC 文件被读完。

AACDecoder.m

- (void)customAudioConfig {//NSURL *url = [[NSBundle mainBundle] URLForResource:@"abc" withExtension:@"aac"];NSFileManager *manager = [NSFileManager defaultManager];NSURL *path = [[manager URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] firstObject];NSURL *url = [path URLByAppendingPathComponent:@"abc.aac"];// 打开 AAC 文件。OSStatus status = AudioFileOpenURL((__bridge CFURLRef)url, kAudioFileReadPermission, 0, &audioFileID); //Open an existing audio file specified by a URL.if (status != noErr) {NSLog(@"打开文件失败 %@", url);return ;}uint32_t size = sizeof(audioStreamBasicDescrpition);status = AudioFileGetProperty(audioFileID, kAudioFilePropertyDataFormat, &size, &audioStreamBasicDescrpition); // Gets the value of an audio file property.NSAssert(status == noErr, @"error");status = AudioQueueNewOutput(&audioStreamBasicDescrpition, bufferReady, (__bridge void * _Nullable)(self), NULL, NULL, 0, &audioQueue); // Creates a new playback audio queue object.NSAssert(status == noErr, @"error");if (audioStreamBasicDescrpition.mBytesPerPacket == 0 || audioStreamBasicDescrpition.mFramesPerPacket == 0) {uint32_t maxSize;size = sizeof(maxSize);AudioFileGetProperty(audioFileID, kAudioFilePropertyPacketSizeUpperBound, &size, &maxSize); // The theoretical maximum packet size in the file.if (maxSize > CONST_BUFFER_SIZE) {maxSize = CONST_BUFFER_SIZE;}packetNums = CONST_BUFFER_SIZE / maxSize;audioStreamPacketDescrption = malloc(sizeof(AudioStreamPacketDescription) * packetNums);}else {packetNums = CONST_BUFFER_SIZE / audioStreamBasicDescrpition.mBytesPerPacket;audioStreamPacketDescrption = nil;}char cookies[100];memset(cookies, 0, sizeof(cookies));// 这里的100 有问题AudioFileGetProperty(audioFileID, kAudioFilePropertyMagicCookieData, &size, cookies); // Some file types require that a magic cookie be provided before packets can be written to an audio file.if (size > 0) {AudioQueueSetProperty(audioQueue, kAudioQueueProperty_MagicCookie, cookies, size); // Sets an audio queue property value.}readedPacket = 0;// 循环执行 3-5步,直到文件结束。for (int i = 0; i < CONST_BUFFER_COUNT; ++i) {AudioQueueAllocateBuffer(audioQueue, CONST_BUFFER_SIZE, &audioBuffers[i]); // Asks an audio queue object to allocate an audio queue buffer.if ([self fillBuffer:audioBuffers[i]]) {// fullbreak;}NSLog(@"buffer%d full", i);}
}void bufferReady(void *inUserData,AudioQueueRef inAQ,AudioQueueBufferRef buffer){NSLog(@"refresh buffer");AACDecoder* player = (__bridge AACDecoder *)inUserData;if (!player) {NSLog(@"player nil");return ;}if ([player fillBuffer:buffer]) {NSLog(@"play end");}}- (bool)fillBuffer:(AudioQueueBufferRef)buffer {bool full = NO;uint32_t bytes = 0, packets = (uint32_t)packetNums;OSStatus status = AudioFileReadPackets(audioFileID, NO, &bytes, audioStreamPacketDescrption, readedPacket, &packets, buffer->mAudioData); // Reads packets of audio data from an audio file.NSAssert(status == noErr, ([NSString stringWithFormat:@"error status %d", status]) );if (packets > 0) {buffer->mAudioDataByteSize = bytes;AudioQueueEnqueueBuffer(audioQueue, buffer, packets, audioStreamPacketDescrption);readedPacket += packets;}else {AudioQueueStop(audioQueue, NO);full = YES;}return full;
}- (void)play {AudioQueueSetParameter(audioQueue, kAudioQueueParam_Volume, 1.0); // Sets a playback audio queue parameter value.AudioQueueStart(audioQueue, NULL); // Begins playing or recording audio.
}

ViewController.m

- (void)decoderPlay{// 播放self.player = [[AACDecoder alloc] init];[self.player play];
}

到这里就把AAC编码的文件给解码播放了。

了解音频AAC编码

Demo下载地址

ios - 音频AAC解码相关推荐

  1. iOS音频AAC视频H264编码 推流最佳方案

    1    功能概况 *  实现音视频的数据的采集 *  实现音视频数据的编码,视频编码成h264,音频编码成aac *  实现音视频数据的发布,将编码好的音视频数据传输到服务器 2 视频和音频编码方案 ...

  2. iOS - 音频AAC编码

    开发中通常会遇到的音频流的处理,我们知道从苹果设备麦克风上面获取的声音是驳杂的,我们利用原生框架<AVFoundation/AVFoundation.h>可以把音频源经过PCM编码后得到音 ...

  3. Android音频开发(七)音频编解码之MediaCodec编解码AAC下

    在上一篇初识MediaCodec中,我们认识了MediaCodec,知道了MediaCodec的基本工作流程和开发注意事项,这一篇我将讲述如何利用MediaCodec编解码AAC. 1:MediaCo ...

  4. android aac硬解码,android AAC的音频硬解码

    android AAC的音频硬解码 上一篇写了AAC音频的硬编码,今天补充硬解码,其实就是硬编码反过来,非常简单 初始化AAC硬解码资源: public int Start() { int iRet ...

  5. 音频编解码·实战篇(1)PCM转至AAC(AAC编码)

    音频编解码·实战篇(1)PCM转至AAC(AAC编码) 作者:柳大·Poechant 博客:blog.csdn.net/poechant 邮箱:zhongchao.ustc@gmail.com 日期: ...

  6. 音频编解码(PCM、G711A、G711U、AAC)理解

    转载于:https://blog.csdn.net/weixin_37779156/article/details/102813455 PCM整理 简介 PCM:又称脉冲编码调制.人耳听到的是模拟信号 ...

  7. iOS音频播放(一):概述

    (本文转自码农人生) 前言 从事音乐相关的app开发也已经有一段时日了,在这过程中app的播放器几经修改,我也因此对于iOS下的音频播放实现有了一定的研究.写这个 系列的博客目的一方面希望能够抛砖引玉 ...

  8. 基于 CoreAudio 的音频编解码(一):音频解码

    系列文章目录 基于 CoreAudio 的音频编解码(一):音频解码 基于 CoreAudio 的音频编解码(二):音频编码 前言 Core Audio 是iOS和MAC系统中的关于数字音频处理的基础 ...

  9. FFMPEG视音频编解码零基础学习方法

    总结]FFMPEG视音频编解码零基础学习方法 在CSDN上的这一段日子,接触到了很多同行业的人,尤其是使用FFMPEG进行视音频编解码的人,有的已经是有多年经验的"大神",有的是刚 ...

最新文章

  1. 初识mysql数据字段属性_初识mysql
  2. SQL获取所有数据库名、表名、储存过程以及参数列表
  3. 学习前端工程师手册--学习记录
  4. linux efi不要boot目录,LINUX下EFIBOOTMGR的使用,删除UEFI主板多余启动项和添加启动项-Go语言中文社区...
  5. boost.asio openssl zlib protobuf icu vs2015编译
  6. 【Linux系统编程学习】C库IO函数与系统IO函数的关系
  7. quill一些插件的配置 注意事项
  8. MemDC,GDI绘制注意点
  9. C语言 找出任意两整数之间的素数以及他们的和
  10. Android 网格视图GridView
  11. 看门狗(APB watchdog)简介,各个寄存器简介,把看门狗挂到APB总线上,看门狗的验证测试(1)
  12. 为什么火车上的网速都超级慢,并且信号极差?
  13. AST语法结构树初学者完整教程
  14. [图解]创建虚拟机以及安装CentOS系统和创建自定义布局
  15. 发光二极管工作电流分析
  16. 【持续更新】Pun多人在线游戏开发教程
  17. html让方块往下移动,JS控制方块自动移动
  18. 常见图片分类及适用场景
  19. 多个服务器数据互通_打造生态循环《剑网3:指尖江湖》第二批服务器数据互通...
  20. Android夜神模拟器

热门文章

  1. C#学生管理系统 -【部分代码2】
  2. vscode cmake 多版本opencv pcl 64/32位
  3. vue项目中自动拉取更新Iconfont(阿里巴巴图标库)
  4. Windows7官方原版iso镜像文件下载链接 ed2k 迅雷打开
  5. 使用QQEM创建效果
  6. a story remind you to me
  7. 计算机网络知识的PPT,计算机网络基础理论知识.ppt
  8. 坚石诚信ETz201应用于ASP.NET项目中
  9. 在线扫描服务器文件大小,还在找在线扫描文档并上传为图像的扫描工具?Dynamic Web TWAIN满足您的需求!...
  10. 大型电商网站架构分析