android - 使用麦克风作为声音冲击传感器

标签 android audio android-sensors

我想使用Android设备的麦克风作为声音冲击传感器(例如在某些音乐可视化项目中)。

示例:http://www.youtube.com/watch?v=pJGM3PiYpqk

我无法在此处或通过Google找到任何相关内容。

是否可以以尽可能少的延迟并且不记录到文件中来实现?

最佳答案

我正在一个具有声音处理功能的项目,我认为对您有用。据我所知,电话通过采样捕获声音,然后通过pcm(脉冲编码调制)将信号捕获到振幅值,从而通过微型麦克风捕获声音。我们的工作是设置记录器的配置:

    int frequency = 8000;
    int channelConfiguration = AudioFormat.CHANNEL_IN_STEREO;
    int audioEncoding = AudioFormat.ENCODING_PCM_16BIT;
    int blockSize = 256;
    int bufferSize = AudioRecord.getMinBufferSize(frequency,
                channelConfiguration, audioEncoding);

并使用以下配置创建记录器的新实例:
    AudioRecord audioRecord = new AudioRecord(
                MediaRecorder.AudioSource.DEFAULT, frequency,
                channelConfiguration, audioEncoding, bufferSize);

然后开始录制:
    short[] buffer = new short[blockSize];
    float[] toTransform = new float[blockSize];
    try {
        audioRecord.startRecording();
    } catch (IllegalStateException e) {
        Log.e("Recording failed", e.toString());
    }
    while (check) {
            if(isCancelled()) break;
            int bufferReadResult = audioRecord.read(buffer, 0, blockSize);
            // Your code goes here, buffer now has the value of amplitude of sound that you need.

            publishProgress(result);
        }
        try {
            audioRecord.stop();
        } catch (IllegalStateException e) {
            Log.e("Stop failed", e.toString());
        }

记录应该是在后台运行的线程或异步任务。我建议每次捕获声音时都使用Asynctask发布结果。检查类似于记录的控制变量。您可以使用按钮进行控制。

不使用声音的幅度是另一种理想的选择,可以将信号转换到频域。但我认为使用振幅要容易得多

关于android - 使用麦克风作为声音冲击传感器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18776786/

相关文章:

python - 为雷达上的信号播放声音

仅在三星设备中存在 Android 接近传感器问题

android - 如何在后台服务中以非常低的采样率使用加速度计? (以节省电池)

java - 作为一个对 Java 有基本了解的学生,我可以转向 Android 吗?

android - 如何防止配对的蓝牙设备被其他apk连接?

android - 为什么 Android View API 关心 ArrayAdapter 的 getViewTypeCount?

javascript - 如何使音频元素更具响应性?

audio - 注意使用光谱差异的起始检测

android - 使用 getOrientation() 函数获取设备角度

java - 如何在所有 Activity 中显示抽屉导航?