Browser modern memungkinkan Anda memilih perangkat input dan output, termasuk kamera, mikrofon, dan speaker.
Contoh:
- Di ponsel, pilih kamera depan atau belakang.
- Di laptop, pilih speaker internal atau speaker yang terhubung dengan Bluetooth.
- Untuk video chat, pilih mikrofon atau kamera internal atau eksternal.
Semua fungsi ini diekspos oleh objek MediaDevices, yang ditampilkan
oleh navigator.mediaDevices
.
MediaDevices memiliki dua metode yang diterapkan di Chrome 47 pada desktop dan
Android: enumerateDevices()
dan getUserMedia()
.
enumerateDevices()
Menampilkan Promise yang memberikan akses ke array objek MediaDeviceInfo
untuk perangkat yang tersedia.
Metode ini mirip dengan
MediaStreamTrack.getSources()
, tetapi tidak seperti
metode tersebut (yang hanya diimplementasikan di Chrome), metode ini mematuhi standar dan
menyertakan perangkat output audio. Anda dapat mencobanya dengan demo di bawah ini.
Berikut adalah beberapa kode yang sedikit disederhanakan dari salah satu demo:
navigator.mediaDevices.enumerateDevices()
.then(gotDevices)
.catch(errorCallback);
...
function gotDevices(deviceInfos) {
...
for (var i = 0; i !== deviceInfos.length; ++i) {
var deviceInfo = deviceInfos[i];
var option = document.createElement('option');
option.value = deviceInfo.deviceId;
if (deviceInfo.kind === 'audioinput') {
option.text = deviceInfo.label ||
'Microphone ' + (audioInputSelect.length + 1);
audioInputSelect.appendChild(option);
} else if (deviceInfo.kind === 'audiooutput') {
option.text = deviceInfo.label || 'Speaker ' +
(audioOutputSelect.length + 1);
audioOutputSelect.appendChild(option);
} else if (deviceInfo.kind === 'videoinput') {
option.text = deviceInfo.label || 'Camera ' +
(videoSelect.length + 1);
videoSelect.appendChild(option);
}
...
}
Setelah mengambil ID perangkat yang tersedia dengan enumerateDevices()
, Anda dapat menggunakan setSinkId()
(ditentukan dalam Audio Output Devices API) guna mengubah tujuan output audio untuk elemen video atau audio:
element.setSinkId(sinkId)
.then(function() {
console.log('Audio output device attached: ' + sinkId);
})
.catch(function(error) {
// ...
});
Metode ini menetapkan perangkat output untuk audio dari elemen. Setelah setSinkId()
dipanggil, Anda bisa mendapatkan ID perangkat audio output saat ini untuk elemen dengan properti sinkId
.
getUserMedia()
Ini akan menggantikan navigator.getUserMedia()
, tetapi tidak menggunakan callback, melainkan menampilkan Promise yang memberikan akses ke MediaStream
. Developer dianjurkan untuk menggunakan
MediaDevices.getUserMedia()
, tetapi tidak ada rencana untuk menghapus
navigator.getUserMedia()
: tetap menjadi bagian spesifikasi.
Ada demo di situs contoh WebRTC.
Berikut fragmen kode dari demo:
navigator.mediaDevices.getUserMedia(constraints)
.then(function(stream) {
var videoTracks = stream.getVideoTracks();
console.log('Got stream with constraints:', constraints);
console.log('Using video device: ' + videoTracks[0].label);
stream.onended = function() {
console.log('Stream ended');
};
window.stream = stream; // make variable available to console
video.srcObject = stream;
})
.catch(function(error) {
// ...
}
Penghilangan bendera
Metode enumerateDevices()
bersifat 'tanpa flag' di Chrome, sedangkan untuk
MediaDevices.getUserMedia()
Anda masih harus mengaktifkan fitur Platform Web
Eksperimental di chrome://flags atau menggunakan tanda command line berikut:
--enable-blink-features=GetUserMedia
Demikian juga untuk setSinkId()
: aktifkan fitur Platform Web Eksperimental atau gunakan tanda:
--enable-blink-features=AudioOutputDevices
Detail selengkapnya tentang dukungan browser ada di bawah.
Acara mendatang
Pengendali peristiwa ondevicechange
yang diusulkan melakukan fungsinya: peristiwa devicechange
akan diaktifkan saat serangkaian perangkat yang tersedia berubah, dan di pengendali, Anda dapat memanggil enumerateDevices()
untuk mendapatkan daftar perangkat baru. Hal ini belum diterapkan di browser apa pun.
Draf Screen Capture adalah ekstensi
untuk Media Capture API yang mengusulkan metode MediaDevices.getDisplayMedia()
yang memungkinkan area tampilan pengguna digunakan sebagai sumber streaming
media. Ada juga proposal ekstensi MediaDevices
untuk
getSupportedConstraints()
, yang memberikan informasi tentang batasan yang dapat digunakan untuk
panggilan getUserMedia()
: kemampuan audio dan video yang didukung oleh browser.
Demo
- getUserMedia()
- enumerateDevices():
- Shim MediaDevices
Cari tahu selengkapnya
- Jaringan Developer Mozilla: Perangkat Media
- Status penerapan
- Draf Media Capture dan Stream Editor: MediaDevices
- Audio Output Devices API