本記事では、この記事を書くためにオーディオプレイヤーを制作したときの技術・知見について書いていく。
技術1 VirtualPlaylist
本来
メディアプレイヤーから音楽・動画を再生するときは、「FileMediaSourceにファイルを登録してから、MediaPlaylistにまとめる」とされている。
だが、この方法では、「音楽・動画ファイルを大量に差し替えるとき、手作業で行わなければならず、非常にめんどくさい」という欠点を抱えている。
仮想的にプレイリストを作る
上図のように、Byte・Mameのマップ一個から成る構造体より生成されたデータテーブルを制作するだけで、
(列名[マップエレメント]= MediaPlaylist・Byte = 曲の順番・Name = ファイルの場所)
空の仮想プレイリストからでも、通常通りメディアプレイヤーから音楽・動画を再生出来るのである。
この方法では、「音楽・動画ファイルを大量に差し替えるとき、Jsonを編集するだけ」となり、誰でも編集可能でめんどくさくもない。
使用方法
MediaPlaylistの名前が必要な場合
MediaPlaylistを呼び出す場合
仮想プレイリストの中身を全てクリアしてから、
データテーブルから仮想プレイリストに追加する。
MediaPlaylist内にあるMediaの名前が必要な場合
余計な文字(_XXX)が付いてくるが、それを外せば、メディア本来の名前が得られる。
技術2 プレイヤーに直接サウンドを届ける方法
不正解 : Pawn・CharacterにMediaPlayer(音源)を設置する
この方法だと、空間上に音源が配置されてしまうので、減衰などの設定を全てオフにしていても、定位がハッキリしなくなる。
正解 : PlayerControllerにMediaPlayer(音源)を設置する
この方法だと、空間上に音源が配置される事も無いので、音源からプレイヤーに直接サウンドが伝わり、ハッキリとした定位となる。
Tips1 音声再生における、MediaPlayerの操作の制限
Loop
使用できそうだと思うものの、実際は使用できない。
もしも機能を再現しようとするのなら、以下の方法になるだろう。goto的なアプローチではある
- ある曲を再生中、ボタンを押したら、フラグが立つようにしておく。
- その曲が終わった時に、フラグが立っているのなら、再度その曲を最初から再生する。
Pause(NativeAudioOut Only)
Directmodeにおいては、Pauseが使用できない
もしも機能を再現しようとするのなら、以下の方法になるだろう。
- Reopenなら使用できるので、ボタンを押したら、フラグが立つようにして、再生時間も記憶しておく。
- 再生するとき、フラグが立っているのなら、記憶していた再生時間から再生を始める。
しかし、「GetNativeAudioOut」が実質動作しておらず、NativeAudioOutかどうかを判別出来ない。
そのため、NativeAudioOutが可変する条件においては、切り分けられないために、上記の方法は使えない。
現状では、NativeAudioOut時におけるPauseの使用はあきらめるしかないだろう。
Tips2 Widgetの分割について
このウィジェットの3/4は、
このようなパーツから構成されている
Blueprintの実装
本体
- 本体上に配置されているパーツのリファレンスを配列にまとめておく。
- パーツごとに(配列の順に)インデックスを設定。
- このパーツが扱うフィルターのリファレンスを設定。
- パーツの(ボーダー)色を設定する。(エディタ上では設定不能)
パーツ側
- 上部の(赤色の)スイッチが押されたとき
- このパーツに関連付けられた(インデックスから分かる)フィルターのPass設定(有効/無効)が切り替わる。
- コンボボックス・スライダーが操作されたとき
- このパーツが扱うフィルターの設定が変更される。
どれだけの規模になったら、分割を考えるべきか
このように、パーツ化されたウィジェットを扱うには、結構手間がかかるので、やみくもに分割して再利用する方が良いと言うわけでもない。
同じような(機能を共通化できる)パーツが、3箇所以上になった時に考えれば良いだろう。
Tips3 BitCrasherについて
設定変更時の留意点
BitCrasherの設定には、以下の二つのパラメーターが存在する。
- Crashed Sample Rate
- Crashed Bits
「Crashed Bits」の値だけを変更した時は、変更が適用されているが、「Crashed Sample Rate」の値だけを変更したときは、変更が適用されていない。
確実にパラメーターの変更を適用させるには、片方の値だけを変更する時でも、両方の値だけを変更する必要がある。
BitCrasherの限界
Crashed Bits : 0~30
「Crashed Bits」の値を32(Bit)としたとき、高音質となるばかりか、逆にノイズが発生してしまった。
32(Bit)から1づつ引いて行って、ノイズが出なくなる値を検証していった結果、30(Bit)にてノイズの発生が収まることが判明した。
ちなみに、0(Bit)でも、何故か再生が可能である。もちろんノイズはひどい
Crashed Sample Rate : 恐らく無限大
前の記事でも書いたが、UnrealEngine4のサウンド周波数の限界は、192000Hzとなっている。
しかし、「Crashed Sample Rate」に384000(HZ)を設定しても、エディターは落ちることなく動作するのである。
おそらく(性能が許す限り)、どんなに高い周波数を設定したとしても、エディターは落ちることは無いだろう。
BitCrasherはReSamplerに改名するべきである
Tips4 Fontについて
フォントのサイズは意外と大きい
今回制作したオーディオプレイヤーの総サイズは7.2MBである。
しかし、たった2個のフォントファイルだけで、1.85MB*2=3.7MB、およそ半分を占めているのだ。
容量が大きいコンソールならまだしも、モバイル・WEBなどでは出来るだけサイズは小さくしたい。
対処法としては、フォントを使いまわすなどして、出来るだけ使用するフォントは絞るほうがいい。