2012-01-03 36 views
7

Xin chào, tôi đang làm việc trên API WebAudio. Tôi đọc liên kết HTML5 Web Audio API, porting from javax.sound and getting distortion nhưng không nhận được chất lượng tốt như trong java API.I đang nhận dữ liệu PCM từ máy chủ trong các byte đã ký. Sau đó, tôi phải thay đổi điều này thành định dạng 16 bit. để thay đổi tôi đang sử dụng (firstbyte < < 8 | secondbyte) nhưng tôi không thể có được chất lượng âm thanh tốt. có bất kỳ vấn đề nào trong chuyển đổi hay bất kỳ cách nào khác để làm cho việc có được chất lượng âm thanh tốt không?phát dữ liệu pcm bằng webAudio API

+1

Đoạn mã luôn hữu ích. – ebidel

+0

bất cứ ai có thể cho tôi biết làm thế nào để chuyển đổi mảng byte ký kết để Float32Array? – user894554

+0

Không quá tự hào để upvote này, nhưng đây là một câu hỏi hay, như các tài liệu chính thức bỏ qua phần PCM chơi, đó sẽ là chức năng trực tiếp, và tập trung vào decodeAudioData(), đó là một 'helper'. –

Trả lời

4

API âm thanh web sử dụng các ký hiệu nổi 32 bit từ -1 đến 1, vì vậy đó là những gì tôi sẽ (hy vọng) cho bạn biết cách thực hiện, thay vì 16 bit như bạn đã đề cập trong câu hỏi.

Giả sử mảng của bạn các mẫu được gọi là samples và được lưu trữ như lời khen 2 từ -128 đến 127, tôi nghĩ rằng điều này sẽ làm việc:

var floats = new Float32Array(samples.length); 
samples.forEach(function(sample, i) { 
    floats[i] = sample < 0 ? sample/0x80 : sample/0x7F; 
}); 

Sau đó, bạn có thể làm một cái gì đó như thế này:

var ac = new webkitAudioContext() 
    , ab = ac.createBuffer(1, floats.length, ac.sampleRate) 
    , bs = ac.createBufferSource(); 
ab.getChannelData(0).set(floats); 
bs.buffer = ab; 
bs.connect(ac.destination); 
bs.start(0); 
+0

Tôi nghĩ bạn đang bỏ lỡ "bs.buffer = ab;" – CpnCrunch

Các vấn đề liên quan