音声を高速に読み込むプラグイン

くらむぼん

モデレーター
スタッフ
モデレーター
こんにちは、くらむぼん。

TinySoundfotがMicrosoft Edgeでうまく機能しないかどうかはわかりません。 私はTinySoundfontの作者がMicrosoft Edgeの問題を解決するためにソフトウェアをアップデートして、MIDIをできるだけ多くのブラウザでサポートできるようにしたいと思います。

WebAssemblyをサポートするように素材を更新して、パフォーマンスがさらに向上する可能性はありますか

ソフトウェアを共有する許可をいただきありがとうございます。 私はこの素晴らしいニュースをできるだけ多くの人々に伝えたいと思います。

宜しくお願いします

WebAssemblyは、一般的にパフォーマンスの向上に寄与するでしょう。
今回のケースでも向上するかどうかはわかりませんが、良い試みだと思います。
 

火筒さしゃ

ユーザー
くらむぼん様へ、
先日のストリーム無効のfirefoxの件では
大変お世話になりました。
しかし、また新たに問題点が発生してしまいました…

ios12.3.1の携帯端末(iPhoneSEにて確認)のsafariにて
特定のSE再生時にエラーで進行不能となる現象を確認しました。

以前と同様 NotSupportedError: Operation is not supported ですが、
ios携帯端末の為、コンソールログが確認出来ません。

前回用意した検証用プロジェクトにて
問題のSEを再生出来るテストキャラ(ハロルド)を
メインマップに配置しておりますので、確認頂く事は可能でしょうか。
https://game.nicovideo.jp/atsumaru/games/gm11060?key=b14031fd843a
なおAudioStreaming.jsは暗号化音声ファイル対応後のVerを使用しております。

現時点で分かっている事は以下の通りです。
・テストプレイ、Windowsデプロイ版は問題無くSE再生可能
・Windows7のfirefox,Chromeでは問題無くSE再生可能
・iosのsafariでは再現率100%でエラーが発生する
・OggOnly.jsに差換えてiosのsafariで試すとエラーは発生しないが無音

以上、大変お手数ですがご確認の程 宜しくお願い致します。
 

Awaya_Matana

ユーザー
おや、特にそんな仕様にはしてないですが…と思って実際に動作させてみたら、確かに動きませんでした><
暗号化でも再生されるように修正しました!最上部のリンクからAudioStreaming.jsを再入手してください~
ありがとうございます!
 
>NotSupportedError: Operation is not supported
前回と違う場合の可能性は、非サポートのサンプリングレートの場合にも発生します。
サンプリングレートは22050~96000まではサポートしていますが、
8000~96000は一部ブラウザのみがサポートしています。

追記:このプラグインを使用した場合に限りの仕様です。
 
最後に編集:

火筒さしゃ

ユーザー
アストラル様へ、情報ありがとうございます。
プロジェクト内のoggファイル全863個を総チェックした結果
サンプリングレートが怪しいファイルを炙り出せました。
これらのレートを調整すれば問題は解決出来そうです。

しかし環境によってサンプリングレート対応状況が異なるとは…
大変勉強になりました。
 

Attachments

  • samplingrate.png
    samplingrate.png
    24.9 KB · 閲覧: 18

くらむぼん

モデレーター
スタッフ
モデレーター
くらむぼん様へ、
先日のストリーム無効のfirefoxの件では
大変お世話になりました。
しかし、また新たに問題点が発生してしまいました…

ios12.3.1の携帯端末(iPhoneSEにて確認)のsafariにて
特定のSE再生時にエラーで進行不能となる現象を確認しました。

以前と同様 NotSupportedError: Operation is not supported ですが、
ios携帯端末の為、コンソールログが確認出来ません。

