【问题标题】:android AudioRecord amplitude reading from MIC从 MIC 读取的 android AudioRecord 幅度
【发布时间】:2012-05-14 07:33:44
【问题描述】:

我正在尝试录制来自 MIC 的声音并绘制实时图表。我能够记录和绘制图表。问题是使用下面的代码记录的值不准确,例如......下面的图像是我在没有声音时得到的。我已经看到使用 fft 的示例,但我不确定这对我的情况是否有帮助,因为我正在尝试绘制时域图并且我认为没有将其转换为频域的目的(目前)。其他人正在使用平均功率,这可能会有所帮助,但我不确定。

感谢您的帮助。

bufferSize = AudioRecord.getMinBufferSize(RECORDER_SAMPLERATE,RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING);

    recorder = new AudioRecord(MediaRecorder.AudioSource.MIC,
            RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);

    short data [] = new short[bufferSize];

    while (!Thread.interrupted()) {

        recorder.startRecording();

        recorder.read(data, 0, bufferSize);

        recorder.stop();

        for (short s : data)
        {
            try {
                Thread.sleep((long) 300.00);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            postUI (Math.abs(s));
        }
    }

    recorder.release();

【问题讨论】:

  • 嗨,您是如何在录音机中获得声音幅度的,请帮忙
  • recorder = new AudioRecord(MediaRecorder.AudioSource.MIC, RECORDER_SAMPLERATE, RECORDER_CHANNELS,RECORDER_AUDIO_ENCODING, bufferSize);录音机.startRecording(); recorder.read(data, 0, bufferSize);记录器.stop(); for (short s : data) { average += Math.abs(s); }

标签: android audio record


【解决方案1】:

尝试使用更高的采样率。最大值为 48000,但标准为 44100。

另外,麦克风可能只是在录制背景噪音。

【讨论】:

  • 我取了短数组中所有值的平均值,而不是 abs(s)。效果很好。
【解决方案2】:

这是@Gourneau 的答案,但带有代码

AudioRecord recorder; // our recorder, must be initialized first
short[] buffer; // buffer where we will put captured samples
DataOutputStream output; // output stream to target file
boolean isRecording; // indicates if sound is currently being captured
ProgressBar pb; // our progress bar recieved from layout
while (isRecording) {
    double sum = 0;
    int readSize = recorder.read(buffer, 0, buffer.length);
    for (int i = 0; i < readSize; i++) {
        output.writeShort(buffer [i]);
        sum += buffer [i] * buffer [i];
    }
    if (readSize > 0) {
        final double amplitude = sum / readSize;
        pb.setProgress((int) Math.sqrt(amplitude));
    }
}

http://web.archive.org/web/20140709183733/http://developer.samsung.com/android/technical-docs/Displaying-Sound-Volume-in-Real-Time-While-Recording

【讨论】:

    猜你喜欢
    • 2012-06-20
    • 2016-09-01
    • 1970-01-01
    • 2011-06-26
    • 2011-08-12
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多