HTML5 Web Audio API,从 javax.sound 移植并出现失真

发布于 2024-11-07 09:10:19 字数 1284 浏览 0 评论 0原文

我需要动态生成音频(不能从 wav 或 mp3 文件生成)。幸运的是,新的 WebAudio API(FF4 和 Chrome 13)提供了此功能。

我有一些 Java 代码正在移植到 Javascript,如下所示:

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 代码失真的原因有什么提示吗?

I have a requirement to generate audio on the fly (generating from wav or mp3 files is not an option). Luckily the new WebAudio API (FF4 and Chrome 13) provides this functionality.

I have some Java code i'm porting to Javascript that looks like this:

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);

I'm trying to get this working with the Web Audio API, but it is extremely distorted. Here is the code i'm using in 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);

Here is a .java file that i'm testing with:
http://gwt-nes-port.googlecode.com/svn/wiki/webAudioTests/Main.java

And here is the .js file that i'm testing with:
http://gwt-nes-port.googlecode.com/svn/wiki/webAudioTests/Main.js

Any tips on the differences between how javax.sound and Web Audio work, and what is causing the distortion in my JS code?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

一梦浮鱼 2024-11-14 09:10:19

感谢非常乐于助人的 Google Chrome 团队,我解决了这个问题。他们是这么说的:

嗨布拉德,它看起来像你的
样本数据超出有效范围
范围。对于此 API,全尺寸
浮点 PCM 音频数据应该
在-1.0 -> 范围内+1.0

也许你的数据值是16位
缩放(-32768 -> +32767)。

因此,当我创建字节数组时,我需要确保所有内容都表示为十进制。所以,

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;
}

现在音频表示为十进制,不再听起来像扭曲的重金属歌曲。

Thanks to the very helpful Google Chrome team, I figured this one out. Here is what they said:

Hi Brad, it looks like your
sample-data is outside of the valid
range. For this API, the full-scale
floating-point PCM audio data should
be within the range -1.0 -> +1.0

Perhaps your data values are 16bit
scaled (-32768 -> +32767).

So when I create my byte array, I need to make sure everything is represented as a decimal. So instead of this:

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

I really needed something that looked like this:

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

So in my code I just added some logic to convert the 16bit scaled values to the appropriate range like this:

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

Now the audio is represented as a decimal and no longer sounds like a distorted heavy metal song.

梦与时光遇 2024-11-14 09:10:19

您可以在没有 Web Audio API 的情况下执行此操作,因为您拥有示例数据。
动态生成 .wav 文件并使用类型数组。

幻灯片 23:http://davidflanagan.com/Talks/jsconf11/BytesAndBlobs.html

You can do this without the Web Audio API since you have the sample data.
Generate a .wav file on the fly and use type arrays.

Slide 23: http://davidflanagan.com/Talks/jsconf11/BytesAndBlobs.html

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文