前回用意した検証用プロジェクトにて
問題のSEを再生出来るテストキャラ(ハロルド)を
メインマップに配置しておりますので、確認頂く事は可能でしょうか。
https://game.nicovideo.jp/atsumaru/games/gm11060?key=b14031fd843a
なおAudioStreaming.jsは暗号化音声ファイル対応後のVerを使用しております。

現時点で分かっている事は以下の通りです。
・テストプレイ、Windowsデプロイ版は問題無くSE再生可能
・Windows7のfirefox,Chromeでは問題無くSE再生可能
・iosのsafariでは再現率100%でエラーが発生する
・OggOnly.jsに差換えてiosのsafariで試すとエラーは発生しないが無音

以上、大変お手数ですがご確認の程 宜しくお願い致します。
>NotSupportedError: Operation is not supported
前回と違う場合の可能性は、非サポートのサンプリングレートの場合にも発生します。
サンプリングレートは22050~96000まではサポートしていますが、
8000~96000は一部ブラウザのみがサポートしています。


ご報告、ありがとうございます!
アストラルさんの指摘を念頭に、火筒さしゃさんのサンプルゲームを遊ばせていただいたところ
「1」のファイルはサンプルレートが12000、「2」のファイルはサンプルレートが8000のようでした~。

さらに調べたところ、以下のこともわかりました。

・Web Audio APIの仕様書の上では、各ブラウザは少なくともサンプルレート8000~96000に対応するのが正しい
・Safariブラウザは仕様に対して手抜きしており、サンプルレート22050~96000までしか対応していないためエラーとなる
・サンプルレートの対応範囲は音声ファイルの種類によって違わない。すなわちm4aとoggで同じ範囲
・仮にプラグインを外して音声が聞こえるのなら、oggからm4aへ変換する際にたまたまサンプルレートが22050以上に上がってしまい、かつios Safariはm4aの方を使うのでエラーが発生しなかったと思われる

つまり結果的にはサンプルレートが低ければ本プラグインに関係なく音はならないみたいです~。
これはつらい><
 
すいません、このプラグインを使用した場合に限っての現象という前提で書いていました。
あくまでこのプラグインを利用した場合のサンプリングの仕様です。
(Web Audio APIの中のcreateBufferの仕様が環境によって違うため発生した現象です)

通常のコアスクリプトでは、エンコード方式が対応していれば問題ないと思います。
エンコード形式によって対応しているサンプリングレートは決まっています。

簡易的に新規プロジェクトの状態で、実機(iOS Safari12.3.1)で確認しましたが、
8000のm4aも、Apple Lossless方式(384000まで対応)のm4aで384000の場合も再生出来ました。
 
最後に編集:

くらむぼん

モデレーター
スタッフ
モデレーター
アストラル様へ、情報ありがとうございます。
プロジェクト内のoggファイル全863個を総チェックした結果
サンプリングレートが怪しいファイルを炙り出せました。
これらのレートを調整すれば問題は解決出来そうです。

しかし環境によってサンプリングレート対応状況が異なるとは…
大変勉強になりました。
すいません、このプラグインを使用した場合に限っての現象という前提で書いていました。
あくまでこのプラグインを利用した場合のサンプリングの仕様です。
(Web Audio APIの中のcreateBufferの仕様が環境によって違うため発生した現象です)

通常のコアスクリプトでは、エンコード方式が対応していれば問題ないと思います。
エンコード形式によって対応しているサンプリングレートは決まっています。

簡易的に新規プロジェクトの状態で、実機(iOS Safari12.3.1)で確認しましたが、
8000のm4aも、Apple Lossless方式(384000まで対応)のm4aで384000の場合も再生出来ました。

おおお、そうなのですか!?
では本プラグインを使った場合はサンプルレートの範囲が狭くなるというのは面白くないですね><

というわけで仕様書の保証範囲であるがSafariで鳴らせなかった8000~22050の範囲の場合、
プラグイン内で22050以上に修正するようにしてみました!

これで8000~22050の音声もSafariで聞こえるようになると思います。
もしよければAudioStreaming.jsを再入手して、お試しください~。
 

