teratail header banner
teratail header banner
質問するログイン新規登録

質問編集履歴

13

2021/11/19 12:18

投稿

JRNA03
JRNA03

スコア12

title CHANGED
File without changes
body CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 前提
2
2
 
3
- JavaScript のプレイヤーにて再生している HLS 形式の動画を Canvas の機能でキャプチャ(スクリーンショット)し、それを HTMLCanvasElement.toBlob() で Blob 化して XHR でサーバーにアップロードする機能を実装していますが、Android 版の Chrome・Firefox でのみうまく動きません。
3
+ JavaScript のプレイヤーにて再生している HLS 形式の動画を Canvas の機能でキャプチャ(スクリーンショット)し、それを HTMLCanvasElement.toBlob() で Blob 化して XHR でサーバーにアップロードする機能を実装していますが、Android 版の Chrome・Firefox でのみうまく動きません。
4
4
 
5
5
  - **Android 版の Chrome 系ブラウザと Firefox でのみ発生する**
6
6
  - Chrome と Firefox はエラー内容が異なる

12

2021/11/19 12:18

投稿

JRNA03
JRNA03

スコア12

title CHANGED
File without changes
body CHANGED
@@ -1,18 +1,17 @@
1
1
  ### 前提
2
2
 
3
- プレイヤーにて再生させている動画 (HLSにて再生) を Canvas にてキャプチャ(スクリーンショット)し、それを toBlob() で Blob 化し Ajax でサーバーにアップロードする機能を実装していますが、Android 版 Chrome・Firefox でのみ上手く動きません。
3
+ JavaScript のプレイヤーにて再生ている HLS 形式の動画を Canvas の機能でキャプチャスクリーンショットし、それを HTMLCanvasElement.toBlob() で Blob 化し XHR でサーバーにアップロードする機能を実装していますが、Android 版 Chrome・Firefox でのみうま動きません。
4
4
 
5
- - **Android 版 Chrome ( Opera 等の Chrome 系ブラウザを含む)・Firefox でのみ発生する**
5
+ - **Android 版の Chrome 系ブラウザFirefox でのみ発生する**
6
- - Chrome と Firefox はエラー内容が異なる
6
+ - Chrome と Firefox はエラー内容が異なる
7
- - **PC 版の Safari・Chrome・Firefox では普通にキャプチャが出来る**(エラーが発生しない)
7
+ - **PC 版の Safari・Chrome・Firefox ではエラーも発生せず、正常にキャプチャができる**
8
- - iOS 版 Safari (Chrome・Firefox を含む)では Canvas が空になる(画像化しても真っ白)現象が起きていたが、こちらは同じ関数内でキャプチャさせる事で解決した
8
+ - iOS 版 Safari では Canvas が空にな画像化しても真っ白になる現象が起きていたが、こちらは同じ関数内でキャプチャる事で解決した
9
- - **HLS ではなく通常の動画をキャプチャさせると Android 版 Chrome では上手く行くが、Android 版 Firefox は HLS の時と同エラーが**
9
+ - HLS 形式ではなく通常の MP4 の動画をキャプチャると Android 版 Chrome では正常にキャプチャできるようになるが、Android 版 Firefox は HLS の時と同様のエラーが表示されてい
10
- - HLS の再生には hls.js を使用 (DPlayerというプレイヤーを利用しています)
11
10
 
12
- JavaScript は初心者で Canvas もど触ったことがなく、どのように解決すればいいか悩んでいます。
11
+ JavaScript は初心者で Canvas もほとんど触ったことがなく、どのように解決すればいいか悩んでいます。
13
12
  宜しくお願いします。
14
13
 
15
14
  ### 確認ブラウザ
16
- - iOS: SafariChrome・Firefox
15
+ - iOS: Safari (Chrome・Firefox)
17
- - Android: Chrome・Firefox・Opera
16
+ - Android: Chrome・Firefox
18
17
  - PC (Windows・Mac): Safari・Chrome・Firefox

11

_

2021/11/19 12:17

投稿

JRNA03
JRNA03

スコア12

title CHANGED
File without changes
body CHANGED
@@ -12,45 +12,6 @@
12
12
  JavaScript は初心者で Canvas も殆ど触ったことがなく、どのように解決すればいいか悩んでいます。
13
13
  宜しくお願いします。
14
14
 
