上一节我们讲了如何基于ffmpeg-android工程编译安卓上的支持音频的ffmpeg静态库,这篇文章我们将介绍如何封装安卓的解码器。
首先,为了能让我们的app调用调用,我们需要定义一套Java的native接口,解码器主要有三个接口:
- create 创建解码器,参数分别为:
- codec:音频编码格式,参考EasyTypes.h里面的EASY_SDK_AUDIO_CODEC_*宏定义;
- sample_rate:采样率,通常为8000、44000等等;
- channels:通道数,1、2分别表示单通道、双通道;
- sample_bit:采样精度,通常为16bit;
返回解码器句柄,即后续接口里面用到的handle
- decode 解码,参数为:
- handle :解码器句柄
- buffer:要解码的buffer(编码后的音频数据)
- offset:编码数据在buffer里的起始位置
- length:编码数据的长度
- pcm:解码后的pcm数据
- outLen 长度至少为1的int数组,如果解码成功,那outLen[0]被置为pcm的数据长度
- close 关闭解码器,参数为解码器的句柄。关闭后句柄无效,应该置为0.
package org.easydarwin.audio;
/**
* Created by John on 2016/3/18.
*/
public class AudioCodec {
static {
System.loadLibrary("AudioCodecer");
}
public static native int create(int codec, int sample_rate, int channels, int sample_bit);
public static native int decode(int handle, byte[] buffer, int offset, int length, byte[] pcm, int[] outLen);
public static native void close(int handle);
}
接下来我们要实现相应的native接口,头文件可通过调用javah命令(这里不再详述)来生成。以AAC解码来说明,create代码片段如下:
// 创建获取解码器
AVCodec *pCodec = avcodec_find_decoder(AV_CODEC_ID_AAC);
if (pCodec == NULL)
{
LOGI("find aac decoder error");
printf("find aac decoder error\r\n");