videoタグとコーデックのお話し

html5には動画を文書に埋め込むための<video>タグがありますね!
html5も2012年12月17日にW3Cが策定完了の発表を行ったり、2013年1月6日には全国のコワーキングスペースなどで新春!!HTML5KARUTA大会が行われるなど、話題にも事欠きませんが、流行のiPad、iPad miniなどiOS系ではFlashなどの技術が基本的には使えないなど、動画の世界もhtml5を利用した技術へとシフトしてきた感があります。

当方も今までFlashやWMVで提供していた動画を、各種スマートフォンやタブレットなどでも再生ができるように<video>タグによる動画再生へと変更することにしました。が!これが意外と面倒でしたよっと…技術的な覚え書きを残しておきます。

まずはhtml5のコードですね。
一応、現在作成中のサイトはIE7以下をばっさり切り落として作成しているので、IE8以降と一部の有名ブラウザ程度をカバーする程度の内容でございます。元々存在していたFlash動画をIE8用に再生できる仕様にはしていますが、完全ではございませんのでご注意ください。

<video poster="/img/movie/movie.jpg" preload="metadata" controls="controls">
  <source src="/img/movie/webm/movie.webm" type="video/webm" />
  <source src="/img/movie/mp4/movie.mp4" type="video/mp4" />
  <object id="movie" data="/img/movie/flash/movie.swf" type="application/x-shockwave-flash" width="356" height="200">
    <param name="allowScriptAccess" value="sameDomain" />
    <param name="movie" value="/img/movie/flash/movie.swf" />
    <param name="quality" value="high" />
    <param name="wmode" value="transparent" />
    <param name="scale" value="showall" />
      Movie
  </object>
</video>

<video>タグについての詳しい説明は省きますが、posterは動画再生前の静止画を指定できます。
preloadをmetadataにしているのは、モバイル端末などで自動再生されると相当な容量のデータをページを開いただけでダウンロードさせることになるので、動画の情報だけを取得するようにしています。
controlsは指定しておけば再生などのインターフェースを表示できます。

sourceは様々なブラウザでも再生できるよに複数のコーデックを使い分けができるように別表記しています。このソースではその下にobjectタグでFlashを指定していますが、一応<video>タグに対応していないIE8などのために入れてあります。通常は<p>動画を再生するには、videoタグをサポートしたブラウザが必要です。</p>などのように指定しておけばいいようです。

動画のコーデックに関しては、Wikiなどを見ると各ブラウザで迷走中のようですが、IE9~10、Firefox、Chromeなど各最新版のブラウザをターゲットにするならmp4とWebMがあれば十分対応できると思います。

さてこれで指定した場所に動画のファイルがあれば再生されるはずなんですが…

「ローカルで再生するのにサーバーにアップロードすると再生しないじゃんか!」

なんてことが起こります。まあ、多分ほとんどこのケースのようです。そんな時にも慌てず騒がず.htaccessに以下の記述をしましょう。

AddType video/mp4 .mp4
AddType audio/webm .webm

サーバーがmp4やwebmの形式を認識できていない事が原因のようですのでほとんどの場合これで解決します。

さて、mp4とWebMコーデックの準備なんですが、最初はWebMのエンコードに手間取りました。最初はMiro Video Converterなるフリーソフトで変換してみましたが、Firefoxできれいに再生されませんでした。
最終的にはFree Studioというさまざまな動画変換をパックにしたフリーソフトで対応しました(Macの方は別のソフトをお探しくださいorz)

WebMに関してはこれで変換するだけで問題なく再生されると思います。

mp4ですが、これもややはまりました。同じくFree Studioで変換をしたのですが、IE9で再生されませんでした。IE9でmp4が再生されない時の調査方法は、[F12]で開発者ツールを開いてネットワークタブを開きます。

photo_20101118_0038
この状態で[F5]ないしページの更新を行えばページで使われているファイルが取得される様子が分かります。ここで先ほどソースに書いたsourceのsrcに書かれている/img/movie/mp4/movie.mp4がちゃんと読まれているのか確認できます。
アップロードしたmp4ファイルの種類がvideo/mp4になっていなかったら前述した.htaccessなどでファイルタイプを指定していないとそのサーバーでは再生できません。すぐに指定しましょう。(できないサーバーもあると思います)

しかし、ここが間違っていなくてもIE9で再生できない場合があります。私はそうでした。
これは、拡張子mp4のコーデックには2種類あり、MPEG4形式のものとH.264形式のものがあって、IE9ではH.264形式のものがサポートされているということだそうです。
前で紹介したFree Studioでmp4形式に変換できますが、デフォルトではH.264でサイズフリーのもの(変換元の動画のサイズを変換しないもののこと)がプルダウンにありませんでした。でも自分で設定できるので、

