【Unity】キャプチャーボードを利用して映像と音声をキャプチャーする方法を紹介します!
Unityからキャプチャーボードを利用して映像と音声をキャプチャーする方法をまとめます。今回利用するキャプチャーボードはMiraBoxで、任天堂スイッチの映像と音声をキャプチャーしたいと思います。
映像キャプチャー
Unityで映像デバイスから映像をキャプチャーするにはWebCamTextureクラスを利用します。クラス名からウェブカメラ専用のクラスに見えますが、一般的な映像デバイスにも利用できます。
最初に利用可能な映像デバイス名を調べます。
foreach(var device in WebCamTexture.devices)
{
Debug.Log(device.name);
}
結果は以下の通りです。
上から2番目のMiraBox Video Captureデバイスを利用します。
続いてWebCamTextureを作成します。コンストラクタにはデバイス名、解像度とFPSを指定します。任天堂スイッチはフルHD解像度(1920x1080)で60FPSで動作するのでコンストラクタの引数は以下のようになります。
string videoDeviceName = WebCamTexture.devices[1].name;
WebCamTexture webCamTexture = new WebCamTexture(videoDeviceName, 1920, 1080, 60);
WebCamTexture.Playメソッドでキャプチャーを開始します。
webCamTexture.Play();
最後にWebCamTextureをスクリーンに描画します。処理を簡単にするためにOnGUIをオーバーライドしてGUI.DrawTextureメソッドで描画します。
void OnGUI()
{
GUI.DrawTexture(new Rect(0, 0, 1920, 1080), webCamTexture);
}
音声キャプチャー
Unityで音声デバイスから音声をキャプチャーするにはMicrophoneクラスを利用します。クラス名からマイク専用のクラスに見えますが、一般的なオーディオデバイスにも利用できます。
最初に利用可能な音声デバイスを調べます。
foreach (var device in Microphone.devices)
{
Debug.Log(device);
}
結果は以下の通りです。
上から4番目のデジタル オーディオ インターフェース(MiraBox Video Capture)を利用します。
続いてMicrophone.GetDeviceCapsで利用可能な帯域の最小周波数と最大周波数を調べます。
string audioDeviceName = Microphone.devices[3];
int minFreq, maxFreq;
Microphone.GetDeviceCaps(audioDeviceName, out minFreq, out maxFreq);
Debug.Log("MinFreq:" + minFreq + ", MaxFreq:" + maxFreq);
周波数は48000を利用します。
Microphone.Startでオーディオクリップに音声の録音を開始します。引数はデバイス名、ループ録音をするかどうか、録音するオーディオクリップの長さ、録音する周波数になります。
Microphone.Start(audioDeviceName, true, 1, 48000)
音声を再生するためにAudioSourceをゲームオブジェクトに追加します。Microphone.Startで作成したクリップを設定してループ再生をオンにします。最後にAudioSouce.Playを呼び出して音声を再生します。
AudioSource audioSource = gameObject.AddComponent<AudioSource>();
audioSource.clip = Microphone.Start(audioDeviceName, true, 1, 48000);
audioSource.loop = true;
audioSource.Play();
スクリプトの実装
映像キャプチャーと音声キャプチャーで説明したことを踏まえてスクリプトを実装します。
using UnityEngine;
public class CaptureboardTest : MonoBehaviour
{
WebCamTexture webCamTexture;
void Start()
{
string videoDeviceName = WebCamTexture.devices[1].name;
webCamTexture = new WebCamTexture(videoDeviceName, 1920, 1080, 60);
webCamTexture.Play();
string audioDeviceName = Microphone.devices[3];
AudioSource audioSource = gameObject.AddComponent<AudioSource>();
audioSource.clip = Microphone.Start(audioDeviceName, true, 1, 48000);
audioSource.loop = true;
audioSource.Play();
}
void OnGUI()
{
GUI.DrawTexture(new Rect(0, 0, 1920, 1080), webCamTexture);
}
}
シーンの構成と実行
ヒエラルキーにゲームオブジェクトを作成してインスペクターからスクリプトを追加します。
実行して確認します。
映像は遅延なく60FPSで動くのでゲームビューを見ながら操作しても快適にプレイできます。音声は0.5秒くらい遅延があり違和感が少しありました。音声の遅延に関して良い解決方法があれば更新したいと思います。
キャプチャーボードの映像と音声をキャプチャーする方法を紹介しました。
キャプチャーデバイスを利用したコンテンツの開発などに使えそうですね。
関連ページ
こちらのページも合わせてご覧下さい。