与えられたコードSecurityErrorを回避する方法:操作は安全ではありません。 Firefoxで.mozCaptureStreamとMediaRecorderを使用していますか?
<!DOCTYPE html>
<html>
<head>
</head>
<body>
<video width="320" height="280"></video>
<script>
const video = document.querySelector("video");
const src = "https://mirrors.creativecommons.org/movingimages/webm/ScienceCommonsJesseDylan_240p.webm#t=0,10";
let recorder;
video.oncanplay =() => {
video.play();
const mediaStream = video.captureStream();
recorder = new MediaRecorder(mediaStream);
recorder.ondataavailable = event =>
console.log(URL.createObjectURL(event.data));
recorder.start();
}
video.onpause =() => recorder && recorder.stop();
video.src = src;
</script>
</body>
</html>
クロムブラウザはMediaRecorder
インスタンスのdataavailable
イベントでBlob
を得られるの.captureStream()
、MediaRecorder()
およびログBlob URL
を用い<video>
要素の再生を捕捉します。現在、エラーがrecorder.start()
コールSecurityError: The operation is insecure.
をスローし、recorder.stop()
コールInvalidStateError: An attempt was made to use an object that is not, or is no longer, usable
にされ.mozCaptureStream()
を実装Firefoxブラウザで
。
エラーは、明らかにSecurity ConsiderationsのMedia Capture from DOM Elementsに起因しています。
上記のエラーを回避し、ChromiumブラウザとChromeブラウザがFirefoxブラウザで実装するのと同じ結果を得るにはどうすればよいですか?
実際はクロムバグのようですね!あなたのコードがスローされないようにするには、ビデオの 'crossOrigin'を' 'anonymous ''に設定する必要があります(FFは実際にはバグがあります)(https://bugzilla.mozilla.org/show_bug.cgi?id=1341016 )、しかし少なくとも、彼らは**安心です**)。また、 'mozCaptureStream'が' captureStream'と同じように動作することは期待できません。なぜなら、それはまだプレフィックスされているからです/ – Kaiido
@Kaiido ChromiumまたはChromeではエラーはスローされません。 MediaRecorderを使用して作成された録音を連結するソリューションを探しながら、回避策を構成しました。 'crossOrigin'属性でもエラーなしにメディア再生を記録できる場合は、解答を投稿できますか? – guest271314
FFにリンクされているFFのバグで述べたように、FFでは正しいCORSヘッダーを持つMediaElementが許可されないため、修正されていない限り回避策としては機能しません。しかし、私が言っているのは、これはクロムのセキュリティ上のバグだということです(私はすぐにそれを放棄しています)。彼らはCORSヘッダーなしで配信されるmediaElementでcaptureStreamを呼び出さないでください。これは他のCORSのセキュリティ対策(webAudioやcanvas APIなど)とは異なります。したがって、mediaElementに 'cross-origin'属性を設定する必要があります。 – Kaiido