音频解码流程分析
OpenSLES初始化 -> 初始化音频引擎 -> 子线程解码原始数据到SafeQueue<AVPacket *>队列中 -> 解码器返回解码到输出数据到SafeQueue<AVFrame *> frame_queue 队列 -> 转换音频 -> 引擎播放
音频的解码流程与视频很相似。都是操作原始数据先到packet线程,再被压到frame队列。不同的是,audio解码后用到的是opensles来播放,因此开启来一个线程来处理初始化工作。
opensles的学习可以参考google-sample/sdk的例子:https://github.com/googlesamples/android-ndk/tree/master/native-audio
先来看下opensles初始化的方法:
- 配置播放pcm格式的数据
- 设置缓存队列,把解压的数据回调到播放器中播放
- 貌似没有什么好讲的,可以查看项目代码注释或者查看google官方例子
decode解码
- SafeQueue<AVPacket *> pkt_queue取数据,通过avcodec_send_packet方法解码,此方法再视频解码解释过了。
- avcodec_receive_frame()获得解码数据,并根据当前frame_queue队列的情况判断是否压入队列。
getPcm取frame队列中的数据转换音频,通过转换回调给播放器
1 | /** Convert audio. |