発端
動画をキャプチャして、canvas要素に描画し、それをtoBlobなどしようとしたときに以下のエラーが発生した。
Uncaught DOMException: Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported.
これ自体は、videoタグの属性をsameOrigin="anonymous"にすることで、解決。
本題
次に、videoタグに先程のsameOriginノ設定をすると、下記のようなエラーになった
Failed to load https://something.com/sample.mp4' to 'data:text;charset=utf-8,' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'localhost:3000' is therefore not allowed access.)
普通にありえる原因
somthing.com
のサーバー側からのレスポンスのヘッダーに以下を仕込んでいないから。
Access-Control-Allow-Origin: *
(上記ケースの場合、*はlocalhost:3000とかでもいい)
参考: 画像とキャンバスをオリジン間で利用できるようにする - HTML: HyperText Markup Language | MDN
詳細: オリジン間リソース共有 (CORS) - HTTP | MDN
しかしながら、自分の環境の場合、動画置いているサーバー側の設定は、Access-Control-Allow-Origin: *
になっているようだった(たぶん)
それでもエラーが解消されない場合
今回の自分の環境(google chrome 86.0.4240.193)では解消されなかったので、以下、対処策
- chrome以外のブラウザ使う)firefox
- mp4ではなく、hls(httpLiveStreaming)用のファイル使う
- 拡張機能で防ぐ
- Allow CORS: Access-Control-Allow-Origin - Chrome ウェブストア
- Cross Domain - CORS - Chrome ウェブストア
感想
もっとブラウザ詳しくなりたいです