13|如何使用硬件编码器来编码 AAC?
Android 平台的硬件编码器 MediaCodec
- 深入了解
- 翻译
- 解释
- 总结
移动平台上利用硬件编码器进行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