2011-07-06 61 views
16

Tôi nhận dữ liệu âm thanh PCM từ máy chủ theo các đoạn nhỏ và lưu trữ chúng trong một Mảng. Bây giờ tôi muốn phát các đoạn âm thanh này liên tục mà không có khoảng trống sử dụng một số khả năng HTML5. Hai lựa chọn mà tôi đang xem xét các giải pháp 'tốt' là:Truyền dữ liệu âm thanh trong HTML5

  1. HTML5 âm thanh tag với Data URI
  2. Web audio API

Trong khi tôi đang điều tra các tùy chọn này, tôi xin đề nghị bất kỳ tùy chọn hoặc quan điểm khác về hai lựa chọn tôi đang xem xét. Mặc dù giải pháp nền tảng chéo sẽ là giải pháp tốt nhất nhưng tôi có thể giải quyết cho giải pháp Chrome duy nhất là

Trả lời

2

Tùy chọn 1 có thể không hoạt động do thẻ âm thanh không phát dữ liệu âm thanh thô (mà tôi giả định là ý nghĩa của âm thanh PCM) dữ liệu, hay tôi sai?). Mọi trình duyệt đều cần codec cụ thể. Để đầu nó của thẻ âm thanh là không đáng tin cậy ở tất cả để chơi những thứ mà không có khoảng trống.

Tùy chọn 2 có thể hoạt động. Api âm thanh trên web chứa các bộ đệm có thể chứa dữ liệu thô và được phát, nhưng tôi chưa bao giờ thử làm như vậy. Hạn chế lớn nhất hiện nay là; a. Chỉ Chrome b. người dùng cần định cấu hình chrome bằng cách nhập about: flags và bật Web Audio có thể đáng sợ đối với một số người dùng.

Tùy chọn thứ ba sẽ là API dữ liệu âm thanh vốn là điểm trung bình. Tôi chưa bao giờ thử nó, nhưng từ spec nó trông giống như chính xác những gì bạn đang tìm kiếm. Tôi không biết về hiện thực mặc dù, vì vậy bạn sẽ phải làm một số nghiên cứu trên của riêng bạn :) https://wiki.mozilla.org/Audio_Data_API#Writing_Audio

Hãy không phải là tôi đang đưa ra những câu trả lời trên đỉnh đầu của tôi, và tôi vẫn còn khá mới sang HTML5 âm thanh.

+1

Bạn có quyền không chơi PCM thô, nhưng tệp WAV là một trình bao bọc rất mỏng xung quanh âm thanh thô (nơi "trình bao bọc" có nghĩa là tiêu đề 44 byte). Nó đã được thực hiện, thường xuyên. Nhưng bây giờ, tất nhiên, 2 năm sau, API âm thanh trên web dường như có đặt cược tốt hơn. –

19

Âm thanh lập lịch là thứ mà API âm thanh trên web được thiết kế cho. Nếu bạn có khối âm thanh PCM đã giải mã thành mảng đã nhập (AUDIO_CHUNKS), bạn có thể tạo bộ đệm âm thanh cho từng đoạn và lập lịch cho chúng theo thời gian chính xác (cái khác) bằng cách sử dụng noteOn(). Một cái gì đó như:

var startTime = 0; 

for (var i = 0, audioChunk; audioChunk = AUDIO_CHUNKS[i]; ++i) { 
    // Create/set audio buffer for each chunk 
    var audioBuffer = audioCtx.createBuffer(NUM_CHANNELS, NUM_SAMPLES, SAMPLE_RATE); 
    audioBuffer.getChannelData(0).set(audioChunk); 

    var source = audioCtx.createBufferSource(); 
    source.buffer = audioBuffer; 
    source.noteOn(startTime); 
    source.connect(audioCtx.destination); 

    startTime += audioBuffer.duration; 
} 
Các vấn đề liên quan