photo_20101118_0039
などのように適当に作成して変換してしまいましょう。

これでIPad、IE9、Firefox18、Chrome24で再生を確認できました。
html5が使えるブラウザが増えてきて<video>タグなども気軽に使えるようになってきましたが、サーバーの設定やコーデックなど、ソースコードだけではどうにもならないものもありますので、みなさんの参考になればいいなー

レスポンシブWebデザインの時に考えるhtaccess

最近はレスポンシブWebデザインでホームページを作ることも増えてきましたよね。

ただ、気をつけなくてはいけないのが、スマートフォンなどの携帯ブラウザで見たときも同じサイズの画像が表示されるってことです。(基本的にはですけどね)

CSSの書き方にもよるのでしょうけど、@media screen and (max-width: 569px)なんて書き方で分岐していても、CSSで読まれていないはずの場所の画像が実は読まれているなんてことはよく耳にします。FireMobileSimulatorなどを導入してFirebugなどで調べれば実際に読み込まれているか調査できますのでご自身のサイトで確認してみるといいですよ。

で、media screenなどの分岐ではなく、画像はそのまま表示しちゃいましょうとなると、やはり気になるのは画像サイズですね。

PCブラウザ用に作られた画像は、例えば文字の乗って入るバナーのような画像とか、ファイルサイズ的にはそんなに大きくなくても、スマートフォンの小さな画面に縮小されてしまうと文字が読めなくなるなどの弊害も考えられます。

今回、管理サイトのリニューアルに際し、サイトのWidthが大きくなることになりました。そしていくつかのランディングページ的な役割のファーストビュー部分をインパクトを持たせるためにサイドバーなしの大きな画像で表現することになってしまったため、その大きな画像をスマートフォンに読ませないために色々工夫することになりました。

そこで思いついたのがスマートフォン用の画像を別に用意してhtaccessで分岐させてしまおうという方法です。

ただし、すべての画像をスマートフォン用に用意するのは嫌なので、スマートフォン用の画像が用意されている場合はそちらを読み込み、それ以外はPC用の画像をそのまま使用するという方法で行うことにしました。

しかし、タブレット(iPadやAndroidタブレット)ではPC用の表示を行いたいためスマフォ用画像は使わない(タブレットを省く)設定にしなくてはいけません。

で、行き着いた先のhtaccessがこちらです。

# スマートフォンでアクセスがあった場合に画像フォルダを変更
RewriteEngine on
RewriteBase /img/

RewriteCond %{REQUEST_URI} !mobile/
RewriteCond %{HTTP_USER_AGENT} (iPhone|iPod|Android.*Mobile|BlackBerry|Windows\ Phone|Windows\ CE) [NC]
RewriteCond %{REQUEST_URI} ^/img/(.*)$
RewriteCond %{DOCUMENT_ROOT}/img/mobile/$1 -f
RewriteRule (.*) /img/mobile/$1 [R,L]

ルートにimgのフォルダがあります。その中に普通にページごとにフォルダ分けされており、/img/hoge/fuga.jpgなどのように置かれています。

スマートフォン用の画像はimgの下にmobileフォルダを作り、PC用画像のフォルダと同じ構成で/img/mobile/hoge/fuga.jpgなどのように置いています。

まず{REQUEST_URI}でmobileフォルダの場合はリライトを無効にします。

次に{HTTP_USER_AGENT}でスマートフォンを抜き出しますが、Androidには携帯とタブレットの両方があります。iPadはUserAgentがはっきり分かれていますが、Androidはどちらもほぼ同じです。しかし、Android携帯の場合UserAgentにmobileという記述が入ってくるらしいので、これが入っていないものはタブレット(もしくはAndroidOS搭載のPC?)とみなしてリライトしません。(Windows系の記述はどっかからの丸コピで実際に試していませんのでご注意)

そして次の行でimg以下のURLを取得し、RewriteCond %{DOCUMENT_ROOT}/img/mobile/$1 -fでmobileフォルダ配下に画像が存在しているかどうかを-fのフラグでチェックしています。この「リライト先に画像があるのかないのか?」の判定をhtaccess上で行うのがちょっと苦労しました。Neo Inspirationさんの.htaccess で RewriteCond の後方参照がとても参考になりましたのでご紹介しておきます。

iPhone4S、iPad、Android携帯での実機検証もしていますが、何か不具合や問題点の指摘などがありましたら教えてください。自力だとこれが限界です(汗)ソーシャルの力を信じましょうw