Skip to content

FiaDot/FrameCapturer

Repository files navigation

FrameCapturer

English (by Google Translate)

フレームバッファの内容をキャプチャして画像や動画に出力する Unity 用のプラグインです。gif, mp4, exr, png への出力に対応しています。動作環境は Unity 5.2 以上で、OpenGL, D3D9, D3D11 環境下で動作します。現状 Windows 専用です (32bit, 64bit 両対応)。ソースレベルでは Mac や Linux でもビルドできて動くはずですが、未確認です。

使用するにはまずこのパッケージをプロジェクトにインポートしてください: FrameCapturer.unitypackage
以下は各コンポーネントの説明になります。

その他、履歴や補足情報など。


Gif Recorder

ゲーム画面をキャプチャしてアニメ gif としてエクスポートします。 常時録画して後で面白いカットを切り出してファイルに出力する、というような使い方を想定しています。
以下のような機能を備えています。

  • 直近 N フレームをメモリに残し、後で指定部分だけをファイルに出力 (=ShadowPlay や PS4 と似た録画方法)
  • 非同期&並列エンコーディング (メインスレッドをブロックしない)
  • 簡単な in-game プレビューア&エディタ
  • 録画結果をゲーム内から直接 Twitter へ投稿可能

録画解像度はかなり小さめ (横 300 pixel 程度) を推奨しています。 gif のエンコードはとても遅い上、解像度に比例してすごい勢いで負荷が上がっていくため、等倍解像度の録画をリアルタイムで行うのは絶望的です。(後述の mp4 の録画よりも数倍遅いです)

以下の動画を見ると何ができるのか大体わかると思います。
FrameCapturer: GifRecorder
以下はこのプラグインで出力されたアニメ gif の例です。
gif_example1

使い方

  1. 録画したいカメラに GifRecorder コンポーネントを追加
  2. uGUI オブジェクト MovieRecorderUI.prefab をどこかに配置し、それの recorder に 1 で追加したコンポーネントを設定

2 は必須ではありませんが、GifRecorder には録画の on/off 切り替えやファイルへの書き出しなどをコントロールするための GUI やスクリプトが必要になります。 MovieRecorderUI.prefab は機能はともかく見た目は必要最小限のため、これを使う場合も独自に改良した方がいいでしょう。

以下はコンポーネントの各パラメータの解説です。 - Output Dir ファイルの出力先ディレクトリです。Root が PersistentDataPath だと Application.persistentDataPath 基準になります。 - Num Colors gif の色数です。最大 256 で、少なくするほど画質が悪くなる代わりに容量が小さくなります。 - Frame Rate Mode Constant だとフレームレートを一定に保ちます。Variable だとゲーム内のデルタ時間が録画結果にも反映されます。 これは処理落ちなどでフレームレートが低下したときの挙動に影響します。Variable だと処理落ちに応じて gif もコマ落ちすることになり、結果ゲーム時間と再生時間は同期します。Constant だと gif 側のフレームレートは一定に保たれるため、結果処理落ちすると gif の再生時間はゲームよりも速くなります。 - Framerate Frame Rate Mode が Constant の時、gif のフレームレートはこの数値に保たれます。Variable の時は無視されます。 - Capture Every Nth Frame 1 だと全フレーム録画、2 だと 2 フレームに一回録画します。60 FPS のゲームで 30 FPS の録画を行いたい時 2 に設定します。 - Keyframe パレットを更新する間隔です。基本的には、小さくすると画質が良くなる代わりに容量が増えます。 gif はインデックスカラーの画像データですが、アニメ gif ではパレットを複数フレームの間使い回すことができます。長期間使い回せばデータ量は減らせるものの、画面全体の色の傾向が変化していく場合画質がひどく劣化することになります。 Keyframe はこのパレット使い回しをコントロールするもので、Keyframe フレーム数が経過するたびにパレットを更新します。

RenderTexture の録画を行う GifOffscreenRecorder というのも用意されています。Target にRenderTexture を指定する以外は使い方は GifRecorder と同じです。