15
- ### 発生している問題・エラーメッセージ
16
-
17
- ```Chrome
18
- Uncaught DOMException: Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported.
19
- at HTMLImageElement.<anonymous> (http://192.168.1.xx:xxxx/files/script.js:166:14)
20
- at HTMLImageElement.dispatch (https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js:2:41772)
21
- at HTMLImageElement.y.handle (https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js:2:39791)
22
- ```
23
-
24
- ```Firefox
25
- NS_ERROR_NOT_AVAILABLE: script.js:165
26
- <匿名> http://192.168.1.xx:xxxx/files/script.js:165
27
- jQuery
28
- -------------------
29
- dispatch
30
- handle
31
- -------------------
32
- ```
33
-
34
- ### 該当のソースコード
35
- ```HTML
36
- <video webkit-playsinline="" playsinline="" crossorigin="anonymous" preload="metadata" src="stream/stream.m3u8"></video>
37
- ```
38
- ```JavaScript
39
- $('#tweet-picture').click(function(event){
40
- $("#tweet-status").html('キャプチャ中…');
41
- // 動画のキャンバス
42
- var canvas = document.createElement('canvas');
43
- var video = document.getElementsByClassName('dplayer-video-current')[0];
44
- canvas.width = video.videoWidth;
45
- canvas.height = video.videoHeight;
46
- canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
47
- canvas.toBlob(function(blob){
48
- file = blob;
49
- $("#tweet-status").html('キャプチャした画像を選択しました。');
50
- });
51
- });
52
- ```
53
-
54
15
  ### 確認ブラウザ
55
16
  - iOS: Safari・Chrome・Firefox
56
17
  - Android: Chrome・Firefox・Opera

10

_

2021/03/06 22:39

投稿

JRNA03
JRNA03

スコア12

title CHANGED
File without changes
body CHANGED
@@ -1,16 +1,15 @@
1
1
  ### 前提
2
2
 
3
- プレイヤーにて再生させている動画(HLSにて再生)をCanvasにてキャプチャ(スクリーンショット)し、それをtoBlobにてBlob化し、
3
+ プレイヤーにて再生させている動画 (HLSにて再生) Canvas にてキャプチャ(スクリーンショット)し、それを toBlob() で Blob 化し Ajax でサーバーにアップロードする機能を実装していますがAndroid 版 Chrome・Firefox でのみ上手く動きません。
4
- Ajaxでサーバーにアップロードする機能を実装していますが、Android版Chrome・Firefoxでのみ上手く動きません。
5
4
 
6
- - **Android版Chrome(Opera等のChrome系ブラウザを含む)・Firefoxでのみ発生する**
5
+ - **Android Chrome ( Opera 等の Chrome 系ブラウザを含む)・Firefox でのみ発生する**
7
- - ChromeとFirefoxではエラー内容が異なる
6
+ - Chrome Firefox ではエラー内容が異なる
8
- - **PC版のSafari・Chrome・Firefoxでは普通にキャプチャが出来る**(エラーが発生しない)
7
+ - **PC 版の Safari・Chrome・Firefox では普通にキャプチャが出来る**(エラーが発生しない)
9
- - iOS版Safari(Chrome・Firefoxを含む)ではCanvasが空になる(画像化しても真っ白)現象が起きていたが、こちらは同じ関数内でキャプチャさせる事で解決した
8
+ - iOS Safari (Chrome・Firefox を含む)では Canvas が空になる(画像化しても真っ白)現象が起きていたが、こちらは同じ関数内でキャプチャさせる事で解決した
10
- - **HLSではなく通常の動画をキャプチャさせるとAndroid版Chromeでは上手く行くが、Android版FirefoxはHLSの時と同じエラーが出る**
9
+ - **HLS ではなく通常の動画をキャプチャさせると Android Chrome では上手く行くが、Android Firefox HLS の時と同じエラーが出る**
11
- - HLSの再生にはhls.jsを使用(DPlayerというJS製動画プレイヤーを利用しています)
10
+ - HLS の再生には hls.js を使用 (DPlayerというプレイヤーを利用しています)
12
11
 
13
- JavaScriptは初心者でCanvasも殆ど触ったことがなく、どのように解決すればいいか悩んでいます。
12
+ JavaScript は初心者で Canvas も殆ど触ったことがなく、どのように解決すればいいか悩んでいます。
14
13
  宜しくお願いします。
15
14
 
16
15
  ### 発生している問題・エラーメッセージ
@@ -52,8 +51,7 @@
52
51
  });
