AudioBufferSourceNode

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Giao diện AudioBufferSourceNode là một AudioScheduledSourceNode đại diện cho một nguồn âm thanh gồm dữ liệu âm thanh trong bộ nhớ, được lưu trong một AudioBuffer.

Giao diện này đặc biệt hữu ích để phát lại âm thanh có yêu cầu rất khắt khe về độ chính xác thời điểm, chẳng hạn các âm thanh phải khớp với một nhịp điệu cụ thể và có thể được giữ trong bộ nhớ thay vì phát từ đĩa hoặc qua mạng. Để phát các âm thanh cần căn thời gian chính xác nhưng phải được truyền trực tuyến từ mạng hoặc phát từ đĩa, hãy dùng một AudioWorkletNode để triển khai việc phát lại.

EventTarget AudioNode AudioScheduledSourceNode AudioBufferSourceNode

Một AudioBufferSourceNode không có đầu vào và có đúng một đầu ra, với cùng số kênh như AudioBuffer được chỉ định bởi thuộc tính buffer của nó. Nếu không có bộ đệm nào được đặt, tức là buffernull, đầu ra sẽ chứa một kênh im lặng duy nhất (mọi mẫu đều là 0).

Một AudioBufferSourceNode chỉ có thể được phát một lần; sau mỗi lần gọi start(), bạn phải tạo một nút mới nếu muốn phát lại cùng âm thanh đó. May mắn là các nút này rất rẻ để tạo, và các AudioBuffer thực tế có thể được tái sử dụng cho nhiều lần phát cùng một âm thanh. Thật vậy, bạn có thể dùng các nút này theo kiểu "fire and forget": tạo nút, gọi start() để bắt đầu phát âm thanh, rồi thậm chí không cần giữ tham chiếu đến nó. Nó sẽ tự động được thu gom rác vào thời điểm thích hợp, tức là chỉ sau khi âm thanh phát xong được một lúc.

Cho phép gọi stop() nhiều lần. Lần gọi mới nhất sẽ thay thế lần trước đó, nếu AudioBufferSourceNode chưa đi tới cuối bộ đệm.

AudioBufferSourceNode nhận nội dung của một AudioBuffer và ánh xạ nó tới một đầu ra duy nhất.

Số lượng đầu vào 0
Số lượng đầu ra 1
Số kênh được xác định bởi AudioBuffer liên kết

Constructor

AudioBufferSourceNode()

Tạo và trả về một đối tượng AudioBufferSourceNode mới. Ngoài ra, bạn có thể dùng phương thức factory BaseAudioContext.createBufferSource(); xem Tạo một AudioNode.

Thuộc tính thể hiện

Kế thừa các thuộc tính từ đối tượng cha của nó, AudioScheduledSourceNode.

AudioBufferSourceNode.buffer

Một AudioBuffer xác định tài nguyên âm thanh sẽ được phát, hoặc khi được đặt thành giá trị null, xác định một kênh im lặng duy nhất (trong đó mọi mẫu đều là 0.0).

AudioBufferSourceNode.detune

Một AudioParam k-rate biểu diễn độ lệch tần trong đơn vị cent. Giá trị này được kết hợp với playbackRate để xác định tốc độ phát âm thanh. Giá trị mặc định là 0 (nghĩa là không lệch tần), và phạm vi danh định là từ -∞ đến ∞.

AudioBufferSourceNode.loop

Một thuộc tính Boolean cho biết tài nguyên âm thanh có phải được phát lại khi chạm tới cuối AudioBuffer hay không. Giá trị mặc định của nó là false.

AudioBufferSourceNode.loopStart Optional

Một giá trị dấu phẩy động cho biết thời điểm, tính bằng giây, mà tại đó việc phát AudioBuffer phải bắt đầu khi looptrue. Giá trị mặc định của nó là 0 (nghĩa là ở đầu mỗi vòng lặp, việc phát bắt đầu từ đầu bộ đệm âm thanh).

AudioBufferSourceNode.loopEnd Optional

Một số dấu phẩy động cho biết thời điểm, tính bằng giây, mà tại đó việc phát AudioBuffer dừng lại và lặp trở về thời điểm được chỉ ra bởi loopStart, nếu looptrue. Giá trị mặc định là 0.

AudioBufferSourceNode.playbackRate

Một AudioParam k-rate xác định hệ số tốc độ mà tại đó tài nguyên âm thanh sẽ được phát, trong đó giá trị 1.0 là tốc độ lấy mẫu tự nhiên của âm thanh. Vì đầu ra không áp dụng hiệu chỉnh cao độ, thuộc tính này có thể được dùng để thay đổi cao độ của mẫu. Giá trị này được kết hợp với detune để xác định tốc độ phát cuối cùng.

Phương thức thể hiện

Kế thừa các phương thức từ đối tượng cha của nó, AudioScheduledSourceNode, và ghi đè phương thức sau:.

start()

Lên lịch phát dữ liệu âm thanh chứa trong bộ đệm, hoặc bắt đầu phát ngay lập tức. Đồng thời cũng cho phép đặt độ lệch bắt đầu và thời lượng phát.

Ví dụ

Trong ví dụ này, chúng ta tạo một bộ đệm dài hai giây, điền nhiễu trắng vào đó, rồi phát nó bằng AudioBufferSourceNode. Các chú thích sẽ giải thích rõ điều gì đang diễn ra.

Note: Bạn cũng có thể chạy thử mã trực tiếp, hoặc xem mã nguồn.

js
const audioCtx = new AudioContext();

// Create an empty three-second stereo buffer at the sample rate of the AudioContext
const myArrayBuffer = audioCtx.createBuffer(
  2,
  audioCtx.sampleRate * 3,
  audioCtx.sampleRate,
);

// Fill the buffer with white noise;
// just random values between -1.0 and 1.0
for (let channel = 0; channel < myArrayBuffer.numberOfChannels; channel++) {
  // This gives us the actual ArrayBuffer that contains the data
  const nowBuffering = myArrayBuffer.getChannelData(channel);
  for (let i = 0; i < myArrayBuffer.length; i++) {
    // Math.random() is in [0; 1.0]
    // audio needs to be in [-1.0; 1.0]
    nowBuffering[i] = Math.random() * 2 - 1;
  }
}

// Get an AudioBufferSourceNode.
// This is the AudioNode to use when we want to play an AudioBuffer
const source = audioCtx.createBufferSource();
// set the buffer in the AudioBufferSourceNode
source.buffer = myArrayBuffer;
// connect the AudioBufferSourceNode to the
// destination so we can hear the sound
source.connect(audioCtx.destination);
// start the source playing
source.start();

Note: Để xem ví dụ decodeAudioData(), hãy xem trang AudioContext.decodeAudioData().

Thông số kỹ thuật

Thông số kỹ thuật
Web Audio API
# AudioBufferSourceNode

Khả năng tương thích trình duyệt

Xem thêm