録画した gif をゲーム内から直接 Twitter へ投稿することもできます。 Twitter 投稿機能は、TweetMedia によって実現されており、詳しくはそちらをご参照ください。
TweetScreenshot.prefab はこちらのパッケージにしかない prefab で、録画した gif を添付する機能が追加された Tweet 用 GUI になっています。

注意すべき点として、Gif はフレーム間のデルタ時間は単位がセンチ秒 (10ms) になっています。このため再生のフレームレートは 100FPS, 50FPS, 33FPS, 25FPS... となってしまい、60FPS を正確に表現することができなくなっています。(実際のところ大抵のソフトウェアは 100FPS ではなく 60FPS だったり 30FPS だったりで再生するようですが)

MP4 Recorder

ゲーム画面をキャプチャして mp4 動画で出力します。

使用手順は大体 GifRecorder と同じで、録画したいカメラに MP4Recorder を追加し、GUI を配置して recorder を設定するだけです。RenderTexture を録画する MP4OffscreenRecorder が用意されているのも同様です。
GUI は MovieRecorderUI.prefab の使用を前提としています。 一応 GifRecorder と同じ GUI を使えるようになっているのですが、現状 MP4Recorder はシークや編集に対応していないため、MovieRecorderEditorUI.prefab を使ってもほとんどのボタンは機能しません。

以下はコンポーネントの各パラメータの解説です。 - Capture Video - Capture Audio ビデオやオーディオのキャプチャのオンオフを指定します。mp4 の場合オーディオのみの出力も可能です。 - Frame Rate Mode - Framerate - Capture Every Nth Frame これらは Gif Recorder での説明がそのまま当てはまりますが、mp4 の場合重要な注意事項があります。**録音もする場合、Frame Rate Mode は Variable にすべき** ということです。 Constant だとだんだん音と映像がズレていきます。これは Constant だとゲーム時間と再生時間の同期を諦めてフレームレートを一定に保つためです。 - Video Bitrate - Audio Bitrate ビットレート指定です。画質や音質を決定するパラメータになります。 デフォルトの 1024000 だと大体 128KB/sec をビデオに割り当てます。

