快手 · 移动端音视频开发实战
展晓凯
快手回森技术负责人
12246 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 25 讲
快手 · 移动端音视频开发实战
15
15
1.0x
00:00/00:00
登录|注册

13|如何使用硬件编码器来编码 AAC?

你好,我是展晓凯。今天我们一起学习使用移动平台的硬件编码器编码 AAC。
上一节课,我们学习了 AAC 编码格式,还用 FFmpeg 书写了一个 AAC 编码工具类,这节课我们一起学习一下如何使用平台自身提供的硬件编码方法来给音频编码。因为两个平台的硬件编码器编码出来的是裸的 ES 流,如果要保存为可播放的 AAC,还需要自己加上 ADTS 的头。

Android 平台的硬件编码器 MediaCodec

我们先来看如何使用 Android 平台提供的 MediaCodec 来编码 AAC。MediaCodec 是 Android 系统提供的硬件编码器,它可以利用设备的硬件来完成编码,大大提升了编码的效率,并且可以节省 CPU,让你的 App 运行起来更加流畅。
但使用 MediaCodec 编码对 Android 系统是有要求的,必须是 4.1 以上的系统,Android 的版本代号在 Jelly_Bean 以上。而且因为 Android 设备的碎片化太严重,所以兼容性方面不如软件编码好,你可以根据自己的实际情况决定是否使用 Android 平台的硬件编码能力。
下面我们来看 MediaCodec 使用方法。类似于软件编码提供的三个接口方法,这里也提供三个接口方法,分别完成初始化、编码数据和销毁编码器操作。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

移动平台上利用硬件编码器进行AAC编码的方法是本文的重点。作者详细介绍了在Android和iOS平台上使用硬件编码器进行AAC编码的方法,包括初始化、编码和销毁操作。在Android平台上,介绍了使用MediaCodec进行AAC编码的方法;在iOS平台上,介绍了使用AudioToolbox的Audio Converter Services进行AAC编码的方法。文章重点介绍了在初始化过程中配置编码器的参数,并将PCM数据送给硬件编码器进行编码,最后添加ADTS头部并输出AAC数据。在编码过程中,需要实现填充PCM数据的回调函数,并在编码成功后输出AAC数据。总的来说,本文为读者提供了实用的技术指导,涵盖了Android和iOS平台的AAC编码方法,以及硬件编码器的初始化、编码和销毁操作。对于需要在移动平台进行音频编码的开发者具有一定的参考价值。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《快手 · 移动端音视频开发实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(2)

  • 最新
  • 精选
  • peter
    请教老师几个问题啊: Q1:AAC可以通过硬件编码,也可以通过硬件解码吗? Q2:硬件编码只能对于AAC吗?可以用于其他类型的音频文件吗? 比如mp3。 Q3:MediaCodec对应的硬件设备叫什么啊? 就是一个专门的编解码芯片吗?可以查询手机是否有硬件编解码芯片吗? Q4:inputBuffer和outputBuffers是MediaCodec内部维护的吧。那外部是否可以控制buffer的数量和大小?(即,上层应用是否可以控制?) Q5:codec.queueInputBuffer(bufferIndex,0,len,time,0), 这行代码功能是什么?把时间值填入音频文件吗? 如果是填入时间值的话,能播放出来吗? Q6:安卓平台的代码中,编码部分,哪一行代码是编码的? 按道理,应该有一句类似 encode()的代码,但是没有看到这样的代码。难道是把数据放到buffer以后自动编码吗? Q7:安卓平台编码部分,哪一项表明是AAC编码啊? 文中列出的代码中, 似乎没有看到哪一项标志是AAC啊。(也许是没有看到) Q8:编码以后怎么还要放回到待编码填充队列? 文中有一句“需要我们自己添加上 ADTS 头部,然后写文件,最后把这个 outputBuffer 放回待编码填充队列里面去”, 已经完成编码了啊,怎么还需要这个操作? Q9:iOS代码,老师用OC还是swift编码? Q10:讲硬件编码,怎么会用软件编码? 本讲是说明硬件编码的,但文中iOS部分有一句“编码的实现方式使用兼容性更好的软件编码方式 kAppleSoftwareAudioCodecManufacturer”,怎么又用到软件编码了?

    作者回复: A1: 可以的; A2: mp3貌似不支持,并且现在App场景下生产几乎不会再使用mp3格式了; A3:底层应该使用的是OpenMax,硬件设备方面我没有了解过; A4: 不可以 A5:将填充好的PCM交给MediaCodec进行编码,时间相当于是这个PCM buffer代表的时间 A6: 看A5 A7: MediaCodec.createEncoderByType("audio/mp4a-latm"); A8:就是将outputBuffer放回MediaCodec中,这样MediaCodec才可以将编码成功的AAC再放进去,可以看那个原理图理解 A9: 一般底层(与音视频息息相关)用OC,上层(业务层)用swift A10: 你看的还是比较仔细的,这里是苹果自己的命名,使用这一个是兼容性最好的,如果真用另外的常量,兼容性不好的,但是即便使用这个速度也比ffmpeg编码AAC快的多。

    2022-08-22归属地:北京
    2
  • keepgoing
    老师请教一下,kAudioFormatFlagIsPacked是表示交错存储吗,跟其对应的平面存储请问是kAudioFormatFlagIsNonInterleaved吗。如果把输入输出对调一下换成解码场景,参数设置是不是就反过来了,但同样要考虑交错和平铺两种数据格式对吧

    作者回复: 理解是对的。

    2022-12-18归属地:北京
    2
收起评论
显示
设置
留言
2
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部