53
52
  ```
54
53
 
55
- ### 補足
56
- 確認ブラウザ
54
+ ### 確認ブラウザ
57
- - iOS Safari・Chrome・Firefox
55
+ - iOS: Safari・Chrome・Firefox
58
- - Android Chrome・Firefox・Opera
56
+ - Android: Chrome・Firefox・Opera
59
- - PC(Windows・Mac) Safari・Chrome・Firefox
57
+ - PC (Windows・Mac): Safari・Chrome・Firefox

9

調べて解決した点を踏まえ大幅に修正しました

2020/09/12 06:27

投稿

JRNA03
JRNA03

スコア12

title CHANGED
@@ -1,1 +1,1 @@
1
- HLSのvideo要素をCanvasでスクリーンショットするとスマホブラウザでエラーが出る
1
+ Canvasでvideo要素をキャプチャするとAndroid版Chrome・Firefoxだけエラーが出る
body CHANGED
@@ -1,44 +1,47 @@
1
1
  ### 前提
2
2
 
3
- プレイヤーにて再生させている動画(HLSにて再生)をCanvasにてスクリーンショット(キャプチャ)し、それをtoBlobにてBlob化し、
3
+ プレイヤーにて再生させている動画(HLSにて再生)をCanvasにてキャプチャ(スクリーンショット)し、それをtoBlobにてBlob化し、
4
- Ajaxでサーバーにアップロードする機能を実装していますが、スマホでのみ何故か上手く動きません。
4
+ Ajaxでサーバーにアップロードする機能を実装していますが、Android版Chrome・Firefoxでのみ上手く動きません。
5
5
 
6
+ - **Android版Chrome(Opera等のChrome系ブラウザを含む)・Firefoxでのみ発生する**
7
+ - ChromeとFirefoxではエラー内容が異なる
6
- 【追記】色々試しているのですが、通常通り動画を読み込んだ際正常にキャプチャ出来るようで、問題はHLSで再生させている事にありそうな気がします…
8
+ - **PC版Safari・Chrome・Firefoxでは普通にキャプチャ出来る**(エラー発生ない)
9
+ - iOS版Safari(Chrome・Firefoxを含む)ではCanvasが空になる(画像化しても真っ白)現象が起きていたが、こちらは同じ関数内でキャプチャさせる事で解決した
10
+ - **HLSではなく通常の動画をキャプチャさせるとAndroid版Chromeでは上手く行くが、Android版FirefoxはHLSの時と同じエラーが出る**
11
+ - HLSの再生にはhls.jsを使用(DPlayerというJS製動画プレイヤーを利用しています)
7
12
 
8
- PCのChrome・Firefox・Safariでは正常に動作したのですが、何故かスマホのSafari・Chrome・Firefox・Opera等のブラウザでは下のようなエラーが出てしまうようで、正常に動作しません。
9
- Androidの方はクロスオリジン(CROS)に関連しているエラーらしいのですが、動画は全て同じドメイン上から配信している他、Canvasで他のドメインの画像を読み込んでいる訳でもなく、何故エラーが出るのか不可解です。
10
- iOSの方はエラーが起きているわけではなく、一応正常に取得したはずなのに真っ白で取得されてしまう、といった所のようです。(PCのSafariでは通常通りキャプチャできます)
11
-
12
13
  JavaScriptは初心者でCanvasも殆ど触ったことがなく、どのように解決すればいいか悩んでいます。
13
14
  宜しくお願いします。
14
15
 
15
16
  ### 発生している問題・エラーメッセージ
16
17
 
17
- まず、iOSの場合は、Safari・Chrome・Firefox全てにおいて、「一応実行は出来るが真っ白な画像(サイズは動画の大きさ(動画が720pなら1280×720の画素になる))しか取得できない」という問題が発生します。
18
- また、Androidの場合は、Chrome・Firefox・Opera全てでCanvas自体は取得できているようなんですが、
19
- 以下のようなtoBlobの処理でTainted canvases may not be exported.エラーが出てしまい、実行の途中でエラーになるためBlob化画像が取得できないためアップロードできない、という問題が発生しています。
20
-
21
- エラーメッセージ自体は「汚染されたキャンバスはエクスポートできません。」との事ですが、別ドメインのM3U8やTSを読み込んでいる訳でもないので不可解というか…
22
-
23
- 下記はAndroidのChromeにて、Chrome DevTool(リモートで開発者ツールが使える)を使うことで取得しましたが、
24
- 他のスマホブラウザに関してはどのようなエラーが出ているのかはまだ試せていません…
25
-
26
- ```
18
+ ```Chrome
27
- (index):yyy Uncaught DOMException: Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported.
19
+ Uncaught DOMException: Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported.
28
- at HTMLImageElement.<anonymous> (http://192.168.1.xx:xxxx/:yyy:zz)
20
+ at HTMLImageElement.<anonymous> (http://192.168.1.xx:xxxx/files/script.js:166:14)
29
21
  at HTMLImageElement.dispatch (https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js:2:41772)
30
22
  at HTMLImageElement.y.handle (https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js:2:39791)
31
23
  ```
