質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

2回答

9331閲覧

iPadで、フルスクリーンで表示されているビデオの中断時にページ遷移をしたい

JunzoMatunoo

総合スコア29

iOS 9

iOS 9は、アップル社のモバイルOSであるiOSシリーズのバージョン。特徴として検索機能の強化、Siriの機能改良、iPad向けマルチタスクなどがあります。マルチウィンドウ機能をサポートし、iPad向けマルチタスクもサポートされています。

Safari

SafariはAppleのウェブブラウザであり、Mac OS XとiOSのデフォルトのブラウザです。

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2016/09/11 09:06

編集2016/09/11 09:23

動画を使ったブラウザアプリを作成しています。
iPad限定で使用するアプリで、動画解説ページの動画を再生するボタンをおした時に、display:none;で隠しておいたビデオをFullScreen APIを使って全画面表示をしてビデオを再生しています。

css

1// 普段はビデオ要素を非表示にしておく 2video { 3 display: none; 4}

javascript

1var video = document.getElementsByTagName("video")[0]; 2video.webkitEnterFullScreen(); // フルスクリーン状態にして、 3video.play(); // 再生

ここからが本題です。
ビデオの再生が完了したときに、下記の条件で別ページに遷移したいと思っています。

  • ビデオが最後まで再生され、自動的にフルスクリーンが解除された時・・・完了ページに移動する
  • ビデオを途中で中断してユーザーがフルスクリーンを解除した時・・・中断ページに移動する

これを実現しようと思い、videoのイベントを使って下記の様に設定してみました。

javascript

1var video = document.getElementsByTagName("video")[0]; 2video.webkitEnterFullScreen(); // フルスクリーン状態にして、 3video.play(); // 再生 4video.addEventListener("ended", function (evt) { 5 // ビデオの再生が完了した時に別のページに移動する 6});

しかし、この書き方だと、動画が完全に再生されたあとしか発火せず、動画を途中で中断してフルスクリーン状態が解除された時には発火しないのです。

videoのイベントに動画を途中で中断したなんていうものは存在しないので、Full Screen APIのイベントであるfullscreenchangeイベントを使えばうまく設定できるかも、と思って下記のように書いてみました。

javascript

1var video = document.getElementsByTagName("video")[0]; 2var video_state = ""; 3 4video.addEventListener("ended", function (evt) { 5 video_state = "ended"; 6}); 7 8video.addEventListener("fullscreenchange", function (evt) { 9 if (!evt.currentTarget.fullscreenEnabled && video_state == "") { 10 // フルスクリーンが解除された時に、video_stateが空なら中断されたとみなして、 11 //中断メッセージの書かれたページに移動 12 } else if ( !evt.currentTarget.fullscreenEnabled $$ video_state == "ended" ) { 13 // フルスクリーンが解除された時に、video_stateがendedなら、再生が完了しているとみなして、 14 // 完了メッセージがかかれたページに移動 15 } 16}); 17 18video.webkitEnterFullScreen(); // フルスクリーン状態にして、 19video.play(); // 再生

しかし、残念ながらfullscreenchangeイベントが発火せず行き詰ってしまいました。
webkitFullScreenと書いているように、まだベンダープレフィックスを付けないと行けないと思ってwebkitを付けてみて試してみましたが(webkitfullscreenchange,webkitFullScreenChange)それでもうまく行きませんでした。

色々と調べていると、Full Screen API自体がiOSに対応していないなんてことも書かれていたんですが、webkitFullScreenは動作するしで、よくわからん状態です><

確認環境は、MacのSimulatorを使ってiOS9.2で確認しています。

どなたかよい方法をご存知の方、ご教授願います。

追記1:

MacのChromeではwebkitfullscreenchangeでうまくイベントが発火しました。。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

kei344さんから頂いた回答をヒントにして下記のような形で解決できました。

javascript

1 // ビデオが最後まで再生された時 2 video.addEventListener("ended", function (evt) { 3 //ビデオが完全に終了した場合は、フルスクリーンを解除 4 this.webkitExitFullScreen(); 5 console.log("ended"); 6 // 完了ページへの遷移を実行 .. 7 }); 8 9 // ビデオが停止された時 10 video.addEventListener('pause', function (evt) { 11 // ビデオを停止時のスクリーンの状態を確認 12 checkPausedState(this); 13 }); 14 15 function checkPausedState (video) { 16 17 setTimeout(function () { 18 // videoのフルスクリーンモードを確認 19 if (video.webkitDisplayingFullscreen) { 20 // 動画が停止中か確認し、停止中なら再帰的に処理を実行 21 if (video.paused) { 22 console.log("full screen mode means still pausing.."); 23 checkPausedState(video); 24 } 25 } else { 26 // フルスクリーンモードから抜けている場合はここを実行 27 console.log("video playing canceled"); 28 // 中断ページへの遷移を実行 .. 29 } 30 }, 100); 31 32 }

動画を中断する方法が、「"閉じる"ボタンを押して停止+フルスクリーン解除」と「"停止"を押したあとに"閉じる"を押してフルスクリーン解除」の2つがあって、pauseイベント発火時に必ずしもフルスクリーンが解除されている訳ではなかったので、setTimeout()で状態確認をして対応しました。

また、色々と調べていると、どうもiOS独自(?)のHTMLVideoElementなるものが存在するようで、webkitEnterFullScreen()webkitDisplayFullscreenはそのAPIが提供する機能です。
なので他デバイスでの実装にはAPIの実装状況をみて処理の切り替えが必要になりますが、今回はiPadのみ対象としていますので今回の実装はここまでにしときます。

投稿2016/09/11 19:18

JunzoMatunoo

総合スコア29

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

手元に環境が無いため、できるかは試せていませんが、いくつか回答してみます。


  1. document.addEventListener( 'click', function(){} ) でタップ自体を取得し、そのとき再生中で無ければ中断している

イベントの伝播がビデオでも問題なくいけるのであれば可能。
0. ビデオの pause error abort などのイベントを監視する
止まった状態でフルスクリーンかどうかを判別する。
0. フルスクリーンが始まった時点で、背後で中断ページを読み込んでおく
フルスクリーンを解除したら実質ページ移動したことと同じ意味合いになります。


何かのお役に立てればいいのですが・・・。

【html5 video 使う 再生中かどうかの判定 | 徳島のホームページ制作屋】
http://ziyudom.com/post-717/

【video要素、audio要素をJavaScriptから操作する-HTML5のAPI、および、関連仕様】
http://www.htmq.com/video/

投稿2016/09/11 16:12

kei344

総合スコア69407

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JunzoMatunoo

2016/09/11 18:17

ありがとうございます! ご回答いただいた3つですが、 1. → 再生中の動画の上でクリック(タップ)してみましたが、イベント伝播起こりませんでした。 3. → このアプリですが、View側でriot.jsを使用していて(ソースコードはわかりやすくするため、その部分のコードは省いていました)、riot.routerによってhushChangeを監視している状態です。そのため、Viewを切り替えると、video要素も画面上からなくなってしまうのでこの方法は利用できませんでした。 総合的に考えると、2の解決方法が良さそうな気がしましたので、その方向で考えてみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問