使用麦克风作为声音传感器

时间:2013-09-13 01:22:13

标签: android audio android-sensors

我想使用Android设备的麦克风作为声音传感器(就像在一些音乐可视化项目中一样)。

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

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

这是否可能在尽可能少的延迟且没有录制到文件的情况下实现?

1 个答案:

答案 0 :(得分:0)

我正在处理一个有声处理的项目,我认为这对你有用。据我所知,手机通过微采样然后通过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。我建议每次捕获声音时使用Asynctask发布结果。检查就像录音的控制变量一样。您可以使用按钮来控制它。

另一个理想是,您不能使用声音的振幅,您可以将信号转换为频域。但我认为使用振幅更容易