32
24
 
25
+ ```Firefox
26
+ NS_ERROR_NOT_AVAILABLE: script.js:165
27
+ <匿名> http://192.168.1.xx:xxxx/files/script.js:165
28
+ jQuery
29
+ -------------------
30
+ dispatch
31
+ handle
32
+ -------------------
33
+ ```
34
+
33
35
  ### 該当のソースコード
34
-
36
+ ```HTML
37
+ <video webkit-playsinline="" playsinline="" crossorigin="anonymous" preload="metadata" src="stream/stream.m3u8"></video>
38
+ ```
35
39
  ```JavaScript
36
-
37
- $('#picture').click(function(event){
40
+ $('#tweet-picture').click(function(event){
38
- $("#status").html('キャプチャ中…');
41
+ $("#tweet-status").html('キャプチャ中…');
42
+ // 動画のキャンバス
39
43
  var canvas = document.createElement('canvas');
40
44
  var video = document.getElementsByClassName('dplayer-video-current')[0];
41
- canvas.crossOrigin = 'Anonymous';
42
45
  canvas.width = video.videoWidth;
43
46
  canvas.height = video.videoHeight;
44
47
  canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
@@ -49,17 +52,8 @@
49
52
  });
50
53
  ```
51
54
 
52
- ### 試したこと・補足
55
+ ### 補足
53
-
54
- toBlob()自体がダメかと思いtoDataURL()なども試してみたのですが、同じエラーが出てしまいます。
55
-
56
- canvas.crossOrigin = 'anonymous'; とするという手法が公開されていましたが、上手くいきませんでした…
57
-
58
- HLSやjQueryのJSファイル自体を自ドメイン内にしてみたりもしましたが、状況は変わらず…
59
-
60
- エラーが出るブラウザは、上記の通り
56
+ 確認ブラウザ
61
- iOS…Safari・Chrome・Firefox(エンジンが同じなので全て動かないと思われる)
57
+ - iOS… Safari・Chrome・Firefox
62
- Android…Chrome・Firefox・Opera
58
+ - Android… Chrome・Firefox・Opera
63
- です。
64
- PCではChrome・Firefox・Safariで動作確認をしています。
59
+ - PC(Windows・Mac)… Safari・Chrome・Firefox
65
- (EdgeはMStoBlobとかを使えとか論外なので切り捨ててます(そろそろChromiumベースになるし))

8

修正

2019/05/01 12:52

投稿

JRNA03
JRNA03

スコア12

title CHANGED
File without changes
body CHANGED
@@ -55,6 +55,8 @@
55
55
 
56
56
  canvas.crossOrigin = 'anonymous'; とするという手法が公開されていましたが、上手くいきませんでした…
57
57
 
58
+ HLSやjQueryのJSファイル自体を自ドメイン内にしてみたりもしましたが、状況は変わらず…
59
+
58
60
  エラーが出るブラウザは、上記の通り
59
61
  iOS…Safari・Chrome・Firefox(エンジンが同じなので全て動かないと思われる)
60
62
  Android…Chrome・Firefox・Opera

7

修正

2019/04/30 17:35

投稿

JRNA03
JRNA03

スコア12

title CHANGED
File without changes
body CHANGED
@@ -53,11 +53,11 @@
53
53
 
54
54
  toBlob()自体がダメかと思いtoDataURL()なども試してみたのですが、同じエラーが出てしまいます。
55
55
 
56
- img.crossOrigin = 'anonymous';を使うという手法が主に公開されていましたが、上手くいきませんでした…(そもそも外部ドメインの画像は取得してないし…)
56
+ canvas.crossOrigin = 'anonymous'; するという手法が公開されていましたが、上手くいきませんでした…
57
57
 
58
58
  エラーが出るブラウザは、上記の通り
