android pcm频谱_基于android的实时音频频谱仪

package com.mobao360.sunshine;

import java.util.ArrayList;

import java.lang.Short;

import android.content.Context;

import android.graphics.Canvas;

import android.graphics.Color;

import android.graphics.DashPathEffect;

import android.graphics.Paint;

import android.graphics.Path;

import android.graphics.PathEffect;

import android.graphics.Rect;

import android.media.AudioRecord;

import android.util.Log;

import android.view.SurfaceView;

public class AudioProcess {

public static final float pi= (float) 3.1415926;

//应该把处理前后处理后的普线都显示出来

private ArrayList inBuf = new ArrayList();//原始录入数据

private ArrayList outBuf = new ArrayList();//处理后的数据

private boolean isRecording = false;

Context mContext;

private int shift = 30;

public int frequence = 0;

private int length = 256;

//y轴缩小的比例

public int rateY = 21;

//y轴基线

public int baseLine = 0;

//初始化画图的一些参数

public void initDraw(int rateY, int baseLine,Context mContext, int frequence){

this.mContext = mContext;

this.rateY = rateY;

this.baseLine = baseLine;

this.frequence = frequence;

}

//启动程序

public void start(AudioRecord audioRecord, int minBufferSize, SurfaceView sfvSurfaceView) {

isRecording = true;

new RecordThread(audioRecord, minBufferSize).start();

new DrawThread(sfvSurfaceView).start();

}

//停止程序

public void stop(SurfaceView sfvSurfaceView){

isRecording = false;

inBuf.clear();

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Android的MediaCodec API来获取音频频谱数据。具体步骤如下: 1. 创建一个MediaExtractor对象,用于读取音频文件中的数据。 2. 选择音频轨道并获取音频格式信息。 3. 创建一个MediaCodec对象,并配置输入和输出格式。 4. 将音频数据输入到MediaCodec对象中,获取解码后的数据。 5. 将解码后的数据转换为PCM数据,并使用FFT算法计算频谱数据。 下面是一段示例代码,演示如何获取音频频谱数据: ```java MediaExtractor extractor = new MediaExtractor(); extractor.setDataSource(audioFilePath); int audioTrackIndex = getAudioTrackIndex(extractor); MediaFormat audioFormat = extractor.getTrackFormat(audioTrackIndex); MediaCodec decoder = MediaCodec.createDecoderByType(audioFormat.getString(MediaFormat.KEY_MIME)); decoder.configure(audioFormat, null, null, 0); decoder.start(); ByteBuffer[] inputBuffers = decoder.getInputBuffers(); ByteBuffer[] outputBuffers = decoder.getOutputBuffers(); MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo(); while (true) { int inputBufferIndex = decoder.dequeueInputBuffer(10000); if (inputBufferIndex >= 0) { ByteBuffer inputBuffer = inputBuffers[inputBufferIndex]; int sampleSize = extractor.readSampleData(inputBuffer, 0); if (sampleSize < 0) { decoder.queueInputBuffer(inputBufferIndex, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM); break; } else { long presentationTimeUs = extractor.getSampleTime(); decoder.queueInputBuffer(inputBufferIndex, 0, sampleSize, presentationTimeUs, 0); extractor.advance(); } } int outputBufferIndex = decoder.dequeueOutputBuffer(bufferInfo, 10000); if (outputBufferIndex >= 0) { ByteBuffer outputBuffer = outputBuffers[outputBufferIndex]; byte[] pcmData = new byte[bufferInfo.size]; outputBuffer.get(pcmData); // 计算频谱数据 int bufferSize = AudioRecord.getMinBufferSize(sampleRate, channelConfig, audioFormat.getInteger(MediaFormat.KEY_PCM_ENCODING)); short[] audioData = new short[bufferSize / 2]; ByteBuffer.wrap(pcmData).order(ByteOrder.LITTLE_ENDIAN).asShortBuffer().get(audioData); double[] fftData = new double[audioData.length * 2]; for (int i = 0; i < audioData.length; i++) { fftData[i * 2] = audioData[i]; fftData[i * 2 + 1] = 0; } FFT.fft(fftData); double[] magnitude = new double[audioData.length]; for (int i = 0; i < audioData.length; i++) { double real = fftData[i * 2]; double imaginary = fftData[i * 2 + 1]; magnitude[i] = Math.sqrt(real * real + imaginary * imaginary); } // 此时magnitude数组中存储着音频频谱数据 decoder.releaseOutputBuffer(outputBufferIndex, false); } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) { // 处理输出格式变化 } } decoder.stop(); decoder.release(); extractor.release(); ``` 在上面的代码中,我们使用FFT算法计算了音频频谱数据。FFT算法可以将时域信号转换为频域信号,从而得到音频频谱信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值