2013-06-04 44 views
8

Tôi nhận được mẫu PCM 16 bit xen kẽ trên dây. Mỗi mẫu được kýPCM Web Audio Api Javascript - Tôi đang bị méo âm thanh

Tôi đọc nó dưới dạng mảng Int16bit, cho phép gọi ALL_DATA này. Vì vậy, mỗi mục trong mảng là một mẫu 16 bit.

Vì nó được đan xen, tôi trích xuất nó thành 2 kênh R-L-R-L Tôi kết thúc với 2 (16 bit) mảng một nửa kích thước của mảng ALL_DATA.

Sau đó, tôi đi qua từng mẫu và bình thường hóa nó thành Float32Array vì đó là những gì sử dụng API âm thanh web .

var normalizedSample = (sample> 0)? mẫu/32768: mẫu/-32768;

Đây có phải là cách phù hợp để thực hiện điều đó không.

Tôi đang bị âm thanh bị méo. Bạn có thể nói những gì đang xảy ra. Vì vậy, theo nghĩa đen nếu bạn đang nghe guitar cổ điển có vẻ như nó là điện với sự biến dạng.

Đối với luận cứ vì tôi đặt xuống mã ví dụ nhưng Mã này xử lý

MONO SOUND để làm ví dụ đơn giản, vì vậy chúng tôi không cần phải xen vào giưa nó cũng

var startTime = 0; 
    var fileReader = new FileReader(); 
    fileReader.onload = function (e) { 
         var data = new DataView(e.target.result); 

        var audio = new Int16Array(data.byteLength/Int16Array.BYTES_PER_ELEMENT); 
        var len = audio.length; 
        for (var jj = 0; jj < len; ++jj) { 
         audio[jj] = data.getInt16(jj * Int16Array.BYTES_PER_ELEMENT, true); 
        } 

        var right = new Float32Array(audio.length); 

        var channleCounter = 0; 
        for (var i = 0; i < audio.length;) { 
         var normalizedRight = (audio[i] > 0) ? audio[i]/32768 : audio[i]/-32768; 

         i = i + 1; 
         right[channleCounter] = normalizedRight; 

         channleCounter++; 
        } 






        var source = audioContext.createBufferSource(); 


        var audioBuffer = audioContext.createBuffer(1, right.length, 44100); 
        audioBuffer.getChannelData(0).set(right); 


        source.buffer = audioBuffer; 


        source.connect(audioContext.destination); 

        source.noteOn(startTime); 
        startTime += audioBuffer.duration; 

       }; 

Mọi góp ý có thể gây ra âm thanh bị méo sẽ giúp ích. Tôi đã viết dữ liệu pcm trước khi tôi gửi nó ở phía máy chủ đến một tập tin là tốt và âm thanh là hoàn hảo.

+0

Bài đăng của bạn cuối cùng đã làm cho tôi có được âm thanh làm việc ... Cảm ơn một tấn cho đăng những nỗ lực của bạn, nó làm cho âm thanh của tôi gần tinh thể rõ ràng bây giờ :) – ole

+0

Ở đây bạn nói rằng bạn đã sử dụng âm thanh để làm cho nó MONO đơn giản. Tôi đang cố gắng làm điều đó với âm thanh Stereo. Bạn có biết làm thế nào để làm điều đó? –

Trả lời

17

Thay vì nói

var normalizedSample= (sample > 0) ? sample/32768 : sample/-32768; 

thử

var normalizedSample= sample/32768; 

tính của bạn, như hiện bằng văn bản, sẽ đảo ngược các phần tiêu cực của dạng sóng của bạn, một cách tương tự như một chỉnh lưu toàn sóng (mẫu của bạn sẽ luôn là số dương).

enter image description here

+0

Câu chuyện dài ngắn, tôi là một thằng ngốc. :) Tôi không biết tại sao tôi lại làm thế. Cảm ơn bạn rất nhiều. Đôi khi những điều đơn giản nhất trở lại và ám ảnh tôi. Nếu tôi có thể đưa ra thêm điểm cho câu trả lời này cho biểu đồ. –