前提
- 使用フレームワークでサポートされているプラットフォームがWindowsとMacのため、AndroidとiOSでの動作はサポートされていません。
- mp4はWindowsのみの対応
FrameCapturer
Unityへのインストール方法
- https://github.com/unity3d-jp/FrameCapturer にアクセス
- Usageの
FrameCapturer.unitypackage
をダウンロードして実行
動画撮影の前準備
- 空のゲームオブジェクトを作成
- Add Component から MovieRecorder の追加
- CaptureControlをManualに設定する
- 操作をするソースに設置をしたMovieRecorderを操作できるようにする
使い方
using UTJ.FrameCapturer;
public class Sample : MonoBehaviour
{
[SerializeField]
MovieRecorder m_movieRecorder;
上記のような形でMovieRecorderを取得してる前提で記述します。
録画の開始
// 録画中かどうかの確認
if (!m_movieRecorder.isRecording)
{
// 録画開始
m_movieRecorder.BeginRecording();
}
- ファイル名についてはBeginRecording時にyyyyMMdd_HHmmssで名前が設定される。
- このファイル名の取得方法自体はフレームワークには無かった。アウトプットフォルダ名は取得できる。
録画の停止
// 録画中かどうかの確認
if (m_movieRecorder.isRecording)
{
// 録画停止
m_movieRecorder.EndRecording();
}
出力先フォルダの取得
// 出力先のフォルダを取得
string GetOutputDir()
{
return m_movieRecorder.outputDir.leaf;
}
// 出力先フォルダのフルパスの取得
string GetOutputDirFullPath()
{
return m_movieRecorder.outputDir.GetFullPath();
}
- GetFullPathはoutputDirの設定で
Absolute
とCurrent
の場合は相対パスのみ返却する設定みたいです。
録画終了した後に動画ファイルが生成完了したかの確認方法
FrameCapturer側のソースを見る限りで言えば生成完了の通知用のものが見当たらないので
updateなどでFileinfoを使ってファイルサイズが有るのかの確認することで生成完了を検知する。
var strFilePath = ""
FileInfo fileinfoData = null;
// フォルダ内データの取得
var files = Directory.GetFiles(GetOutputDirFullPath(), "*.*", SearchOption.AllDirectories).ToList();
if (files.Count > 0)
{
strFilePath = files[0];
}
// 存在チェック
if (File.Exists(strFilePath))
{
fileinfoData = new FileInfo(strFilePath);
}
// ファイルサイズの確認
if(fileinfoData != null && fileinfoData.Length > 1024)
{
// ファイル生成確認後の処理
}
- FileInfo.Lengthはbyte単位で帰ってくる。ソース上では1kbyte以上の場合に生成されたという判定にしている。
おわりに
- 2017年のフレームワークなんで若干古いですが、問題なく使用はできました。
- 生成したファイル名までのフルパスの取得の方法などあれば良いのかなとは思いました。
- iOSの場合はこちらの方の記事が参考になると思います