るっちょ らいつ

るっちょ ぷれぜんつ 開発の日々。

AviUtlとffmpegでDVD-Videoの奇怪な仕様に挑む

とある事情で、とある映像作品の編集とDVD出力を任されました。

編集に使用しているのはAviUtl。

 

今回はAviUtlからできるだけ画質と時間をセーブしてDVD出力するためにいろいろ試した記録をつづります。

 

市販のDVDプレイヤーで再生できるようにするという制約があるので、DVD-Video仕様で出力します。このDVD-Videoというのがどんな仕様なのかというとWikipediaを見れば大体わかります。

 

映像フォーマット:MPEG2

画面サイズ:720x480 (NTSC)

アスペクト比:4:3または16:9

 

あまり古い時代の映像事情に詳しくない私はここで引っ掛かります。

「なんで画面サイズは720x480で4:3として策定されているのにアスペクト比が16:9も選べるんだ?」と。単純にレターボックスをつけるだけでいいのなら4:3だけで決めちゃえばいいじゃないか。

実は16:9の場合でも720x480の画面はフルで使い、アスペクト比情報を別に書き込んでおくことで、再生機器側で横に引き延ばしするんだそうです。なんという……

 

しかしここで問題が発生します。

AviUtl側では1920x816のシネスコサイズで編集しているという点です。

つまり、MPEG2のファイルとしては720x480で出力し、DVD書き出しの際は16:9として記録しつつ、シネスコサイズ対応用のレターボックスをあらかじめつけるというあまりにもあまりな手段を取らざるを得ないわけです。

そこで、これだけ柔軟な出力をするために、ffmpegを活用することにしました。

 

AviUtlからのffmpegを通じた出力にはffmpegOutというAviUtlプラグインを利用させてもらいます。mp4出力のx264guiExで有名なrigayaさんの公開されているソフトウェアです。

 

出力設定はこんな感じです。

f:id:ruccho:20180810221009p:plain

 

出力コマンドです。

 

-target ntsc-dvd -vcodec mpeg2video -vf "scale=720x363,pad=720:480:0:58" -r 29.97

 

キモは-vfオプション欄です。-vfはffmpegにおいて映像にフィルタをかけるための引数で、ここでサイズ変換等を行います。様々なフィルタをカンマで区切って入力すると順番に実行されていきます。

①scale

名の通り、単純に入力映像を指定サイズにスケールします。アスペクト比が変わればストレッチも入ります。ここでは入力映像の1920x816から720x363にリサイズしています。前述のDVD-Video仕様で、16:9として記録して、再生機器側で横引き延ばしされた場合にアスペクト比が1920:816になるよう計算した値が363です。小数点以下は適当に丸めましたが。

②crop

レターボックスを追加するために使用しています。"720:480"は最終的な映像サイズ、あとの"0:58"は左右に0px、上下に58pxずつ黒帯を追加するという意味です。

 

あとのオーサリングにはDVDStylerを使用しました。適切な形式にエンコードされていれば無変換でDVDに書き込めるので、多重にエンコードすることを避けることができます。

Webでうごく超軽量Unityランタイム、Tiny Editorを試してみる

GDCに続き、Unite Tokyoでも紹介された「Tiny Editor」。コアランタイムのサイズ72KBという衝撃的な数字に目を引かれた方も多いと思います。

blogs.unity3d.com

多くの方がご存知の通り、UnityのWebGLは重いのが難点です。特にスマホではまともに動作しないことが多い。しかし今回発表されたこの技術では(コンテンツにもよるとは思いますが)スマホでも軽快に動作するうえ、ロードも爆速です。ビルドして出力するファイルを単一のHTMLに収めることも可能なようです。

 

インストールしてみる

github.com

Tiny EditorはPackage Manager経由で入手できます。Unityのバージョンは2018.1以上でOKなようです。

