こんにちは。きんくまです。
タイトルの通り今回は、「Android 4.3 の標準ブラウザとChromeでSoundJSを使って音を鳴らしたい」です。
SoundJSは音を鳴らすライブラリ。これです。
>> SoundJS
今回PreloadJSも使ってるのでこちらも。こちらはあらかじめリソースを読み込んでおくライブラリです。
>> PreloadJS
で、Chromeだと鳴るんだけど、標準ブラウザだとうまく鳴らなかったので、いろいろと調べたことをまとめてメモします。
先に結論を書いてしまうと
Android標準ブラウザでは、HTMLAudioPluginを使って、音を1つだけ鳴らす
SoundJSは Pluginとして、いくつかのものが登録できます。
– createjs.WebAudioPlugin,
– createjs.HTMLAudioPlugin
– createjs.FlashAudioPlugin
WebAudioAPI, Audioタグ, Flash代替版 ですね。
それで、ドキュメントを読むと WebAudioとAudioタグをデフォルトで読み込むよと書いてあります。
>> Sound Class – Plugins
Android標準ブラウザでも両方とも対応しているっぽくてWebAudio版も読み込みます。
こんなコードを書くと 両方とも supported! なんて出ます。
if(createjs.WebAudioPlugin.isSupported){ console.log('web audio supported!'); }else{ console.log('web audio not supported'); } if(createjs.HTMLAudioPlugin.isSupported){ console.log('html audio supported!'); }else{ console.log('html audio not supported'); }
が、WebAudioでは音は鳴らないっぽいです、、、。うわ!サポートしないくせに!ダメってフラグが立っていれば、、、。
音はならないくせにWebAudioプラグインを優先的に読み込んでいるので、なりません。
もっと正確にいうと、なぜか短い音は鳴るという謎仕様です。時間が長くなると無音になって、エラーも出ない、、。このあたりがハマりどころですなー。
最初原因が全くわからず、mp3のエンコード方法をステレオからモノラルにしてみたり、ビットレートを低くして書き出してみて試したのは内緒です。
なので、HTMLAudioPluginだけを明示して書いてあげます。
createjs.Sound.registerPlugins([ createjs.HTMLAudioPlugin ]);
ただPCやiOS、Android版ChromeはWebAudioでも問題なく動いているので、Android標準ブラウザだけこの挙動にしたいです。
(デフォルトでWebAudioPlugin、HTMLAudioPluginは読み込む挙動だから書かなくてもよい)
標準ブラウザの判定はUserAgentでできるっぽいです。
>> How to detect the stock Android browser
これを使って、if文で分岐してあげます。
あと、Audioタグは1ページで同時に1つだけしか音を鳴らせない仕様っぽいので、例えばBGMと効果音(SE)を同時に鳴らすのはムリ!
なので、Android標準ブラウザでは、BGMだけを鳴らして、他は効果音を同時に鳴らす、( or 効果音だけならすとか)という感じの仕様になると思います。
(Android版Chromeは同時にならせる!スバラしいっ!)
それで、このあたりをまとめて書いたサンプルコードが下のものとなります。
main.js
var androidDefaultBrowserChecked = false; var isAndroidDefaultBrowser = false; var loadQueue = new createjs.LoadQueue(); loadQueue.installPlugin(createjs.Sound); //PlayButtonは読み込み時は display:none; だと思ってくださいまし var playButton = document.getElementById('playButton'); var seSoundRef; var bgmSoundRef; //ファイル名をIDにしちゃってますがその辺は変えてください var SE_ID = "se_filename"; var BGM_ID = "bgm_filename"; //original //http://stackoverflow.com/questions/14403766/how-to-detect-the-stock-android-browser function checkAndroidBrowser(){ if(androidDefaultBrowserChecked){ return isAndroidDefaultBrowser; } var navU = navigator.userAgent; // Android Mobile var isAndroidMobile = navU.indexOf('Android') > -1 && navU.indexOf('Mozilla/5.0') > -1 && navU.indexOf('AppleWebKit') > -1; // Apple webkit var regExAppleWebKit = new RegExp(/AppleWebKit\/([\d.]+)/); var resultAppleWebKitRegEx = regExAppleWebKit.exec(navU); var appleWebKitVersion = (resultAppleWebKitRegEx === null ? null : parseFloat(regExAppleWebKit.exec(navU)[1])); // Chrome var regExChrome = new RegExp(/Chrome\/([\d.]+)/); var resultChromeRegEx = regExChrome.exec(navU); var chromeVersion = (resultChromeRegEx === null ? null : parseFloat(regExChrome.exec(navU)[1])); // Native Android Browser isAndroidDefaultBrowser = isAndroidMobile && (appleWebKitVersion !== null && appleWebKitVersion < 537) || (chromeVersion !== null && chromeVersion < 37); androidDefaultBrowserChecked = true; return isAndroidDefaultBrowser; } function setupSoundJS(){ if(isAndroidDefaultBrowser){ console.log('register plugin'); createjs.Sound.registerPlugins([ createjs.HTMLAudioPlugin ]); } createjs.Sound.alternateExtensions = ["mp3"]; } function loadSound(){ loadQueue.on("complete", onSoundLoad, this); loadQueue.loadFile({id:SE_ID, src:"sound/" + SE_ID + ".mp3"}, false); loadQueue.loadFile({id:BGM_ID, src:"sound/" + BGM_ID + ".mp3"}, false); loadQueue.load(); } function onSoundLoad(e){ loadQueue.off("complete", onSoundLoad); showButton(); } function playSound(){ if(isAndroidDefaultBrowser == false){ seSoundRef = createjs.Sound.play(SE_ID); } bgmSoundRef = createjs.Sound.play(BGM_ID); } function showButton(){ playButton.style.display = 'block'; } function init(){ checkAndroidBrowser(); setupSoundJS(); loadSound(); } playButton.addEventListener('click', function(){ playSound(); }); init(); console.log('default browser? =' + isAndroidDefaultBrowser);
index.html
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <link rel="stylesheet" href="css/sample.css"> <title>Sample</title> </head> <body> <div id="playButton">再生</div> <script src="js/soundjs-0.6.2.combined.js"></script> <script src="js/preloadjs-0.6.2.min.js"></script> <script src="js/main.js"></script> </body> </html>
■ 自作iPhoneアプリ 好評発売中!
・フォルメモ - シンプルなフォルダつきメモ帳
・ジッピー電卓 - 消費税や割引もサクサク計算!
■ LINEスタンプ作りました!
毎日使える。とぼけたウサギ