iPhoneでHTML5のaudio要素を使うときに気をつけたいこと


HTML5 Powered with Multimedia

HTML5ではaudio要素が追加され、外部プラグインを使わずブラウザで音を扱えるようになりました。そこで、デモを作ろうとしたのですが、ハマったポイントがいくつかあったので紹介します。検証環境はPC:Safari5.0.5(WIN)、iPhone:iOS4.3.2のMobile Safariです。
 

loop属性が効かない

audio要素ではloop属性を付けることで、繰り返し再生が可能です。PCでは動作しますが、iPhoneではこれがうまく動作せず、1回再生されて停止してしまいました。onendedを使い、最後まで再生したらもう一度再生させれば対処できます。

<audio src=”audio.mp3″ preload=”auto” onended=”this.play()” ></audio>

 

ユーザのアクションをトリガーにしてしか読み込み、再生できない

iPhoneでは従量課金の可能性があるのでautoplay, autobuffer属性は無効になっていますので、代わりにWebページ読み込み時(onload)のタイミングでプリロードや再生ができるか試してみました。これも、PCでは動作しますが、iPhoneでは動作しません。iPhoneでは、ユーザのアクションがトリガーになるようなものでないとロードが開始されないようです。
 

同時に1音しか鳴らせない

2音を同時再生できるか検証してみました。PCでは1音を再生させた後、2音目を再生させると同時に再生されますが、iPhoneでは前の音が強制的に停止してから次の音が再生されます。iPhoneでは同時に1音しか鳴らせないようです。
 

読み込みの状態を知りたい場合は、canplayイベントで

loadはデータ全体の読み込みが完了したというイベント、canplayは再生が可能になったというイベントですが、iPhoneではloadイベントが発生していないようでした。プリロードなど、読み込みの状態を知りたい処理はcanplayイベントを使うのが良さそうです。

function loadAud(){
  var aud = document.getElementById(‘elementId’);
  aud.addEventListener(‘canplay’, function(){
    // なにかしらの処理
  }, true);
  aud.load();
}

 

load()しなくてもplay()できる

データを読み込むload()メソッドと、再生を行うplay()メソッドがありますが、load()させなくてもplay()のみで再生可能です。ただし、PC版ではplay()のみの場合はcanplayイベントが発生していないようでした。iPhoneでは発生しているようなので、そのタイミングで処理を書くことが可能です。
 

複数プリロードしておこうとすると1音しか鳴らないことがある

初回再生の際の遅延を無くすため、スタートボタン等のクリック時に複数の素材をあらかじめload()しておき、後で個別再生させるということが考えられますが、これもPCでは意図通りに動くものの、iPhoneでは1音しか鳴らなくなるようでした。1音だけload()している場合は、遅延が無くなり意図通りに動きます。
 

まとめ

プリロードを気にせず、アクション時に読み込み、1音だけ鳴らす、などは比較的簡単に実装ができそうですが、PC版Safariで動いてもiPhoneでは挙動が違うものもあり、なかなか強敵でした。新しく追加された要素だけに、現段階ではまだまだ安定しない部分があるようです。