プロジェクトを作成したら、まずPlayer SettingsからRuntime Versionを.NET 4.xに変えておきます。

次に実際にPackageを入れてきます。プロジェクトディレクトリ中の「Packages/manifest.json」を以下の様に書き換えます。

 

{
  "dependencies": {
  },
  "registry": "https://staging-packages.unity.com"
}

 

次に、上記のリポジトリをcloneなりDownload Zipするなりして、「com.unity.tiny.editor」をPackages下に配置します。

ここまで設定すれば、Unityでプロジェクトを開くとPackageがインストールされると思います。メニューバーに「Tiny」の項目があればOKです。

サンプルをみてみる

先ほどダウンロードしたリポジトリの中のAssets以下にサンプルが入ってます。これの中の好きなものをコピーします。

メニューバー「Tiny」>「Layouts」>「Tiny Mode」にすると画面がTiny Editor仕様になります。

f:id:ruccho:20180609185812p:plain

Tiny EditorウィンドウからImport Projectします。

サンプルプロジェクトは「.utproject」「.utmodule」ファイルを読み込むことできるようです。

読み込めたら、Tiny Editor右上の「Export」を押すとビルドされ、サーバーが立ってブラウザから開けるようになります。

http://localhost:9050/ を開くと動かせます。早すぎてUnity製であることを忘れてしまう。

Dice Roller

複数のさいころを回すサンプル。

f:id:ruccho:20180609190100p:plain

 

Dragon Match

よくある感じのパズルゲーム。

f:id:ruccho:20180609190412p:plain

 

Slot Machine

その名の通り。

f:id:ruccho:20180609190741p:plain

 

所感

プレイアブル広告が用途の例として挙がっていたように、相当できることは限られそう。現状テストプレイするにもいちいちJavascriptへの変換が入るし、すぐ作ってすぐ試せるというUnityの良さを犠牲にした結果の軽さともいえるかもしれない。WebGLの代替になるのかはわからない。ただまだプレビューだし、この速さが活かせるところはいろいろありそう。

Tiny Editorをちょっと覗いてみたけど、ECSを前提としたエディタの設計だったり、JSを直接書いてAssetsにつっこんでたりしている。今までのUnityとかなり勝手は違いそうだし、奥が深そうなので、もっと弄ってみる。

Unity公式の機械学習ライブラリが公開されたので試す

概要

blogs.unity3d.com

Unity上で機械学習ができるライブラリが公式より発表されたみたいです。

記事を読んでみると、

・多くの自律エージェントが互いに作用する世界でのエージェントのふるまいをシミュレーションできる(漠然としてるけど行動学とかそのへんかしら)

・車の自動運転技術など産業用アプリケーションに関する研究を物理の効いたUnityの世界で実行できる

・自律的な思考を持つAIプレイヤーをゲームに導入できる

みたいなことが書いてあります。以前からUnityはゲーム以外の学術方面での利用も推し進めてるようですが、やっぱり気になるのは開発するゲームに訓練されたAIプレイヤーを導入できることでしょうか。

ゲームでの機械学習というと、DeepMindのDeep Q-Networkなんかが有名ですが、このライブラリでもDQNが利用できるみたいです。

 


Unity Machine Learning - Reinforcement Learning Demo

 

実際に試す

GitHubに必要なファイルがあるので、CloneするなりDownload Zipするなりします。

まだベータ版ですので扱いにはお気を付けください。

Unityは2017.1以上のバージョンが必要です。

 

Unity Editorでml-agent/unity-environmentを開いて、Assets/ML-Agents/Examples/3DBall内のSceneを読み込みましょう。これはあらかじめ用意されたサンプルシーンです。

 

f:id:ruccho:20170922200023j:plain

 

こんな感じのシーンが読み込まれます。

 

HierarchyからBall3DAcademy > Ball3DBrainのInspectorを開き、Type Of BrainをExternalにセットしてください。学習を有効にするために必要な設定です。

 

