java 音频可视化_OpenGL ES 实现可视化实时音频

该原创文章首发于微信公众号字节流动

5df14868900e

可视化实时音频

音频数据的采集

OpenGL 实现可视化实时音频的思路比较清晰,可以利用 Java 层的 API AudioRecorder 采集到未编码的音频裸数据(PCM 数据),也可以利用 OpenSLES 接口在 Native 层采集,然后将采集到的音频数据看作一组音频的强度(Level)值,再根据这组强度值生成网格,最后进行实时绘制。

本文为方便展示,直接采用 Android 的 API AudioRecorder 采集音频裸数据,然后通过 JNI 传入 Native 层,最后生成网格进行绘制。

在使用 AudioRecorder 采集格式为 ENCODING_PCM_16BIT 音频数据需要了解:所采集到的音频数据在内存中字节的存放模式是小端模式(小端序)(Little-Endian),即低地址存放低位、高地址存放高位,所以如果用 2 个字节转换为 short 型的数据需要特别注意。另外,大端序与小端序相反,即低地址存放高位、高地址存放低位。

5df14868900e

Little-Endian 小端序

5df14868900e

Big-Endian 大端序

在 Java 中小端序存储的 byte 数据转为 short 型数值可以采用如下方式:

byte firstByte = 0x10, secondByte = 0x01; //0x0110

ByteBuffer bb = ByteBuffer.allocate(2);

bb.order(ByteOrder.LITTLE_ENDIAN);

bb.put(firstByte);

bb.put(secondByte);

short shortVal = bb.getShort(0);

为了避免数据转换的麻烦,Android 的 AudioRecorder 类也提供了直接可以输出 short 型数组音频数据的 API ,我是踩了坑之后才发现的。

public int read(short[] audioData, int offsetInShorts, int sizeInShorts, int readMode)

Android 使用 AudioRecorder 采集音频的大致流程,在 Java 层对其进行一个简单的封装:

public class AudioCollector implements AudioRecord.OnRecordPositionUpdateListener{

private static final String TAG = "AudioRecorderWrapper";

private static final int RECORDER_SAMPLE_RATE = 44100; //采样率

private static final int RECORDER_CHANNELS = 1; //通道数

private static final int RECORDER_AUDIO_ENCODING = AudioFormat.ENCODING_PCM_16BIT; //音频格式

private static final int RECORDER_ENCODING_BIT = 16;

private AudioRecord mAudioRecord;

private Thread mThread;

private short[] mAudioBuffer;

private Handler mHandler;

private int mBufferSize;

private Callback mCallback;

public AudioCollector() {

//计算 buffer 大小

mBufferSize = 2 * AudioRecord.getMinBufferSize(RECORDER_SAMPLE_RATE,

RECORDER_CHANNELS, RECORDER_AUDIO_ENCODING);

}

public void init() {

mAudioRecord = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLE_RATE,

RECORDER_CHANNELS, RECORDER_

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值