59
59
  iOS…Safari・Chrome・Firefox(エンジンが同じなので全て動かないと思われる)
60
60
  Android…Chrome・Firefox・Opera
61
61
  です。
62
- PCではChrome・Firefox・Safariで動作確認をしています
62
+ PCではChrome・Firefox・Safariで動作確認をしています
63
63
  (EdgeはMStoBlobとかを使えとか論外なので切り捨ててます(そろそろChromiumベースになるし))

6

修正

2019/04/30 17:27

投稿

JRNA03
JRNA03

スコア12

title CHANGED
File without changes
body CHANGED
@@ -18,6 +18,8 @@
18
18
  また、Androidの場合は、Chrome・Firefox・Opera全てでCanvas自体は取得できているようなんですが、
19
19
  以下のようなtoBlobの処理でTainted canvases may not be exported.エラーが出てしまい、実行の途中でエラーになるためBlob化画像が取得できないためアップロードできない、という問題が発生しています。
20
20
 
21
+ エラーメッセージ自体は「汚染されたキャンバスはエクスポートできません。」との事ですが、別ドメインのM3U8やTSを読み込んでいる訳でもないので不可解というか…
22
+
21
23
  下記はAndroidのChromeにて、Chrome DevTool(リモートで開発者ツールが使える)を使うことで取得しましたが、
22
24
  他のスマホブラウザに関してはどのようなエラーが出ているのかはまだ試せていません…
23
25
 

5

HLSが原因ではないか説

2019/04/30 17:25

投稿

JRNA03
JRNA03

スコア12

title CHANGED
@@ -1,1 +1,1 @@
1
- video要素をCanvasでスクリーンショットするとスマホブラウザでエラーが出る
1
+ HLSのvideo要素をCanvasでスクリーンショットするとスマホブラウザでエラーが出る
body CHANGED
@@ -1,8 +1,10 @@
1
1
  ### 前提
2
2
 
3
- プレイヤーにて再生させている動画をCanvasにてスクリーンショット(キャプチャ)し、それをtoBlobにてBlob化し、
3
+ プレイヤーにて再生させている動画(HLSにて再生)をCanvasにてスクリーンショット(キャプチャ)し、それをtoBlobにてBlob化し、
4
4
  Ajaxでサーバーにアップロードする機能を実装していますが、スマホでのみ何故か上手く動きません。
5
5
 
6
+ 【追記】色々試しているのですが、通常通り動画を読み込んだ際は正常にキャプチャ出来るようで、問題はHLSで再生させている事にありそうな気がします…
7
+
6
8
  PCのChrome・Firefox・Safariでは正常に動作したのですが、何故かスマホのSafari・Chrome・Firefox・Opera等のブラウザでは下のようなエラーが出てしまうようで、正常に動作しません。
7
9
  Androidの方はクロスオリジン(CROS)に関連しているエラーらしいのですが、動画は全て同じドメイン上から配信している他、Canvasで他のドメインの画像を読み込んでいる訳でもなく、何故エラーが出るのか不可解です。
8
10
  iOSの方はエラーが起きているわけではなく、一応正常に取得したはずなのに真っ白で取得されてしまう、といった所のようです。(PCのSafariでは通常通りキャプチャできます)

4

コードを修正しました

2019/04/30 17:24

投稿

JRNA03
JRNA03

スコア12

title CHANGED
File without changes
body CHANGED
@@ -29,22 +29,15 @@
29
29
  ### 該当のソースコード
30
30
 