RyanBram

ユーザー
こんにちは。
今、私はあなたが作成したAudioStreaming.jsのためのエクステンションを作るように誰かに依頼しています。 私のシステム用のカスタムコーデックとあなたのプラグインのおかげでサポートが必要なので、それは起こることができます。

すべてが行き過ぎる前に、私はあなたのプラグインがYanfly Battle Engine Coreのように拡張可能かどうかを尋ねたいと思います。 もしそうなら、もちろん私は個人的なプロジェクトのための特定のコーデックを追加する方が簡単でしょう。 これがスムーズに機能するのであれば、おそらくそれ以降のMIDIサポートが私の目標になるでしょう。そして、それをオープンソースプラグインとしてコミュニティに提供し、可能であればRPGツールMV Core Scriptに統合するようお願いします。 以前のツールのようなMIDIのサポート。
 

火筒さしゃ

ユーザー
くらむぼん様へ、
検証環境を最新のAudioStreaming.jsに更新した所、
無事にエラーが発生する事無く、SEが再生出来ました。

逐一oggファイルのサンプリングレートを修正する予定でしたが
プラグイン側で対処可能とは驚きました。
改めてご対応、深く感謝致します。

…それと、大変言い辛いのですが
iosのsafariでの検証中に別件の問題点が見つかりました。

タイミングや条件は不明ですが、
BGMやSEがワンテンポずれて2重再生される場合があります。
あるSEを再生した1秒後に同じSEが再び再生されたり、
BGM再生中に数秒程度同じBGMの違うパートが再生されたり、
といった具合です。

大変お手数ですが、こちらの件も調査頂けると幸いです。
 

くらむぼん

モデレーター
スタッフ
モデレーター
こんにちは。
今、私はあなたが作成したAudioStreaming.jsのためのエクステンションを作るように誰かに依頼しています。 私のシステム用のカスタムコーデックとあなたのプラグインのおかげでサポートが必要なので、それは起こることができます。

すべてが行き過ぎる前に、私はあなたのプラグインがYanfly Battle Engine Coreのように拡張可能かどうかを尋ねたいと思います。 もしそうなら、もちろん私は個人的なプロジェクトのための特定のコーデックを追加する方が簡単でしょう。 これがスムーズに機能するのであれば、おそらくそれ以降のMIDIサポートが私の目標になるでしょう。そして、それをオープンソースプラグインとしてコミュニティに提供し、可能であればRPGツールMV Core Scriptに統合するようお願いします。 以前のツールのようなMIDIのサポート。

AudioStreaming.jsを拡張したり、改造したりすることを歓迎しています。
幸運を祈ります!
くらむぼん様へ、
検証環境を最新のAudioStreaming.jsに更新した所、
無事にエラーが発生する事無く、SEが再生出来ました。

逐一oggファイルのサンプリングレートを修正する予定でしたが
プラグイン側で対処可能とは驚きました。
改めてご対応、深く感謝致します。

…それと、大変言い辛いのですが
iosのsafariでの検証中に別件の問題点が見つかりました。

タイミングや条件は不明ですが、
BGMやSEがワンテンポずれて2重再生される場合があります。
あるSEを再生した1秒後に同じSEが再び再生されたり、
BGM再生中に数秒程度同じBGMの違うパートが再生されたり、
といった具合です。

大変お手数ですが、こちらの件も調査頂けると幸いです。

うっっ…いつ起こるか、なぜ起こるかわからないタイプのバグは調査が手詰まってしまうので辛いやつですね><
少なくともここまで頂いた情報では不具合の正体の検討もつきませんでした…

が、タイミング的にひとつ考えられるのは、8000~22050の範囲を鳴らせるようにした修正に誤りがある場合ではないでしょうか。

https://github.com/krmbn0576/rpgmak...85cfe5309842a857/js/plugins/AudioStreaming.js