実際に学習を行うにはビルドする必要があります。

 

どういうことかというと、学習機能自体はこのプロジェクトには含まれておらず、ビルドしたのち外部ライブラリであるTensorFlowによって行われるようです。

 

f:id:ruccho:20170922200844p:plain

 

 ビルドする前にPlayer SettingsからRun in Backgroundにチェックを入れ、Display Resolution Dialogのチェックを外しておきます。

ビルドはダウンロードしたルートフォルダの中のpythonフォルダに保存します。

 

ではビルドも済みましたし実際に学習……と行きたいところですが、そのまえにpythonの学習環境を整える必要があります。

 

Pythonの設定

まずはPythonをインストールします。ドキュメンテーションにはPython2.7でもPython3でもいけるとありますがTensorflowはWindowsではPython3系でしか動かないようなのでこちらをインストールします。(Macでは2.7系でもうごくっぽいですが未検証)

Python Release Python 3.6.2 | Python.org

インストールが済んだらコマンドプロンプトからpython --versionを入れてPython3系がインストールされてることを確認しましょう。

 

では設定に移ります。先ほどビルドを展開したpythonフォルダに移動し、

pip3 install .

を入力すると自動で必要なパッケージ類をインストールしてくれます。

 

学習

インストールが済んだらいよいよ学習を始めていきます。

pythonフォルダーで jupyter notebook を入力してjupyterを立ち上げます。

ブラウザから localhost:8888 にアクセスし、 PPO.ipynb を開いて Hyparameters セクションの env_name にビルドしたバイナリの名前(拡張子抜き)をセットします。

また、デフォルトでは訓練を 5e5(50万)回行う設定になってますが、筆者のPCは貧弱なのでこれを減らしておきます。

Hyparameters セクションの max_steps を5e4に変更します。

 

一番トップのコードのセクションにフォーカス(青カーソルが出る)を合わせ、 Run をカチカチと押してすべてのコードを実行していきますと、ビルドした実行ファイルが立ち上がり、学習が始まっていきます。

 

しばらく放置すると Train the Agents セクションに学習してるログが吐かれます。

 

Mean Reward: 9.350500454959013
Mean Reward: 76.65897435897344
Mean Reward: 88.24444444444323
Mean Reward: 56.52788461538383
Mean Reward: 54.5907834101375
Saved Model

 

こんな感じで続いていき、学習が終了するとビルドしたアプリケーションが終了します。

python/models/ppo/<バイナリ名>.bytes

があることを確認してください。これが学習データです。こいつをExamples\3DBall\TFModelsに移動しておきます。

 

学習した結果を確認する

こんな感じで学習が終了したので、こんどはこれをUnity Editorに読み込んで結果を確認してみます。

もう一度さっきのプロジェクトを開きます。

まず、TensorFlowSharpのunitypackage をプロジェクトに追加します。

Player Settings で Other Settings から、

1) Scripting Runtime Version を Experimental (.NET 4.6 Equivalent) にセット

2) Scripting Defined Symbols に ENABLE_TENSORFLOW を追加

したのち、一度Editorを再起動します。

 

3DBall のSceneを読み込んで、最初に設定したBall3DBrainのInspectorを開きます。

Type Of BrainをInternalにセットし、Graph Modelに先ほど移動したbytesファイルをセットします。

Graph PlaceholdersのSizeを1にセットし、

Name : epsilon

Value Type : Floating Point

Min Value : 0

Max Value : 0

に設定します。

 

ではいよいよPlayしてみましょう。板がボールを落とさぬよう勝手に傾きを調整しています。

 

感想

 とりあえずWikiのまんまに一通り試してみましたが、数多ある機械学習ライブラリとそのサンプルの中では圧倒的に手軽にすごいことが試せますね。(どこでもMNISTしかやらないから)

 

