West Hill 開発メモ

UnityでオーディオをAudioClipから事前に解析する場合についてのメモ。
ss_audio_01
オーディオのサンプルデータはAudioClip.GetData
引数に入れた配列にサイズ分だけ取ってこれる。
※オーディオファイルのインポート設定がDecompress on Loadになっていないと取得できず、値が0の配列になる。

全データが必要な場合はサンプル数*チャンネル数分の配列を用意する。
//
// クリップの全サンプルデータ取得
float[] allSamples = new float[clip.samples * clip.channels];
clip.GetData(allSamples, 0);
第2引数はとってくるデータ開始位置までのオフセット。
秒数でオフセットを指定したい場合は秒数*サンプルレート*チャンネル数になる。
解析する際に数秒分のデータをスキップしたい時にもこの式が使える。
//
// オフセット2秒
float offset = 2f * clip.frequency * clip.channels;
AudioClip.GetDataで取得したデータは2chの場合、
LRLRLR…の順で-1~0と0~1の範囲に収まっていて、無音だと0になる。

このデータをゴニョゴニョした後、再生中にデータとの同期を取りたい場合、
再生中のオーディオソースからAudioSource.timeSamplesで現在の再生サンプル時間を取得できるので、これを使う。

このtimeSamplesでクリップからAudioClip.GetDataで取得した配列を参照する場合は、
timeSamples*チャンネル数が当該インデックスになる。
//
// 今ここ
float sample = samples[audioSource.timeSamples * clip.channels];

このエントリーをはてなブックマークに追加 Clip to Evernote

Application.CaptureScreenshotでスクリーンショットを保存した後、
AndroidJavaClassAndroidJavaObjectを使って
MediaScannerConnection.scanFile()を呼ぶことでギャラリーに反映させます。

Unityのバージョンは4.6.0で、端末はNexus7(Android4.3)で動作確認しました。
内部ストレージの無い端末ではPlayerSettingsのWriteAccessを
External(SDCard)にする必要があります。


使い方は以下のように好きなタイミングで呼ぶだけ。
using UnityEngine;
using System.Collections;

public class Test : MonoBehaviour
{
    public void OnCaptureButtonPush ()
    {
        CaptureScreenAndroid.CaptureScreen (this);
    }
}

このエントリーをはてなブックマークに追加 Clip to Evernote

Unity4.5.3からResourcesディレクトリ配下のアセットの読込を非同期で行うResources.LoadAsync()メソッドが追加されたので試してみました。


戻り値であるResourceRequestで進捗の取得や優先度の設定が行えます。

このエントリーをはてなブックマークに追加 Clip to Evernote

このページのトップヘ