スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --年--月--日 --:--:-- : スポンサー広告 ]

【Unity】 WAVファイルからAudioClipを自前で生成するサンプルを作ってみた

AudioClipは自前で作る方法もあるというサンプル。

https://github.com/Suzeep/audioclip_maker






SceneMainオブジェクトのWav File Nameで指定されたWAVファイル(Soundsフォルダ内のもの)を
Readボタンでロード&AudioClipに変換し作成、
Playボタンでそれを再生

というもの。

サンプルのBGMはこちらより拝借させていただきました。
MP3(WAV)素材 - フリー音楽素材 Futta Music


やっていることは単純で、プロジェクト内のWAVファイルをファイルとしてロードして、
ヘッダを解析して必要な情報を取得し、AudipClip用のデータにコンバートしてセット→再生。


普段Unityで音楽ファイルを扱う時は、プロジェクトにインポートしただけで
内部でAudioClipとして変換され、アセットとして使用出来るようになっている。

そしてAudioSourceにそのクリップをアタッチするだけで
AudioSourceを通して簡単に再生出来る。


そんなAudioClipに実はCreateというメソッドが用意されている。

http://docs.unity3d.com/Documentation/ScriptReference/AudioClip.Create.html


これが何の役に立つのかは言ってしまうとアレなんだけど、
アレをアレしたい場合に必ず通る道である。


リニアPCMの解析についてはココ等を参考にした。

正直そんなにややこしいことは無くて、

・フォーマットチャンクのサイズ
・dataチャンクを見つける


この2点さえ抑えておけば、ほぼほぼイレギュラー(?)なヘッダでもきちんと解析出来る・・・はず。


サンプルではFLLRチャンク、JUNKチャンクのイレギュラー処理を入れているが、
ぶっちゃけフォーマットチャンクの解析が終わった後は、dataチャンクを見つけるまで
再帰で問題ない
ので、まぁこんな対応をしてますよという事であえて入れておいた。


面倒なのは、バイトデータを0.0〜1.0の浮動少数に置き換える所だろう。
ここも仕様さえ分かってしまえば大したことは無い。

・8bitならば符号無しunsigned (0 ~ 255, 無音は 128)
・16bit ならば符号付き signed (-32768 ~ +32767, 無音は 0)


1サンプルのビット数が8か16かで単位が変わるだけだ。

AudioClip.GetDataメソッドで波形データが取得出来るので、
実際のバイナリの値とそれを比較して、どう値を変換するのかを初めて知ったが...
最初は固定少数かと思ってたけど違って、ただ単位が固定されてるだけだった。)


後は変換したデータをAudioClip.SetDataでセットしてやるだけ。

まさか自前でも作る事が出来るなんて思いもしなかったが、流石はUnityというところか。


ただし、このサンプルの処理はかなり処理負荷が高いので
もし実用するとなると非同期化したものを用意することになるだろう。

自分は非同期化したラッパを作っているが、
スレッドに任せればさほど時間も掛からなかった。

ただ、長い曲はメモリを食うので、そこは気をつけなければならない。

1度に全てのバッファを確保出来る余裕があればいいだろうが、
無い場合はステップを分けてバッファを節約しながら変換する必要があるだろう。


何にせよ、非同期化にはスレッドは必須である。

[ 2013年11月04日 16:49:49 : Unity ]

カレンダー

プルダウン 降順 昇順 年別

11月 | 2018年12月 | 01月
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -


全記事表示リンク

全ての記事を表示する

検索フォーム

リンク

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。