これがUnityという強力なプラットフォームで実現可能になった効果は大きいと思います。カスタムのプロジェクトでのML-Agentsの導入方法についてもWikiにあるのでまだまだいろいろなことが試せそうで夢がひろがりんぐしてます

 

 

Unity1週間ゲームジャム「夏」に参加した日記

 

1週間ゲームジャムとは、Unity製ゲームの投稿サイトunityroomが月イチで開催してるイベントで、月曜に発表されたお題に沿ったゲームを日曜までに制作し、投稿するものです。

 

第一回のお題「跳ねる」に始まり、第二回「転がる」、第三回「積む」、ときて今回第四回で発表されたテーマは「」でした。

 

んー夏か…夏に絡めたゲームアイデア…ん…?なんかこれデジャヴ…

 

そうでした。去年のUnityインターハイのテーマも「夏」だったのでした。(結局テーマこじつけになっちゃいましたが)

 

これまでの1週間ゲームジャムも参加はしたかったのですか時間が捻出できなかったり、アイデアがまとまらなかったりで指をくわえてみざるを得なかったのです。今回は時間があったのでとりあえず完成を目標に…

そんでもって月曜からあれこれ考えて…

夏らしい要素を主軸においてアイデアを出そうとするのはなかなか難しく、かといってとってつけたような夏要素にするのは心苦しかったのでだいぶ悩みました。

なんか最初はスイカを割らないように衝撃を避けながら運送するゲームみたいなのを考えてましたが夏である必然性が薄い。

既存の確立したゲーム性からいかに夏らしさを演出していけるか、みたいな方向性でスイカ割りシューティングというアイデアに落ち着きました。

プロジェクト作成ボタンを押したのは木曜のこと。

 んで、形から入ろうと思ってタイトルを最初に作りました。

スイカを降らせたあたりからこれは行けると思ってメイン画面の開発に着手。

 

ここから花火でスイカを打ち落とせるようになり…

 金曜

 

スイカが割れるようになったり割れたスイカを喰った数がスコアになったり

土曜

 

 細かい部分を整えて…

日曜

 

完成!

 

 

今回の学び

やりたいことを大まかに決めとくのは大事だけど、形から入って始めるとありえんくらい序盤の開発が捗る。雰囲気だけ出してスクショ撮ってTwitterに上げるだけでモチベが上がる。特に1週間という期限が「とにかくやれぃ!」と背中を押してくれる。ヘタクソな素材を描いても1週間で作ったから!と言える安心感もすごい。あと汚いコード書いても1週間経てばオサラバだしね()

 

自分もこんなスピードで開発したのは初めてです。1週間という期限と、それに向けて頑張る一体感が心地いいですね。 #unity1week タグをしょっちゅう見てました。

これは来月も参加不可避……!時間があればだけど

 

 

 

 

 

【1.7.2~1.10対応】MinecraftのMODをつくりたい第二回 ~環境構築②~

さて、環境構築編二回目です。

 

今回からはForgeの環境を整えていきます。

具体的には、

・Forge ソースコード類のダウンロード

・Forge ワークスペースの構築

IDEでインポート

になります。

 

Forgeダウンロード

続きを読む

【1.7.2~1.10対応】MinecraftのMODをつくりたい第一回 ~環境構築①~

こんにちは。

題の通りやります。まずは開発環境の構築。

大まかに手順を言うと、……

1.JDKのインストール

2.Eclipseのインストール

3.Forgeのソースをダウンロード

4.ソースを準備

ForgeというのはMODで遊んでいる方ならほぼお分かりだと思いますが、ほとんどのMODを導入する際に前提として導入するMODのことですよね。Forgeの機能を利用するとMOD制作が大変容易になるのです。いまのMOD制作はこのForgeを利用するのが主流なのです。

早速やっていきます。

1.JDKのインストール

