12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

グレンジAdvent Calendar 2018

Day 25

クリスマスだし、みんなでバッチ作ろうぜ!(Sofdec)

Last updated at Posted at 2018-12-24

Merry Christmas!
株式会社グレンジでエンジニアマネージャー兼クライアントエンジニアのmesshiです。こんにちは。
(CyberAgentグループ、ゲーム事業部の子会社です)

この記事はグレンジ Advent Calendar 2018の最終日の記事となります。
今年のAdvent Calendarは「CRI Middleware」に関する記事が幾つかあったので、私もそれに便乗しようかなと思います。

@shirasaya0201から、[UnityでCRIを使う覚悟はいいか?オレはできてる]
(https://qiita.com/shirasaya0201/items/53baa38c83eebaa2cfbf)
@s_ebataから、CRIを使ったピッチ変更実装のハマりポイント

こちらの記事はADXツールに関するTIPS、つまりサウンド周りです。
少し嗜好を変えて、Sofdecという動画関係のツールに関して、TIPSを取り上げてみようと思います。

Sofdecといえば

CRI Middlewareが提供している、ゲームに特化した高画質・高音質の動画再生システムのことです。
開発者は、Sofdecのエンコードツールを利用してusmファイルという独自の動画ファイルを生成します。

この動画ファイルの生成には2通りあり、
【1】 Sofdec2EncWiz
 GUIがしっかりしていて、ポチポチしていくだけでusmファイルが生成できる
 基本的にはこちらを使って設定を行うのがメジャー
 ただし、 複数の動画作成を一括で出来ません
 つまり、プラットフォームの変更をしたいだけでも、都度設定しないといけない

【2】exeファイルをコマンドプロンプトから叩く
 定義したコマンドを流し込み、動画を生成する
 ちなみにexeファイルは3種類あり、作成する動画コーデックによって使い分けましょう

exeファイル 用途
sofdec2enc.exe Sofdec.Prime用
sofdec2encVP9.exe VP9用
sofdec2encH264.exe H.264用
 
弊社ではモバイル向けにアプリケーション開発を行っているので、少なくとも3つのファイルを作成する必要があります。(Android / iOS / PC)
この3ファイルをポチポチと設定しようものなら、人的ミスがいつ発生するか分かりません。
これはもう、バッチで自動化するしかないですね。

要件定義

ゴール: 各プラットフォーム向けの動画ファイルが、一括生成できるバッチファイルを作成する

エンコードファイル

・動画解像度、圧縮設定、音声圧縮コーデックは同じパラメータ
・動画圧縮コーデックは、「PC」はSofdec.Primeとし、「Android, iOS」はH.264とする

書き出し先

・バッチファイルのあるディレクトリにエンコード前の動画ファイルを格納する
・「Destination」ディレクトリを作成し、エンコード後の動画ファイルを格納する
 そのディレクトリ以下は「PC」, 「iOS」, 「Android」のフォルダを作成し、
 エンコード後のファイルをそれぞれのプラットフォーム毎に格納する
・ファイル名は、エンコード前のファイル名をそのまま踏襲する
・エンコード実行ファイルは1階層上にあるものとする

バッチファイルの作成

さぁ、バッチファイルを作成しましょう。
といっても、フォルダの作成などについては、「バッチファイルの作り方」でググればいくらでも出てくるため、本稿では割愛します。

それでは、エンコードをするためのコマンドについて、解説していきます。

エンコードのコマンド

sofdec2encに渡す引数は結構複雑です。
しかし、 その引数を簡単に導き出す方法 があります。

先ほど紹介した、GUIでポチポチするだけのSofdec2EncWizで書き出すと、「ファイル名.usm」と「ファイル名.txt」が生成されます。
この「ファイル名.txt」に「Console Args」という項目があり、これがそのまま使用できます。

Console Argsを参照した結果、次のようなコマンドになりました。

Android
"sofdec2encH264.exe" -video00="YOUR_SOURCE_PATH.avi" -out="YOUR_DEST_PATH.usm" -bitrate=1074000 -target=android -h264_profile=main -hca -hca_quality=3 -audio00="YOUR_SOURCE_PATH.avi" -scale=288,576

iOS
"sofdec2encH264.exe" -video00="YOUR_SOURCE_PATH.avi" -out="YOUR_DEST_PATH.usm" -bitrate=1074000 -target=ios -h264_profile=main -hca -hca_quality=3 -audio00="YOUR_SOURCE_PATH.avi" -scale=288,576

PC
"sofdec2enc.exe" -video00="YOUR_SOURCE_PATH.avi" -scale=288,576 -hca -hca_quality=3 -audio00="YOUR_SOURCE_PATH.avi" -bitrate=2999000 -output="YOUR_DEST_PATH.usm" -work_dir="YOUR_SOURCE_FOLDER_PATH" -preview=OFF -gop_closed=on -gop_i=1 -gop_p=4 -gop_b=2 -gui_mode

コマンドの理解を補助するために、一部コマンドを解説しておきます。
ここに記載していないコマンドは、CRIのドキュメントを見て下さい。

コマンド

エンコード指定

・H.264
-h264_profile=main

・VP9
マルチパスで複雑なので割愛
実際にSofdec2EncWizで書き出して確認してくださいませ。

・Sofdec.Prime
特に指定なし

video

エンコードする動画ファイルの格納場所
使用例: -video00="【SourceFilePath】"

out

エンコード後の動画ファイルの格納場所
使用例: -out="【TargetFilePath】"

bitrate

動画圧縮率の設定
使用例: -bitrate=1074000

Sofdec2EncWizでの各設定値はこちら


・H.264
圧縮設定 動画圧縮率
高圧縮 1074000 (bps)
高圧縮と標準の間 1611000 (bps)
標準 2148000 (bps)
標準と高品質の間 5101000 (bps)
高品質 8054000 (bps)

・Sofdec.Prime
圧縮設定 動画圧縮率
高圧縮 2999000 (bps)
高圧縮と標準の間 4498000 (bps)
標準 5997000 (bps)
標準と高品質の間 7996000 (bps)
高品質 9995000 (bps)

・VP9
圧縮設定 動画圧縮率
高圧縮 477000 (bps)
高圧縮と標準の間 716000 (bps)
標準 955000 (bps)
標準と高品質の間 1432000 (bps)
高品質 1909000 (bps)

target

ターゲットプラットフォーム
使用例: -target=ios

プラットフォーム 指定文字列
Android android
IOS ios
PC(standard) 指定なし

scale

リサイズ後の解像度
指定がない場合、リサイズしません
使用例: -scale=288,576

hca

音声コーデックをhcaとします
指定がない場合はadxコーデックになります
使用例: -hca

hca_quality

音声コーデックがhcsの際の圧縮率の設定です
使用例: -hca_quality=3

圧縮設定 指定数値
高圧縮 1
高圧縮と標準の間 2
標準 3
標準と高品質の間 4
高品質 5

バッチファイル全容

最終形はこのようになりました

movie_converter.bat
@echo off
echo [%date% %time%] --- Encoding Start --- >> encoding_log.txt

rem 書き出す動画リストを作成 (必要な拡張子を追加すること)
dir /b *.avi > movie_source_list.txt
dir /b *.mp4 >> movie_source_list.txt

rem 空ファイルなら終了
for %%a in (movie_source_list.txt) do (
  if %%~za==0 (
    echo [%date% %time%] --- Error: Movie File Is Empty --- >> encoding_log.txt
    del movie_source_list.txt
    exit 0
  )
)

rem 格納先フォルダの作成
rd /s /q destination
md destination\android destination\ios destination\pc

rem エンコード開始 (エンコードパラメータを変更する場合はココ)
setlocal enabledelayedexpansion

for /f %%a in (movie_source_list.txt) do (
  set fileName=%%~na
  set fileExtension=%%~xa

  echo [%date% %time%] --- %%a Encode Start --- >> encoding_log.txt
  echo [%date% %time%] --- android encode --- >> encoding_log.txt
  "../sofdec2encH264.exe" -video00="!fileName!!fileExtension!" -out="destination/android/!fileName!.usm" -bitrate=1074000 -target=android -h264_profile=main -hca -hca_quality=3 -audio00="!fileName!!fileExtension!" -scale=288,576

  echo [%date% %time%] --- ios encode --- >> encoding_log.txt
  "../sofdec2encH264.exe" -video00="!fileName!!fileExtension!" -out="destination/ios/!fileName!.usm" -bitrate=1074000 -target=ios -h264_profile=main -hca -hca_quality=3 -audio00="!fileName!!fileExtension!" -scale=288,576

  echo [%date% %time%] --- pc encode --- >> encoding_log.txt
  "../sofdec2enc.exe" -video00="!fileName!!fileExtension!" -scale=288,576 -hca -hca_quality=3 -audio00="!fileName!!fileExtension!" -bitrate=2999000 -output="destination/pc/!fileName!.usm" -work_dir="%CD%" -preview=OFF -gop_closed=on -gop_i=1 -gop_p=4 -gop_b=2 -gui_mode
)

endlocal

rem 後処理
del movie_source_list.txt
echo [%date% %time%] --- Success! --- >> encoding_log.txt

pause

最後に

今年も無事、25日間完走することが出来ました。
私たちの発信によって、読んでくださった方の一助になる事が出来れば幸いです。

また、少しでもグレンジという企業に興味を持っていただければ是非、ご応募下さい
発明が生まれる組織を一緒に作っていきましょう。

それでは、最後まで読んで頂き、ありがとうございました。
皆さん、良い年をお迎えください。

追記

2019/11/30
hcaの表記が逆だという指摘を頂いたので修正致しました

12
3
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?