2

その場でオーディオを生成する必要があります (wav または mp3 ファイルからの生成はオプションではありません)。幸いなことに、新しい WebAudio API (FF4 および Chrome 13) はこの機能を提供します。

次のようなJavascriptに移植しているJavaコードがいくつかあります。

byte[] buffer = new byte[]{ 56, -27, 88, -29, 88, -29, 88, -29 ............ };
AudioFormat af = new AudioFormat(44100, 16, 1, true, false);
SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
sdl.open(af, 1470 * 4); //create 4 frame audio buffer
sdl.start();
sdl.write(buffer, 0, buffer.length);

これを Web Audio API で動作させようとしていますが、非常に歪んでいます。JSで使用しているコードは次のとおりです。

var buffer = [ 56, -27, 88, -29, 88, -29, 88, -29 ............ ];
var ctx = new webkitAudioContext();
var src = ctx.createBufferSource();
src.buffer = ctx.createBuffer(1, buffer.length, 44100);
src.buffer.getChannelData(0).set(buffer);
src.connect(ctx.destination);
src.looping = false;
src.noteOn(0);

ここに私がテストしている .java ファイルがあります: http://gwt-nes-port.googlecode.com/svn/wiki/webAudioTests/Main.java

そして、これが私がテストしている.jsファイルです: http://gwt-nes-port.googlecode.com/svn/wiki/webAudioTests/Main.js

javax.sound と Web Audio の動作の違いと、JS コードの歪みの原因に関するヒントはありますか?

4

2 に答える 2

4

非常に親切な Google Chrome チームのおかげで、私はこれを理解しました。彼らが言ったことは次のとおりです。

こんにちは、ブラッドさん、サンプル データが有効範囲外のようです。この API の場合、フルスケールの浮動小数点 PCM オーディオ データは -1.0 -> +1.0 の範囲内である必要があります。

おそらく、データ値は 16 ビット スケール (-32768 -> +32767) です。

そのため、バイト配列を作成するときは、すべてが 10 進数で表されていることを確認する必要があります。したがって、これの代わりに:

byte[] buffer = new byte[]{ 56, -27, 88, -29, 88, ............ };

次のようなものが本当に必要でした。

byte[] buffer = new byte[]{ 0.023, -0.1, 0.125, -0.045, ............ };

したがって、私のコードでは、次のように、16 ビットのスケーリングされた値を適切な範囲に変換するロジックを追加しました。

for(var i=0;i<buffer.length;i++) {
   var b = buffer[i];
   b = (b>0)?b/32767:b/-32768;
   buffer[i] = b;
}

オーディオは 10 進数で表されるようになり、歪んだヘビー メタルの曲のようには聞こえなくなりました。

于 2011-05-16T22:23:59.663 に答える
-1

サンプル データがあるので、Web Audio API を使用しなくてもこれを行うことができます。その場で .wav ファイルを生成し、型配列を使用します。

スライド 23: http://davidflanagan.com/Talks/jsconf11/BytesAndBlobs.html

于 2011-06-02T01:35:14.087 に答える