注意すべき点として、動画エンコーダ (OpenH264) はパッケージには含んでおらず、実行時にダウンロードして展開するようになっています。 ダウンロード&展開は Output Dir に自動的に行われ、通常すぐ終わるはずです。しかし、ダウンロードが終わっていない時や何らかの事情で失敗した場合など、録画できないケースがありうるということは気に留めておいた方がいいと思われます。
パッケージに含めていないのにはライセンス的な理由があります。 MP4 の使用には通常ライセンス料が課せられる可能性が生じます。しかし、OpenH264 は特定の条件を満たしていればこのライセンス料を免除できるようになっています。その条件は以下のようなものです。

  1. OpenH264 のバイナリはソフトウェア本体とは別にダウンロードするようになっている
  2. ユーザーは OpenH264 を使用するか否かをコントロールできるようになっている
  3. OpenH264 の使用をコントロールする場所に次の一文を明記してある: "OpenH264 Video Codec provided by Cisco Systems, Inc."
  4. これらの条件のライセンスの条文 ( http://www.openh264.org/BINARY_LICENSE.txt 下部) が参照可能になっている

(より正確には原文の方を参照ください: http://www.openh264.org/faq.html)
OpenH264 を使ったゲームをリリースしたい場合も、上記条件を満たさないとライセンス料を課せられる可能性が生じるため、このような仕様にしています。

Exr Recorder

Exr は主に映像業界で使われる画像フォーマットで、float や half のピクセルデータで構成された画像、いわゆる HDR 画像を保持できます。
GifRecorder や MP4Recorder と違い、ExrRecorder および PngRecorder は映像制作用途を想定したものになっています。 具体的には、G-Buffer やマテリアル ID などを書き出し、コンポジットに使う、といった使い方です。
Exr のエクスポートは非常に遅く、リアルタイムで行うのは困難であるため、デルタタイムを固定して事前に指定しておいた範囲のフレームを書き出す、という使い方を前提としています。 パッケージにはデルタタイムを固定する簡単なスクリプトが付属しています。(UTJ / Misc / FixDeltaTime)

###### G-Buffer & フレームバッファのキャプチャ (ExrRecorder) 1. 録画したいカメラに ExrRecorder コンポーネントを追加 2. キャプチャしたい要素 (G-Buffer, FrameBuffer)、キャプチャ開始 / 終了フレームを設定 3. Play

プレイ開始後、指定フレームの範囲に来ると自動的に指定ディレクトリへエクスポートします。 ファイル構成やレイヤー名は現状決め打ちになっています。 変更したい場合、ExrRecorder.cs の DoExport() 内のエクスポート部分を書き換えることで対応可能です。

###### RenderTexture のキャプチャ (ExrOffscreenRecorder) RenderTexture の内容をキャプチャするバージョンです。 1. 録画したいカメラに ExrOffscreenCapturer コンポーネントを追加 2. キャプチャしたい RenderTexture を Targets に設定 3. キャプチャ開始 / 終了フレームなどを設定 4. Play

大体 ExrRecorder と同じで、Targets に指定した RenderTexture の内容が .exr に書き出されるようになっています。 Target は複数指定可能です。

出力例:
exr_example1

Png Recorder

ゲーム画面を連番 PNG でキャプチャします。
EXR と同様、こちらも想定している用途は映像のコンポジットです。 使い方も ExrRecorder, ExrOffscreenRecorder と全く同じで、指定したフレーム間の G-Buffer やフレームバッファの各要素を連番 png で書き出せるようになっています。

png は 16 bit 整数カラーをサポートしており、half や float の RenderTexture は 16 bit モードで書き出します。 16 bit 整数カラーの場合、0.0 - 1.0 -> 0 - 255 の変換ルールはそのまま、1.0 より大きな色が 256 以上になる、という挙動になります。 つまり 0.0 - 1.0 の範囲しか扱わない場合、出力される情報量は 8 bit カラーと同等になります。ご注意ください。
以上のことからコンポジット用途としては exr の方が望ましいのですが、exr はインポート/エクスポートが遅く、png で精度が足りる場合はそちらが使われるケースもあるそうで、PngRecorder も用意されています。

PngRecorder PngOffscreenRecorder

C++ Interface

本プラグインは、画面のキャプチャから各種ファイルへのエクスポートはネイティブコードの DLL として実装されています。この DLL は Unity への依存はなく、非 Unity のアプリケーションへも容易に組み込めるようになっています。使い方は テストコードFrameCapturer.h を読むと大体わかると思います。
ソースからビルドすればスタティックリンクライブラリを作ることもできます。ビルドの手順は、このリポジトリを pull して setup.bat を実行した後、Plugin/FrameCapturer.sln をビルドするだけです。MasterLib がスタティックリンクライブラリをビルドする設定になっています。

History

  • 2016/03/10
    • MP4 Recorder
    • PNG Recorder
    • GL Core モードをサポート
    • これまで未対応だったファイルフォーマットとカラーフォーマットの組み合わせをサポート
      • ファイルフォーマットがサポートしていないカラーフォーマットも変換を挟むことでエクスポートできるようにした
      • gif や mp4 の場合 16/32bit カラーは 8bit カラーに変換してエンコード、exr の場合 8bit カラーは 16bit カラーに変換してエクスポート、など
    • C++ インターフェースの整備
  • 2016/01/07
    • MP4 Recorder (beta)
  • 2015/06/10
    • Twitter 投稿機能
  • 2015/06/05
    • Exr Recorder
  • 2015/06/01
    • Gif Recorder

Todo

  • MP4: 使える環境ではハードウェアエンコーダを使う
    • GeForce の 600 系以降などを使用時にエンコードの大幅な高速化が見込める
  • MP4: RTMP ストリーミング対応
    • Twitch など各種配信サイトへの対応

Thanks

License

MIT License:

Copyright (C) 2015-2016 Unity Technologies Japan, G.K.

Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

About

gif, mp4, exr, png recorder plugin / library

Resources

Stars

Watchers

Forks

Packages

No packages published

Languages

  • C# 43.9%
  • GLSL 32.2%
  • C++ 23.9%