こちらのURL、今回の修正がされていない(一つ前の)バージョンになります。
こちらに差し戻して不具合が直るかどうか、お試しください~。
 

RyanBram

ユーザー
こんにちは、くらむむぼんさん
AudioStreaming.jsはAndroidで動作するように意図されていますか? Cordova Debug Applicationをビルドすることによって、Androidでそのパフォーマンスを試してみると、次のエラーが発生しました。

私はPC上でAudioStreaming.jsを使用しても問題はありませんが、AndroidではAudioStreaming.jsでオーディオを再生できません。 私は他のプラグインなしでAudiStreaming.jsだけを使ってみました。
 

火筒さしゃ

ユーザー
うっっ…いつ起こるか、なぜ起こるかわからないタイプのバグは調査が手詰まってしまうので辛いやつですね><
少なくともここまで頂いた情報では不具合の正体の検討もつきませんでした…

が、タイミング的にひとつ考えられるのは、8000~22050の範囲を鳴らせるようにした修正に誤りがある場合ではないでしょうか。

https://github.com/krmbn0576/rpgmak...85cfe5309842a857/js/plugins/AudioStreaming.js

こちらのURL、今回の修正がされていない(一つ前の)バージョンになります。
こちらに差し戻して不具合が直るかどうか、お試しください~。

例の検証環境を一つ前のバージョンに差換えても、iosのsafariでの2重再生は発生し、
さらにバックアップしていたAudioStreaming.jsの初版に差換えても
同様に2重再生が発生する事を確認しました。
何かの修正ミスという訳では無く、当初から潜んでいた問題のようです。

不確定ですが一応の再現手順として、
1.適当なランダム名でメインマップまで進めてセーブ(デフォルトBGM[Town8]が流れている状態)
2.タイトル画面からセーブしたファイルをロードして放置
3.BGMが30秒に1回程度の割合で部分的に2重に聞こえる
という具合です。私の方でも引続き調査して出来るだけ情報を集めたい所です。
 

くらむぼん

モデレーター
スタッフ
モデレーター
こんにちは、くらむむぼんさん
AudioStreaming.jsはAndroidで動作するように意図されていますか? Cordova Debug Applicationをビルドすることによって、Androidでそのパフォーマンスを試してみると、次のエラーが発生しました。

私はPC上でAudioStreaming.jsを使用しても問題はありませんが、AndroidではAudioStreaming.jsでオーディオを再生できません。 私は他のプラグインなしでAudiStreaming.jsだけを使ってみました。

AudioStreaming.jsは、ブラウザ向けにデプロイしたゲームをAndroid Chromeで開いた場合は正常に動作します。
しかし、Cordova上で動作するかどうかは確認したことがありませんでした。
今、このプラグインがCordova上で動作しないのは残念だと思います。
可能であれば改良して、動作するようにしたいです。
例の検証環境を一つ前のバージョンに差換えても、iosのsafariでの2重再生は発生し、
さらにバックアップしていたAudioStreaming.jsの初版に差換えても
同様に2重再生が発生する事を確認しました。
何かの修正ミスという訳では無く、当初から潜んでいた問題のようです。

不確定ですが一応の再現手順として、
1.適当なランダム名でメインマップまで進めてセーブ(デフォルトBGM[Town8]が流れている状態)
2.タイトル画面からセーブしたファイルをロードして放置
3.BGMが30秒に1回程度の割合で部分的に2重に聞こえる
という具合です。私の方でも引続き調査して出来るだけ情報を集めたい所です。

補足ありがとうございます!
こちらでも再現手順通りにやってみて、再現するか確かめ、調査を続行したいと思います。
なにか追加の情報がありましたら、またご連絡よろしくお願いします…!
 

RyanBram

ユーザー
くらむぼんさん、どうもありがとうございました。
これは、あなたが作成してから私のプロジェクトで最も重要なプラグインの1つです。 オーディオフォーマットに関する拡張プラグインのベースとして使用したいからです。

