関連する質問を参照してください: Navigator.mediaDevices.getUserMedia が iOS 12 Safari で動作しない
ユーザー入力ユーザー MediaDevices.getUserMedia および Audio Context からオーディオをキャプチャしようとしています
ユーザーがボタンをクリックすると、使用可能なデバイスを確認し、オーディオ ストリームをキャプチャします。
let enumDevicePromise = navigator.mediaDevices.enumerateDevices()
.then(devices => devices.find(d => d.kind === "audioinput" && d.label !== "" && d.deviceId === "default"))
.catch((error) => {
// handle error
});
this.handleCheckEnumeratedDevices(enumDevicePromise); // capture device in backend
.....
navigator.mediaDevices
.getUserMedia({
audio: true,
video: false,
})
.then(stream => {
let AudioContext = window.AudioContext || window.webkitAudioContext;
if (AudioContext) {
let context = new AudioContext();
let source = context.createMediaStreamSource(stream);
let processor = context.createScriptProcessor(4096, 1, 1);
source.connect(processor);
processor.connect(context.destination);
processor.onaudioprocess = (event) => {
let audioIn = event.inputBuffer.getChannelData(0);
this.sendMessage(this.toInt16(audioIn));
}
} else {
// handle error, ie, Audio Context not supported
}
}).catch((error) => {
// handle error
});
});
これは Chrome と Firefox では正常に動作しますが、Safari 12 では、マイクのアクセス許可を許可しているにもかかわらず、enumerate devices promise からNull応答が返されます。そのため、オーディオ ストリームをキャプチャできません。