【问题标题】:Get Amplitude or Frequency of Audio Played in Media Player in Android获取在 Android 的媒体播放器中播放的音频的幅度或频率
【发布时间】:2014-07-31 21:46:45
【问题描述】:

我是 Android 的初学者。我想在 Android 中找到频率密度或音量幅度或使用 Android Media Player 播放 mp3 文件。我尝试了很多不同的方法,但都没有成功。你能帮帮我吗有了这个

我找到了这段代码,但它在录音机时间给出了 getMaxAmplitude() 值,但在播放 mp3 文件时没有得到。 以下是链接:What does Android's getMaxAmplitude() function for the MediaRecorder actually give me?

public double getNoiseLevel() 
{
    Log.d("SPLService", "getNoiseLevel() ");
    int x = mRecorder.getMaxAmplitude();
    double x2 = x;
    Log.d("SPLService", "x="+x);
    double db = (20 * Math.log10(x2 / REFERENCE));
    //Log.d("SPLService", "db="+db);
    if(db>0)
    {
        return db;
    }
    else
    {
        return 0;
    }
}

我也参考 ringdroid 链接:https://code.google.com/p/ringdroid/

我也检查了 FFT,但它是在录制时间。我需要在播放音频文件(mp3 文件)时检测频率/幅度。

【问题讨论】:

  • 包括您尝试过的内容。如果您显示您检查了文档的哪些部分,以及是否有任何让您感到困惑的地方,这会有所帮助。
  • 对于声音分析,您需要使用 FFT(快速傅里叶变换)。

标签: android audio android-mediaplayer frequency


【解决方案1】:

mRecorder.getMaxAmplitude() 返回自上次调用以来测量的最大绝对幅度,或第一次调用时为 0

相当于做:

max(abs(signal));

您需要检查您的 Reference 变量使用 1.0 到浮点数据表示或 32767 到短整数!

要将最大绝对幅度转换为 dB,您需要执行 20 * log10(x/Reference)

matlab 中的等效代码展示了这个概念:

% create a audio signal in float point at 90dB
signal = 10^(90/20)*sin(2*pi*f/Fs*t)';
%equivalent of mRecorder.getMaxAmplitude()
x = max(abs(signal));
%find dB (Reference for this example is 1.0 data in float point)
decibel = 20 * log10(x/1.0)

结果是89.9955

要在播放 mp3 文件时显示分贝,您需要对每个处理过的帧调用 getNoiseLevel()

【讨论】:

    猜你喜欢
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    相关资源
    最近更新 更多