Hướng dẫn này giải thích các phương pháp ghi âm thanh và video từ một thẻ, cửa sổ hoặc màn hình bằng cách sử dụng các API như browser.tabCapture hoặc getDisplayMedia().
Ghi màn hình
Đối với tính năng ghi màn hình, hãy gọi getDisplayMedia(). Thao tác này sẽ kích hoạt hộp thoại xuất hiện bên dưới. Điều này giúp người dùng có thể chọn thẻ, cửa sổ hoặc màn hình mà họ muốn chia sẻ và cho biết rõ rằng đang diễn ra quá trình ghi hình.
Ví dụ sau đây yêu cầu quyền truy cập để ghi cả âm thanh và video.
const stream = await navigator.mediaDevices.getDisplayMedia({ audio: true, video: true });
Nếu được gọi trong một tập lệnh nội dung, quá trình ghi sẽ tự động kết thúc khi người dùng chuyển đến một trang mới. Để ghi ở chế độ nền và trên các thao tác điều hướng, hãy sử dụng tài liệu ngoài màn hình có lý do là DISPLAY_MEDIA.
Tính năng ghi lại thẻ dựa trên cử chỉ của người dùng
Việc gọi getDisplayMedia() sẽ khiến trình duyệt hiện một hộp thoại hỏi người dùng nội dung mà họ muốn chia sẻ. Tuy nhiên, trong một số trường hợp, người dùng vừa nhấp vào nút hành động để gọi tiện ích cho một thẻ cụ thể và bạn muốn bắt đầu ghi lại thẻ ngay lập tức mà không cần lời nhắc này.
Ghi âm và quay video ở chế độ nền
Kể từ Chrome 116, bạn có thể gọi API browser.tabCapture trong một trình chạy dịch vụ để lấy mã nhận dạng luồng sau cử chỉ của người dùng. Sau đó, bạn có thể truyền đối tượng này đến một tài liệu ngoài màn hình để bắt đầu ghi.
Trong trình chạy dịch vụ:
browser.action.onClicked.addListener(async (tab) => {
const existingContexts = await browser.runtime.getContexts({});
const offscreenDocument = existingContexts.find(
(c) => c.contextType === 'OFFSCREEN_DOCUMENT'
);
// If an offscreen document is not already open, create one.
if (!offscreenDocument) {
// Create an offscreen document.
await browser.offscreen.createDocument({
url: 'offscreen.html',
reasons: ['USER_MEDIA'],
justification: 'Recording from browser.tabCapture API',
});
}
// Get a MediaStream for the active tab.
const streamId = await browser.tabCapture.getMediaStreamId({
targetTabId: tab.id
});
// Send the stream ID to the offscreen document to start recording.
browser.runtime.sendMessage({
type: 'start-recording',
target: 'offscreen',
data: streamId
});
});
Sau đó, trong tài liệu ngoài màn hình:
browser.runtime.onMessage.addListener(async (message) => {
if (message.target !== 'offscreen') return;
if (message.type === 'start-recording') {
const media = await navigator.mediaDevices.getUserMedia({
audio: {
mandatory: {
chromeMediaSource: "tab",
chromeMediaSourceId: message.data,
},
},
video: {
mandatory: {
chromeMediaSource: "tab",
chromeMediaSourceId: message.data,
},
},
});
// Continue to play the captured audio to the user.
const output = new AudioContext();
const source = output.createMediaStreamSource(media);
source.connect(output.destination);
// TODO: Do something to record the MediaStream.
}
});
Để xem ví dụ đầy đủ, hãy xem mẫu Tab Capture – Recorder.
Ghi âm và quay video trong thẻ mới
Trước Chrome 116, bạn không thể sử dụng API browser.tabCapture trong trình chạy dịch vụ hoặc sử dụng mã nhận dạng luồng do API đó tạo trong tài liệu ngoài màn hình. Cả hai điều này đều là yêu cầu đối với phương pháp nêu trên.
Thay vào đó, bạn có thể mở trang của tiện ích trong một thẻ hoặc cửa sổ mới và lấy luồng trực tiếp. Đặt thuộc tính targetTabId để ghi lại thẻ chính xác.
Bắt đầu bằng cách mở một trang tiện ích (có thể trong cửa sổ bật lên hoặc trình chạy dịch vụ):
browser.windows.create({ url: browser.runtime.getURL("recorder.html") });
Sau đó, trong trang tiện ích:
browser.tabCapture.getMediaStreamId({ targetTabId: tabId }, async (id) => {
const media = await navigator.mediaDevices.getUserMedia({
audio: {
mandatory: {
chromeMediaSource: "tab",
chromeMediaSourceId: id,
},
},
video: {
mandatory: {
chromeMediaSource: "tab",
chromeMediaSourceId: id,
},
},
});
// Continue to play the captured audio to the user.
const output = new AudioContext();
const source = output.createMediaStreamSource(media);
source.connect(output.destination);
});
Ngoài ra, hãy cân nhắc sử dụng phương pháp ghi màn hình. Phương pháp này cho phép bạn ghi ở chế độ nền bằng cách sử dụng một tài liệu ngoài màn hình, nhưng cho người dùng thấy một hộp thoại để chọn thẻ, cửa sổ hoặc màn hình cần ghi.
Ghi âm trong cửa sổ bật lên
Nếu chỉ cần ghi âm thanh, bạn có thể trực tiếp lấy một luồng trong cửa sổ bật lên của tiện ích bằng cách sử dụng browser.tabCapture.capture. Khi cửa sổ bật lên đóng, quá trình ghi sẽ dừng.
browser.tabCapture.capture({ audio: true }, (stream) => {
// Continue to play the captured audio to the user.
const output = new AudioContext();
const source = output.createMediaStreamSource(stream);
source.connect(output.destination);
// TODO: Do something with the stream (e.g record it)
});
Nếu bạn cần bản ghi tồn tại trong quá trình điều hướng, hãy cân nhắc sử dụng phương pháp được mô tả trong phần trước.
Lưu ý khác
Để biết thêm thông tin về cách ghi lại một luồng phát, hãy xem API MediaRecorder.