あなたがそれを調査したい場合に備えて、私は私のAndroidビルドを添付しました。
https://drive.google.com/file/d/1VJpfg5QElMFM9QjUFdHnpZDVsQbW_L6J/view?usp=sharing
 

くらむぼん

モデレーター
スタッフ
モデレーター
くらむぼんさん、どうもありがとうございました。
これは、あなたが作成してから私のプロジェクトで最も重要なプラグインの1つです。 オーディオフォーマットに関する拡張プラグインのベースとして使用したいからです。

あなたがそれを調査したい場合に備えて、私は私のAndroidビルドを添付しました。
https://drive.google.com/file/d/1VJpfg5QElMFM9QjUFdHnpZDVsQbW_L6J/view?usp=sharing

ありがとうございます。私にはエラーメッセージが必要です。
AudioStreaming.jsの236行目を改変し、以下のような一行を追加してください。
どのようなメッセージが表示されますか?

コード:
} catch (error) {
    Graphics.printError(error, error && error.message); // <-- add this line
    if (Utils.isNwjs()) {
        // local file error
        retry = false;
    } else {
        // network error
        retry = true;
    }
}
 

くらむぼん

モデレーター
スタッフ
モデレーター
例の検証環境を一つ前のバージョンに差換えても、iosのsafariでの2重再生は発生し、
さらにバックアップしていたAudioStreaming.jsの初版に差換えても
同様に2重再生が発生する事を確認しました。
何かの修正ミスという訳では無く、当初から潜んでいた問題のようです。

不確定ですが一応の再現手順として、
1.適当なランダム名でメインマップまで進めてセーブ(デフォルトBGM[Town8]が流れている状態)
2.タイトル画面からセーブしたファイルをロードして放置
3.BGMが30秒に1回程度の割合で部分的に2重に聞こえる
という具合です。私の方でも引続き調査して出来るだけ情報を集めたい所です。

おまたせ、しました…!
こちらの件、おそらく解決できたと思います!!
原因は、またしてもSafariのバグでした。このブラウザ燃やしたい…><
(わかる人向けに解説すると、sourceNode.start(when, offset, duration)のoffsetが限りなくbuffer.durationに近いけど少し小さい時、offset = 0扱いになってしまうというとんでもないバグ)

利用者のみなさんへ:
上と別件でバグ修正があります。iOS10などの古い端末やiOSシミュレーターをご利用の際に音がならない不具合があったので修正しました。
AudioStreaming.js、stbvorbis_stream.js、stbvorbis_stream_asm.jsを再入手して、ご確認ください~。
 

RyanBram

ユーザー
こんにちは、さんくらむぼん。
私はあなたのアドバイスとしてあなたのAudioStreaming.jsを修正しましたそしてこのエラーメッセージを得ました:

ご助力ありがとうございます。
 

くらむぼん

モデレーター
スタッフ
モデレーター
こんにちは、さんくらむぼん。
私はあなたのアドバイスとしてあなたのAudioStreaming.jsを修正しましたそしてこのエラーメッセージを得ました:

ご助力ありがとうございます。

原因を発見しました。
本プラグインではストリーミング読み込みのためにfetch()を用いています。
しかし、以下のURLが示すとおり、cordovaのfile:の読み込みではfetch()が利用できないみたいです。
https://github.com/github/fetch/pull/92

そこで、cordovaではXMLHttpRequestを用いる修正を加えました。
AudioStreaming.jsを再入手してください ;->
 

RyanBram

ユーザー
こんにちは、さんくらむぼん。
更新ありがとうございます。

私はあなたの最後のAudioStreaming.jsを試しました。 Fetchに関する同様のエラーメッセージがまだ表示されます。

私の側からするべき何かがあります? 例えば:
- APK Permission の設定
- Android Manifest を編集
 
最後に編集:
トップ