複数 youtube 動画の同時再生… (不満)

よくできました、だったなら大作投稿にもなったろうに。

話の前提として、「あるイベントを同時撮影していたとして、それらの撮影開始時刻が全て違い、これを同期再生したい」ということである。

そもそも youtube から動画を「ダウンロード」することが規約違反であるので、そうではない動画を「手持ち」だとするならば、これは html5 の video、audio を使えばいいだけのこと。これは simple_html5_simult_player_builder.py の形で皆が使えるようにしといたので、そっちみてもらえればいい。かなり簡単。むろん html5 が使えることが前提だけれども。

そうではなくて、埋め込み youtube プレイヤーをダイレクトにコントロール出来ませんかいの、てことである。このドキュメントそのものは公式のものがある。だから簡単だ…、と言えれば良かったが大変よろしくない。

まずドキュメントが非常にワゲワガラン。ドキュメントの構造がなっとらんのであり…、あのね、ドキュメントってのはさ、目次だけ読んでもおおまかにあらすじだけはわからんといかんとですよ。何言ってんのかさっぱりわからんてば。

んで、一時間ほど悶絶しながら「出来てみた」のが以下である:


(今あなたがごらんにならはってる)このページからダイレクトに「Play」するとうまくいかないことが多い(しワタシのこのページの PV が無駄に増える原因にもなるので)ので、Chrome なら「フレームのソースを表示」してローカルにページをダウンロードして実行してみて欲しい。何をしているかについても、そうして「フレームのソースを表示」して中身を読んでおくれ。(公式ドキュメントだけ読んでもわからないハズなのが player オブジェクトに「オレオレプロパティ」(_delay)を突っ込んでることくらいなはず。インデクス変数 i が参照できないのでんなことしてる。)

多少のズレが生じることは当然想定して始めたが、現実には「キーフレーム問題」だけでは説明出来ないズレが生じるのだが、これは非常に設計不全(もしくはドキュメントのウソ)によるものだ。

おそらく一番の問題は seekTo の説明

この関数を呼び出したときにプレーヤーが一時停止している場合は一時停止のままになり、その他の状態(playing、video cued など)から呼び出した場合は、動画が再生されます

が実際は大嘘で、seekTo するだけで一時停止状態から勝手に再生を始めてしまうことだ。(つまり正確な位置にシーク出来ていたとしても、「勝手に再生→やむなくポーズ」での遅延が発生する。)

また、「pauseTo」の振る舞いが、我々のような一般人が考えるものとはかけ離れているのも問題。ローディング中だと思わんか、矢印クルクルしちゃったらさ。なんか頭おかしいんちゃうか。わたし、なんか勘違いしとるか? してないと思うけどなぁ?

まぁ…「想定済み」言った通りで、もともとからして実用になるものにはならないだろうことはわかってやってて、「絶対ズレない」保証のためにはもう、ひとつの動画に結合してしまうのが残念ながら最善なことはわかりきっているわけですよ。だけれどもこれは非常に時間がかかる作業なわけで、なおかつ「融通がきかない」ことが難点で、つまりは「同期再生する完成品動画を作る」という目的以外には「ヘビィ過ぎる」のね、なので「埋め込み youtube を直接コントロールする」というアプローチは、ワタシにとっては「ひとまず時間のズレを手っ取り早く確認(テスト)するのに使いたい」という程度ではあるのよ。それはわかってる。わかってるけどいくらなんでもこれは…、てことである。

なんというか「出だし好調」だったならもうちっと突き詰めたいこともあったんだけどね。たぶんクロスドメイン関係があるんじゃないだろうか。けど入り口の抜本的な問題がこれはもう措置しようがない問題なのでね…、なのでこのネタはこれでおしまい。