2

録音中に音のデシベル値を取得する方法はありますか? 私はMediaRecorder今のところ音を録音するために使用しています

Audalyzer などのアプリケーションがユーザーの携帯電話にインストールされているかどうかわからないため、Marketplace のアプリケーションを使用できません。

次の数式を使用していますが、それらが正しいかどうか、または結果が正しいかどうかはわかりません!

short data[] = new short[bufferSize];
read = recorder.read(data, 0, bufferSize);
double p2 = data[data.length-1];
System.out.println("p2: " + p2);
double decibel;

if (p2==0)
   decibel=Double.NEGATIVE_INFINITY;
else
   decibel = 20.0*Math.log10(p2/65535.0);
   System.out.println("p2/65535: " + (p2/65535.0));

System.out.println("decibel: " + decibel);

現在の結果:

    01-11 16:43:03.821: I/System.out(14530): p2: 0.0
01-11 16:43:03.821: I/System.out(14530): p2/65535: 0.0
01-11 16:43:03.821: I/System.out(14530): decibel: -Infinity
01-11 16:43:03.911: I/System.out(14530): p2: 0.0
01-11 16:43:03.911: I/System.out(14530): p2/65535: 0.0
01-11 16:43:03.911: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.001: I/System.out(14530): p2: 0.0
01-11 16:43:04.001: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.001: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.091: I/System.out(14530): p2: 0.0
01-11 16:43:04.091: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.091: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.191: I/System.out(14530): p2: 0.0
01-11 16:43:04.191: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.191: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.281: I/System.out(14530): p2: 0.0
01-11 16:43:04.281: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.281: I/System.out(14530): decibel: -Infinity
01-11 16:43:04.371: I/System.out(14530): p2: 0.0
01-11 16:43:04.371: I/System.out(14530): p2/65535: 0.0
01-11 16:43:04.371: I/System.out(14530): decibel: -Infinity
4

1 に答える 1

2

AudioRecordを使用すると、オーディオサンプルに直接アクセスできます...そこから、デシベル単位または任意の方法でサウンドの音量を計算できます...

これもほぼ同じ質問のようです(そして計算式があります)

編集(コメントと追加のコードに基づく):

さて、あなたが使用している変数data []は、配列またはバイトまたはショートとして宣言されていますか?これにより、read()関数のどちらが使用されるかが変わります。ショートとして宣言すると、16ビットが処理されます。バイトの配列として宣言する場合は、2つの連続するバイトを組み合わせる必要があります。

負の値と正の値について心配する必要はありません。data[]を「unsignedshort」の配列として宣言するだけです。

デシベル値が現在の音量を他のものと比較していることを理解する必要があります。私は実際には専門家ではありませんが、ほとんどの場合、可能な最大振幅と比較すると思います。今、あなたが行っている計算は2つの連続したサンプルを比較していると思います。そのため、値はかなり低くなっています... p1の代わりに、値65535(可能な最大値)を使用してください。次に、デシベル値が何もないときに負の値であり、ノイズとともに増加するはずです(ただし、負のままです)。

編集(最新のコードに基づく):

サンプルサイズは16ビットなので、shortsを使用してください...

short buffer[] = new short[bufferSize];
read = recorder.read(buffer, 0, bufferSize);
double p2 = data[data.length-1];
double decibel;
if (p2==0)
    decibel=Double.NEGATIVE_INFINITY;
else
    decibel = 20.0*Math.log10(p2/65535.0);

途中ですべての値(data [data.length-1]、p2、p2 / 65535、Math.log10(p2 / 65535)...など)を出力してみてください。0がある場所が見つかります。あるべきではないところにやってくる。

于 2012-01-07T00:57:31.817 に答える