具体代码请看:NDKPractice项目的ffmpeg83
先来看下流程图:
1.获取音频 Meta 信息
1 | extern "C" JNIEXPORT void JNICALL |
2.解码音频数据
关于解码函数 avcodec_decode_audio4 已经过时了,取而代之的是 avcodec_send_packet 和 avcodec_receive_frame 。
1 | // 6.查找解码 |
3.播放音频
播放 pcm 数据目前比较流行的有两种方式,一种是通过 Android 的 AudioTrack 来播放,另一种是采用跨平台的 OpenSLES(直接用的底层操作驱动播放) 来播放,
个人比较倾向于用更加高效的 OpenSLES 来播放音频,大家可以先看看 Google 官方的 native-audio 事例,这里我们先采用 AudioTrack 来播放
AudioTrack 来播:
- 创建 AudioTack 对象
- 启动循环,设置为播放状态 (play)
- 把数据推到指定数组中 (write)
1 | jobject createAudioTrack(JNIEnv *env){ |
这块播放还是有杂音,而且内存持续上涨,下节我们通过多线程播放来解决