31
31
  ```JavaScript
32
- initScreenshotCanvas () {
33
- if (this.player.options.screenshot) {
34
- const canvas = document.createElement('canvas');
35
- canvas.width = this.player.video.videoWidth;
36
- canvas.height = this.player.video.videoHeight;
37
- canvas.getContext('2d').drawImage(this.player.video, 0, 0, canvas.width, canvas.height);
38
32
 
39
- return canvas;
40
- }
41
- return false;
42
- }
43
-
44
33
  $('#picture').click(function(event){
45
34
  $("#status").html('キャプチャ中…');
35
+ var canvas = document.createElement('canvas');
36
+ var video = document.getElementsByClassName('dplayer-video-current')[0];
37
+ canvas.crossOrigin = 'Anonymous';
46
- var img = new Image();
38
+ canvas.width = video.videoWidth;
47
- canvas = initScreenshotCanvas();
39
+ canvas.height = video.videoHeight;
40
+ canvas.getContext('2d').drawImage(video, 0, 0, canvas.width, canvas.height);
48
41
  canvas.toBlob(function(blob){
49
42
  file = blob;
50
43
  $("#tweet-status").html('キャプチャした画像を選択しました。');

3

訂正

2019/04/30 17:02

投稿

JRNA03
JRNA03

スコア12

title CHANGED
@@ -1,1 +1,1 @@
1
- Canvasで動画をキャプチャするとエラーがスマホだけ出る
1
+ video要素をCanvasでスクリーンショットするとスマホブラウザでエラーが出る
body CHANGED
@@ -1,6 +1,6 @@
1
1
  ### 前提
2
2
 
3
- プレイヤーにて再生させている動画をCanvasにてキャプチャし、それをtoBlobにてBlob化し、
3
+ プレイヤーにて再生させている動画をCanvasにてスクリーンショット(キャプチャ)し、それをtoBlobにてBlob化し、
4
4
  Ajaxでサーバーにアップロードする機能を実装していますが、スマホでのみ何故か上手く動きません。
5
5
 
6
6
  PCのChrome・Firefox・Safariでは正常に動作したのですが、何故かスマホのSafari・Chrome・Firefox・Opera等のブラウザでは下のようなエラーが出てしまうようで、正常に動作しません。
@@ -58,9 +58,9 @@
58
58
 
59
59
  img.crossOrigin = 'anonymous';を使うという手法が主に公開されていましたが、上手くいきませんでした…(そもそも外部ドメインの画像は取得してないし…)
60
60
 
61
- エラーが出るブラウザは、
61
+ エラーが出るブラウザは、上記の通り
62
- iOS…Safari・Chrome(エンジンが同じなので全て動かないと思われる)
62
+ iOS…Safari・Chrome・Firefox(エンジンが同じなので全て動かないと思われる)
63
63
  Android…Chrome・Firefox・Opera
64
64
  です。
65
-
65
+ PCではChrome・Firefox・Safariで動作確認をしています
66
- PCではChrome・Firefoxで動作確認をしています(EdgeはMStoBlobとかを使えとか論外なので切り捨ててます(そろそろChromiumベースになるし))
66
+ (EdgeはMStoBlobとかを使えとか論外なので切り捨ててます(そろそろChromiumベースになるし))

2

訂正

2019/04/22 19:38

投稿

JRNA03
JRNA03

スコア12

title CHANGED
File without changes
body CHANGED
@@ -3,10 +3,9 @@
3
3
  プレイヤーにて再生させている動画をCanvasにてキャプチャし、それをtoBlobにてBlob化し、
4
4
  Ajaxでサーバーにアップロードする機能を実装していますが、スマホでのみ何故か上手く動きません。
5
5
 
6
- PCのChrome・Firefoxでは正常に動作したのですが、何故かスマホのSafari・Chrome・Firefox・Opera等のブラウザでは下のようなエラーが出てしまうようで、正常に動作しません。
6
+ PCのChrome・Firefox・Safariでは正常に動作したのですが、何故かスマホのSafari・Chrome・Firefox・Opera等のブラウザでは下のようなエラーが出てしまうようで、正常に動作しません。
7
- しかも、iOSとAndroidでエラーの動作が違うという不可解な状況です。
8
7
  Androidの方はクロスオリジン(CROS)に関連しているエラーらしいのですが、動画は全て同じドメイン上から配信している他、Canvasで他のドメインの画像を読み込んでいる訳でもなく、何故エラーが出るのか不可解です。
9
- iOSの方はエラーの把握出来ていません…
8
+ iOSの方はエラーが起きているわけではなく、一応正常に取得したはずなのに真っ白で取得されてしう、といった所のようです。(PCのSafariでは通常通りキャプチャできます)
10
9
 
11
10
  JavaScriptは初心者でCanvasも殆ど触ったことがなく、どのように解決すればいいか悩んでいます。
12
11
  宜しくお願いします。

1

大幅加筆

2019/04/22 19:21

投稿

JRNA03
JRNA03

スコア12

title CHANGED
@@ -1,1 +1,1 @@
1
- CanvasのtoBlob()がスマホのみ Tainted canvases may not be exported. エラーが出る
1
+ Canvasで動画をキャプチャするとエラーがスマホだけ出る
body CHANGED
@@ -1,24 +1,25 @@
1
1
  ### 前提
2
2
 
3
3
  プレイヤーにて再生させている動画をCanvasにてキャプチャし、それをtoBlobにてBlob化し、
4
- Ajaxでサーバーに送信するプログラム書いています。
4
+ Ajaxでサーバーにアップロードする機能実装していますが、スマホでのみ何故か上手く動きません
5
5
 
6
- PCのChrome・Firefoxでは正常に動作したのですが、何故かスマホのChrome・Firefox・Operaでは下のようなエラーが出てしま
6
+ PCのChrome・Firefoxでは正常に動作したのですが、何故かスマホのSafari・Chrome・Firefox・Opera等のブラウザでは下のようなエラーが出てしまうようで、正常に動作しせん
7
+ しかも、iOSとAndroidでエラーの動作が違うという不可解な状況です。
7
- クロスオリジン(CROS)に関連しているエラーらしいのですが、動画は全て同じドメイン上から配信している他、Canvasで他のドメインの画像を読み込んでいる訳でもなく、何故エラーが出るのか不可解です。
8
+ Androidの方はクロスオリジン(CROS)に関連しているエラーらしいのですが、動画は全て同じドメイン上から配信している他、Canvasで他のドメインの画像を読み込んでいる訳でもなく、何故エラーが出るのか不可解です。
9
+ iOSの方はエラーの把握が出来ていません…
8
10
 
9
11
  JavaScriptは初心者でCanvasも殆ど触ったことがなく、どのように解決すればいいか悩んでいます。
10
12
  宜しくお願いします。
11
13
 
12
- ### たこと補足
14
+ ### 発生ている問題エラーメッセージ
13
15
 
16
+ まず、iOSの場合は、Safari・Chrome・Firefox全てにおいて、「一応実行は出来るが真っ白な画像(サイズは動画の大きさ(動画が720pなら1280×720の画素になる))しか取得できない」という問題が発生します。
14
- toBlob()自体がダメかと思toDataURL()ども試してみたのですが、同じエラーが出てしまいます。
17
+ また、Androidの場合は、Chrome・Firefox・Opera全てでCanvas自体は取得できてるようですが、
18
+ 以下のようなtoBlobの処理でTainted canvases may not be exported.エラーが出てしまい、実行の途中でエラーになるためBlob化画像が取得できないためアップロードできない、という問題が発生しています。
15
19
 
16
- img.crossOrigin = 'anonymous';を使うという手法が主に公開されていましたが、上手くいきませんした…(そもそも外部ドメインの画像は取得してない…)
20
+ 下記はAndroidのChromeにて、Chrome DevTool(リモートで開発者ツールが使える)を使うとで取得したが、
21
+ 他のスマホブラウザに関してはどのようなエラーが出ているのかはまだ試せていません…
17
22
 
18
- エラーメッセージはスマホでChromeを開き、Chrome DevTool(リモートで開発者ツールが使える)を使うことで取得しましたが、ほかのスマホブラウザに関してはどのようなエラーが出ているのかは分かりません(ただし、キャプチャ画像を選択しました の通知がいくら待っても出ない点は共通しているので、恐らく同じエラーで落ちていると思われます)。
19
-
20
- ### 発生している問題・エラーメッセージ
21
-
22
23
  ```
23
24
  (index):yyy Uncaught DOMException: Failed to execute 'toBlob' on 'HTMLCanvasElement': Tainted canvases may not be exported.
24
25
  at HTMLImageElement.<anonymous> (http://192.168.1.xx:xxxx/:yyy:zz)
@@ -50,4 +51,17 @@
50
51
  $("#tweet-status").html('キャプチャした画像を選択しました。');
51
52
  });
52
53
  });
53
- ```
54
+ ```
55
+
56
+ ### 試したこと・補足
57
+
58
+ toBlob()自体がダメかと思いtoDataURL()なども試してみたのですが、同じエラーが出てしまいます。
59
+
60
+ img.crossOrigin = 'anonymous';を使うという手法が主に公開されていましたが、上手くいきませんでした…(そもそも外部ドメインの画像は取得してないし…)
61
+
62
+ エラーが出るブラウザは、
63
+ iOS…Safari・Chrome(エンジンが同じなので全て動かないと思われる)
64
+ Android…Chrome・Firefox・Opera
65
+ です。
66
+
67
+ PCではChrome・Firefoxで動作確認をしています(EdgeはMStoBlobとかを使えとか論外なので切り捨てています(そろそろChromiumベースになるし))