MinecraftやForgeはJavaと呼ばれるもので開発されており、MODもまたJavaを使って開発します。え?JavaならMinecraftと一緒にインストールした?実は、一般にJavaと呼ばれるもの(JREJava Runtime Environment)はJavaでつくられたソフトウェアを実行するために必要なものですが、さらにJavaを使った開発にはJDKJava Development Kit)といわれるものが必要になります

早速インストールしましょう。まずはJDKのサイトに飛びます。

f:id:ruccho:20161129213759j:image

Javaのロゴのところを開きます。

 

f:id:ruccho:20161129171611j:plain

いくつかのバージョンの「Java SE Development Kit」の項目のうち、一番上のものを見てください。

f:id:ruccho:20161129171648j:plain

(8u11の部分はJavaのバージョンを示しているので、画像と異なるかも)

Oracle Binary Code License Agreement for Java SE」から利用規約を読み、「Accept License Agreement」にチェックをつけて同意します。それができたら下のリンク群から自分のパソコンに合う版を選びましょう。この記事ではWindowsで話を進めます。64bit(ほとんどの方はこちら)なら「x64」を、32bitなら「x86」です。(わからなかったらこちらからググって)

 

ダウンロードした「jdk-~~~-windows-~~~.exe」を開くとインストールが始まります。

f:id:ruccho:20161129172758j:plain

「次」

f:id:ruccho:20161129172821j:plain

!ここに記載されている「インストール先」をメモっておいてください!

「次」を押すとインストールが始まります…

f:id:ruccho:20161129173006j:plain

f:id:ruccho:20161129173032j:plain

「次」

f:id:ruccho:20161129173134j:plain

f:id:ruccho:20161129173149j:plain

「閉じる」で完了です。

 

2.Eclipseのインストール

Eclipseとは所謂IDE統合開発環境)で、プログラミングをする際に便利な機能を盛り込んだテキストエディタ…という説明で通しちゃいます。地道にメモ帳で書く手段もなくはないですが激しくお勧めしません。

また、Forgeが推奨しているIDEとしてもう一つIntelliJというものがありますがEclipseでいきます。IntelliJでも進められますが(筆者未検証)、後の手順が若干変わることを覚えておいてください。

 

Eclipseは日本語化されたバージョンをインストールしましょう。このサイトの上段にある「Pleiades All in One」をダウンロードします。バージョンの一番新しいものをクリックしましょう。

Eclipse 日本語化 | MergeDoc Project

 

f:id:ruccho:20161129183040j:image

 

Java」の「Full Edition」を選択します。64bitか32bitかについては前述の通りです。ダウンロードしたzipを解凍して任意の場所に配置しましょう。どこでも構いませんが、プログラミングの基本として、(フル)パスに日本語が入らない場所が理想です。

できましたら、その中のeclipse.exeから起動できます。その前にデスクトップにショートカットを作っておくことを勧めます。

 

起動時に、「ワークスペース」設定のダイアログが現れます。EclipseをMOD開発のみに使う方にはあまり関係ありませんが、私の場合は「C:/Users/<ユーザー名>/workspace」にしました。

 

Eclipseがうまく起動しましたか?

長いのでここで一回切ります。次回はForgeの設定を行なっていきます。

 

【1.7.2~1.10対応】MinecraftのMODをつくりたい第二回 ~環境構築②~ - るっちょ らいつ

 

【Unity】uGUIテキストを簡単にローカライズする

はじめに

ローカライズ手法といえば、おそらく言語ごとの設定ファイルを別で作成するというのが主流なのでしょうが、多くのテキストとの対応関係を整理して把握しきるのは大変です。特に個人開発者にとっては、あまりシステム化されていなくても手早く実装できる手段が必要なこともあるでしょう。

イメージ

  1. スクリプトTextLocalizerを作成する
  2. uGUIのTextがアタッチされているGameObjectにTextLocalizerをアタッチする
  3. Inspectorから各種言語を設定する
  4. 反映される

実装

続きを読む