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

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()している場合は、遅延が無くなり意図通りに動きます。
 

Related Post

iOS8とiOS7にプッシュ通知を送るiOS8とiOS7にプッシュ通知を送る

iOS8では、プッシュ通知から直接返信するなどのアクションが出来るようになりましたが、それに伴って通知の仕様も大きく変更されました。 この記事では基本的な手順とパラメータの変更点について簡単にまとめています。 プッシュ通知の登録手順の変更 上で述べた通知の機能拡張に伴い、アクションのない(=iOS7以前と同様の)プッシュ通知を行う場合でも実装方法が変わりました。具体的には、これまでプッシュ通知の登録時に使用していたregisterForRemoteNotificationTypes:メソッドが非推奨になり、registerUserNotificationSettings:メソッドとregisterForRemoteNotificationsメソッドを使う形になりました。 メソッド名だけ並べても分かりにくいので実際のコードで示すと iOS7以前ではこうだったのが… [application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge

Parse.comを使ったiOSデバイスへのプッシュ通知[導入編]Parse.comを使ったiOSデバイスへのプッシュ通知[導入編]

アプリのバックエンド機能を提供するBaaSサービスのParseを使ってプッシュ通知を行う方法をご紹介します。 Parseの詳細については公式ページまたは過去記事を参照してください。 無料版でも、ターゲットを絞り込んだ通知など多くのことが行えるので、3回に分けて紹介していきます。 今回はその第1回、プッシュ通知機能を実現するまでの導入手順についてです。 なお、ParseはiOS、Android、Windows Phoneなどさまざまなデバイスに通知を行うことができますが、この記事ではiOSを対象とします。 公式のドキュメント(Quick Start

dotFes 2012 SENDAIに参加してきましたdotFes 2012 SENDAIに参加してきました

これまで写心機(ver.1、ver.2)で、2度コラボレーションしてきたワンパク(1PAC Inc.)さんからお誘いあって、dotFes 2012 SENDAIに3度目のコラボレーションとなるデジタルインスタレーションを出展してきました! 今回のインスタレーションは、dotFesに合わせて新しく企画し造ったのですが、アイデアのスタートとしては、「Kinectを使わないインスタレーションにする」「たくさんの余ったデバイスを使う」という縛りでした。両社が短い開発期間と本業の合間をぬって、たくさんのアイデア出しと熱い議論を重ねました。そして完成したのが 「device organized table