VRMとか4090とffmpegのエンコードの話

PC
この記事は約6分で読めます。

かわよ

MMDみたいなやつ

最近MMDみたいな動画を作ってます
(作っていると言うのか問題はあるけど)

VRMがあればVRM Live ViewerでMMDのような踊りをしてくれるのでものすごくお手軽にできます
(まぁモデル構造が違うので関節周りは微妙な結果になりますが、そこら辺は考えないとします)

VRM Live Viewerにはプリセット機能があるので一応すぐ読み出すことはできますが、その都度開くのもめんどいし、モデル構造によっては尻尾や髪の毛、スカートが変な方向に行ったりするので同じ物が見れるとは限りません

ということで良い感じにできたら録画をしてます

(カワヨ過ぎでしょ)

OBS

OBSのポータブル版を4K120Hz仕様にして、録画開始ボタンを押してすぐVRM Live Viwerを再生、終わったら録画停止な感じです

液晶が4K 144Hzなのでほぼ同じぐらいで撮りたかっただけっていう

録画設定は4090を搭載しているので適当に設定しています

エンコーダーNVENC AV1
レート制限CBR
ビットレート40000
プリセットP5 (Slow)
マルチパス2パス(1/4解像度)

高負荷系はソフトウェアエンコードはとても耐えられないのでハードウェアエンコードです

とりま良い感じに録画できれば良いやぐらいで設定しているので、もっと余裕のある設定はできると思います
(でもこれで満足してる)

4K解像度であるのと、MMDのようにカメラが結構動くのでビットレートは高め

ffmpeg

さて、録画してこのマシンで見る分には良いのですが、まだ扱いが悪いです

大体1曲数分ぐらいですがファイルサイズは1GBです

あと素のWindows環境ではAV1も再生できません(例えばVRChatの動画プレイヤー)

どの環境でも大体はH264は見れるので、H264と自分が見る用にAV1で再エンコードしています

現在 ffmpeg 6.0ではAV1のハードウェアエンコードに公式が対応しているので、全部入りバイナリをDLして動かすだけです
(CUDAとかは必要かも)

  • CPU: Intel Core i7-11700K
  • RAM: 32GB (16GBx2) 3200MHz
  • SSD 0: WDC WDS500G2B-A-00SM50
  • SSD 1: Micron_1100_MTFDDAK1T0TBN
  • SSD 2: WDC WDS960G2G0C-00AJM0
  • GPU 0: iGPU Intel UHD Graphics 750
  • GPU 1: dGPU NVIDIA GeForce RTX 4090

各種エンコードスクリプトはD&Dか引数にエンコードしたいファイルを指定すればエンコードされる
ffmpegなどのパスは適当に変えてね
duration.batはQiitaの記事にあった時間計測スクリプト

view raw

README.md

hosted with ❤ by GitHub


@echo off
@setlocal
if "%~1"=="" exit /b -1
call :time2centiseconds %1
set startcs=%errorlevel%
if "%~2"=="" exit /b %startcs%
call :time2centiseconds %2
set endcs=%errorlevel%
call :duration_centiseconds %startcs% %endcs%
set dur=%errorlevel%
if "%~3"=="" call :centiseconds2time %dur%
exit /b %dur%
:time2centiseconds
if "%~1"=="" exit /b 0
for /f "tokens=1-4 delims=:.," %%a in ("%~1") do set /a cs=%%a*360000+(1%%b %% 100)*6000+(1%%c %% 100)*100+1%%d %% 100
exit /b %cs%
:duration_centiseconds
if "%~1"=="" exit /b 0
if "%~2"=="" exit /b 0
set /a dur=%2 – %1
rem we might have measured the time inbetween days
if %dur% lss 0 set /a dur=%dur%+8640000
exit /b %dur%
:centiseconds2time
if "%~1"=="" exit /b -1
set /a h=%1 / 360000
set /a m=(%1 – %h% * 360000) / 6000
set /a s=(%1 – %h% * 360000 – %m% * 6000) / 100
set /a cs=(%1 – %h% * 360000 – %m% * 6000 – %s% * 100)
if %h% lss 10 set h=0%h%
if %m% lss 10 set m=0%m%
if %s% lss 10 set s=0%s%
if %cs% lss 10 set cs=0%cs%
for /f "tokens=1-2 delims=," %%a in ( "%time%" ) do (
if "%%b"=="" (
echo %h%:%m%:%s%.%cs%
) else (
echo %h%:%m%:%s%,%cs%
)
)
exit /b 0
view raw

duration.bat

hosted with ❤ by GitHub


@echo off
chcp 65001
rem ffmpegのパス
set FFMPEG_PATH=C:\Users\zin3\OneDrive\tools\ffmpeg\bin\ffmpeg.exe
rem D&Dしたファイルを入力ファイルとする
set INPUT_FILE_PATH=%1
rem 指定のディレクトリを保存先とする
set OUTPUT_FILE_DIR=C:\Users\zin3\Videos\ffmpeg
rem 出力ファイルパス
set OUTPUT_FILE_PATH=%OUTPUT_FILE_DIR%\%~n1_AV1_FHD_OrigHz_Web.mp4
rem 2pass用ファイル
set PPASS_FILE_NAME=2passcheck
rem 引数がない場合は終了する
if "%~1"=="" (
echo 引数がありません
pause
exit /b
)
cd C:\Users\zin3\OneDrive\tools\ffmpeg\bin
rem in/outのファイルパスを表示
echo 入力ファイル: %INPUT_FILE_PATH%
echo 出力ファイル: "%OUTPUT_FILE_PATH%"
rem ファイルのチェック
if not exist %INPUT_FILE_PATH% (
rem ない
echo 入力ファイルがないので終了します
pause
exit /b
)
if exist "%OUTPUT_FILE_PATH%" (
echo 出力ファイルあるので終了します
pause
exit /b
)
set basetime=%time%
rem 1pass
echo FFMPEG 上書き、GPUデコード、GPUエンコード、音声なし、出力NULL(標準出力)
"%FFMPEG_PATH%" -y ^
-hwaccel cuda ^
-i %INPUT_FILE_PATH% ^
-vcodec av1_nvenc ^
-preset p5 ^
-multipass 2 ^
-b:v 5M ^
-maxrate 7M ^
-bufsize 14M ^
-rc 1 ^
-s 1920×1080 ^
-pass 1 ^
-passlogfile "%PPASS_FILE_NAME%" ^
-an ^
-f null –
if not "%errorlevel%" == "0" (
echo "ffmpeg(1pass)が異常終了しましたので終了します"
pause
exit /b
)
rem 2pass
echo FFMPEG GPUデコード(AUTO)、GPUエンコード(AV1_NVENC) 、プリセット:p5、マルチパス(フル画面)、ビットレート(平均:5M、最大7M、バッファ14M)、VBR、FHD、メタデータ消去、チャプター消去、faststart
"%FFMPEG_PATH%" ^
-hwaccel cuda ^
-i %INPUT_FILE_PATH% ^
-vcodec av1_nvenc ^
-preset p5 ^
-multipass 2 ^
-b:v 5M ^
-maxrate 7M ^
-bufsize 14M ^
-rc 1 ^
-g 60 ^
-tune 2 ^
-s 1920×1080 ^
-map_metadata -1 ^
-map_chapters -1 ^
-movflags +faststart ^
-pass 2 ^
-passlogfile "%PPASS_FILE_NAME%" ^
"%OUTPUT_FILE_PATH%"
if not "%errorlevel%" == "0" (
echo "ffmpeg(2pass)が異常終了しましたので終了します"
pause
exit /b
)
cd %~dp1
rem 2passcheckファイルを消す
if exist "%PPASS_FILE_NAME%-0.log" (
del "%PPASS_FILE_NAME%-0.log"
)
C:\Users\zin3\OneDrive\tools\ffmpeg\duration.bat %basetime% %time%
pause


@echo off
chcp 65001
rem エンコード時間は大体動画の3倍
rem ffmpegのパス
set FFMPEG_PATH=C:\Users\zin3\OneDrive\tools\ffmpeg\bin\ffmpeg.exe
rem D&Dしたファイルを入力ファイルとする
set INPUT_FILE_PATH=%1
rem 指定のディレクトリを保存先とする
set OUTPUT_FILE_DIR=C:\Users\zin3\Videos\ffmpeg
rem 出力ファイルパス
set OUTPUT_FILE_PATH=%OUTPUT_FILE_DIR%\%~n1_AV1_org_OrgHz_Web.mp4
rem 2pass用ファイル
set PPASS_FILE_NAME=2passcheck
rem 引数がない場合は終了する
if "%~1"=="" (
echo 引数がありません
pause
exit /b
)
cd C:\Users\zin3\OneDrive\tools\ffmpeg\bin
rem in/outのファイルパスを表示
echo 入力ファイル: %INPUT_FILE_PATH%
echo 出力ファイル: "%OUTPUT_FILE_PATH%"
title INPUT CHECK %INPUT_FILE_PATH%
rem ファイルのチェック
if not exist %INPUT_FILE_PATH% (
rem ない
echo 入力ファイルがないので終了します
pause
exit /b
)
title OUTPUT CHECK "%OUTPUT_FILE_PATH%"
if exist "%OUTPUT_FILE_PATH%" (
echo 出力ファイルあるので終了します
pause
exit /b
)
set basetime=%time%
if exist "%OUTPUT_FILE_PATH%.1pass.txt" (
echo 1pass をスキップします
goto PASS1
pause
)
title 1pass %INPUT_FILE_PATH%
rem 1pass
echo FFMPEG 上書き、GPUデコード、GPUエンコード、音声なし、出力NULL(標準出力)
"%FFMPEG_PATH%" -y ^
-hwaccel cuda ^
-i %INPUT_FILE_PATH% ^
-vcodec av1_nvenc ^
-preset p5 ^
-multipass 2 ^
-b:v 15M ^
-maxrate 20M ^
-bufsize 30M ^
-rc 1 ^
-pass 1 ^
-passlogfile "%PPASS_FILE_NAME%" ^
-an ^
-f null –
if not "%errorlevel%" == "0" (
echo "ffmpeg(1pass)が異常終了しましたので終了します code: %errorlevel%"
pause
exit /b
)
echo 1pass > "%OUTPUT_FILE_PATH%.1pass.txt"
:PASS1
del "%OUTPUT_FILE_PATH%.1pass.txt"
title 2pass %INPUT_FILE_PATH%
rem 2pass
echo FFMPEG GPUデコード(AUTO)、GPUエンコード(AV1_NVENC) 、プリセット:p5、マルチパス(フル画面)、ビットレート(平均:5M、最大7M、バッファ14M)、VBR、FHD、メタデータ消去、チャプター消去、faststart
"%FFMPEG_PATH%" ^
-hwaccel cuda ^
-i %INPUT_FILE_PATH% ^
-vcodec av1_nvenc ^
-preset p5 ^
-multipass 2 ^
-b:v 15M ^
-maxrate 20M ^
-bufsize 30M ^
-rc 1 ^
-g 60 ^
-tune 2 ^
-map_metadata -1 ^
-map_chapters -1 ^
-movflags +faststart ^
-pass 2 ^
-passlogfile "%PPASS_FILE_NAME%" ^
"%OUTPUT_FILE_PATH%"
if not "%errorlevel%" == "0" (
echo "ffmpeg(2pass)が異常終了しましたので終了します code: %errorlevel%"
pause
exit /b
)
cd %~dp1
rem 2passcheckファイルを消す
if exist "%PPASS_FILE_NAME%-0.log" (
del "%PPASS_FILE_NAME%-0.log"
)
C:\Users\zin3\OneDrive\tools\ffmpeg\duration.bat %basetime% %time%
pause
pause
pause


@echo off
chcp 65001
rem エンコード時間は大体動画の3倍
rem ffmpegのパス
set FFMPEG_PATH=C:\Users\zin3\OneDrive\tools\ffmpeg\bin\ffmpeg.exe
rem D&Dしたファイルを入力ファイルとする
set INPUT_FILE_PATH=%1
rem 指定のディレクトリを保存先とする
set OUTPUT_FILE_DIR=C:\Users\zin3\Videos\ffmpeg
rem 出力ファイルパス
set OUTPUT_FILE_PATH=%OUTPUT_FILE_DIR%\%~n1_H264_org_OrgHz_Web.mp4
rem 2pass用ファイル
set PPASS_FILE_NAME=2passcheck
rem 引数がない場合は終了する
if "%~1"=="" (
echo 引数がありません
pause
exit /b
)
cd C:\Users\zin3\OneDrive\tools\ffmpeg\bin
rem in/outのファイルパスを表示
echo 入力ファイル: %INPUT_FILE_PATH%
echo 出力ファイル: "%OUTPUT_FILE_PATH%"
title INPUT CHECK %INPUT_FILE_PATH%
rem ファイルのチェック
if not exist %INPUT_FILE_PATH% (
rem ない
echo 入力ファイルがないので終了します
goto EXITf
)
title OUTPUT CHECK "%OUTPUT_FILE_PATH%"
if exist "%OUTPUT_FILE_PATH%" (
echo 出力ファイルあるので終了します
pause
goto EXITf
)
set basetime=%time%
if exist "%OUTPUT_FILE_PATH%.1pass.txt" (
echo 1pass をスキップします
goto PASS1
pause
)
title 1pass %INPUT_FILE_PATH%
rem 1pass
echo FFMPEG 上書き、GPUデコード、GPUエンコード、音声なし、出力NULL(標準出力)
"%FFMPEG_PATH%" -y ^
-hwaccel cuda ^
-i %INPUT_FILE_PATH% ^
-vcodec h264_nvenc ^
-preset p5 ^
-b:v 15M ^
-maxrate 20M ^
-bufsize 30M ^
-rc 1 ^
-pass 1 ^
-passlogfile "%PPASS_FILE_NAME%" ^
-an ^
-f null –
if not "%errorlevel%" == "0" (
echo "ffmpeg(1pass)が異常終了しましたので終了します code: %errorlevel%"
pause
exit /b
)
echo 1pass > "%OUTPUT_FILE_PATH%.1pass.txt"
:PASS1
del "%OUTPUT_FILE_PATH%.1pass.txt"
title 2pass %INPUT_FILE_PATH%
rem 2pass
echo FFMPEG GPUデコード(AUTO)、GPUエンコード(AV1_NVENC) 、プリセット:p5、マルチパス(フル画面)、ビットレート(平均:5M、最大7M、バッファ14M)、VBR、FHD、メタデータ消去、チャプター消去、faststart
"%FFMPEG_PATH%" ^
-hwaccel cuda ^
-i %INPUT_FILE_PATH% ^
-vcodec h264_nvenc ^
-preset p5 ^
-b:v 15M ^
-maxrate 20M ^
-bufsize 30M ^
-rc 1 ^
-g 60 ^
-tune 2 ^
-map_metadata -1 ^
-map_chapters -1 ^
-movflags +faststart ^
-pass 2 ^
-passlogfile "%PPASS_FILE_NAME%" ^
"%OUTPUT_FILE_PATH%"
if not "%errorlevel%" == "0" (
echo "ffmpeg(2pass)が異常終了しましたので終了します code: %errorlevel%"
pause
exit /b
)
cd %~dp1
rem 2passcheckファイルを消す
if exist "%PPASS_FILE_NAME%-0.log" (
del "%PPASS_FILE_NAME%-0.log"
)
C:\Users\zin3\OneDrive\tools\ffmpeg\duration.bat %basetime% %time%
%%i in (%OUTPUT_FILE_PATH%) do set file_size=%%~zi
echo %file_size%
:EXITf
@REM pause


@echo off
chcp 65001
rem エンコード時間は大体動画の3倍
rem ffmpegのパス
set FFMPEG_PATH=C:\Users\zin3\OneDrive\tools\ffmpeg\bin\ffmpeg.exe
rem D&Dしたファイルを入力ファイルとする
set INPUT_FILE_PATH=%1
rem 指定のディレクトリを保存先とする
set OUTPUT_FILE_DIR=C:\Users\zin3\Videos\ffmpeg
rem 出力ファイルパス
set OUTPUT_FILE_PATH=%OUTPUT_FILE_DIR%\%~n1_H264_1p_org_OrgHz_Web.mp4
rem 2pass用ファイル
set PPASS_FILE_NAME=2passcheck
rem 引数がない場合は終了する
if "%~1"=="" (
echo 引数がありません
pause
exit /b
)
cd C:\Users\zin3\OneDrive\tools\ffmpeg\bin
rem in/outのファイルパスを表示
echo 入力ファイル: %INPUT_FILE_PATH%
echo 出力ファイル: "%OUTPUT_FILE_PATH%"
title INPUT CHECK %INPUT_FILE_PATH%
rem ファイルのチェック
if not exist %INPUT_FILE_PATH% (
rem ない
echo 入力ファイルがないので終了します
pause
exit /b
)
title OUTPUT CHECK "%OUTPUT_FILE_PATH%"
@REM if exist "%OUTPUT_FILE_PATH%" (
@REM echo 出力ファイルあるので終了します
@REM pause
@REM exit /b
@REM )
set basetime=%time%
title 1pass %INPUT_FILE_PATH%
rem 1pass
echo FFMPEG 上書き、CPU->H264_QSV、プリセット:veryslow、ave:15Mbps
"%FFMPEG_PATH%" -y ^
-hide_banner ^
-stats ^
-i %INPUT_FILE_PATH% ^
-vcodec h264_qsv ^
-async_depth 8 ^
-preset 3 ^
-b:v 15M ^
-maxrate 20M ^
-g 60 ^
-map_metadata -1 ^
-map_chapters -1 ^
-movflags +faststart ^
"%OUTPUT_FILE_PATH%"
if not "%errorlevel%" == "0" (
echo "ffmpeg(1pass)が異常終了しましたので終了します code: %errorlevel%"
pause
exit /b
)
cd %~dp1
rem 2passcheckファイルを消す
if exist "%PPASS_FILE_NAME%-0.log" (
del "%PPASS_FILE_NAME%-0.log"
)
echo "hage"
set file_size=
for %%i in (%OUTPUT_FILE_PATH%) do set file_size=%%~zi
echo %file_size%
C:\Users\zin3\OneDrive\tools\ffmpeg\duration.bat %basetime% %time%
pause

修正しながらやったのでいらないやつが多いかもしれませんが、FFMPEGのパスと保存先のディレクトリを指定してあげれば動くかも?
(←めんどいのでツール類をOneDriveに置いている人)

備忘録がてらFFMPEGのオプションをまとめとく

-hwaccel cuda
ハードウェアを使うか(-i前なのでデコード)cudaはNVIDIA
qsvはIntel
なぜか今回QSVは使えんかった
-i入力するファイルデコード設定とかはこれより前に指定
-vcodec h264_nvencエンコーダーのコーデック設定***_nvencはNVIDIA
***_qsvはIntel
-b:v 15MVBRで動画の平均ビットレート15Mは15000 Kbps
4KぐらいなのでこれだけどFHDなら5Mでも多いぐらい
足りないとがびがびになる
-maxrate 20M最大ビットレートこれ以下になるようになる
-bufsize 30Mバッファサイズ前フレーム+今のフレーム
つまり平均ビットレートx2ぐらい
-map_metadata -1
-map_chapters -1
メタデータやチャプターデータを消す元々無いが使わないので明示したかっただけ
-movflags +faststart
動画情報を先頭に持って行く動画サイズとかエンコード情報を動画の先頭に持ってくる(デフォは末尾)
Web用オプション、これがあれば動画をDLし終える前に再生開始できる
-pass nnパスエンコード目何パス目かを指定
2パスなら2回エンコする必要がある
-passlogfile

2passcheck
nパスエンコードの識別ファイル名残るのがじゃまだったので消すため、明示している
-an音声データなし2パスエンコードの1パス目は音声いらないため
-f null –ファイル名をnull、標準出力つまり出力しない
2パスエンコードの1パス目は動画ファイルにしなくていいので
-g 60キーフレーム数1秒あたりの数字
「-g 1にすれば良いぜ」的な記事を見たが、動かなかった
-hide_banner
バナー非表示バージョンとかビルドオプションを非表示にする
-stats
動画の情報表示入出力のエンコードとか

あとはエンコーダー固有の物がちらほら

H264_NVENCなら

-rc 1品質/VBR/CBRエンコードモード
-preset p5プリセットp5はslow(高品質)
-tune 2チューニング2は低遅延

H264_QSVなら

-async_depth 8
同時処理数?デフォ値は4
-preset 3
プリセットslow

エンコード結果とか

動画単体は大体が長くて4分だけどこんな感じ

オリジナル

曲名時間サイズ(MB)
疑心暗鬼0:02:51818.399
被害妄想携帯女子(笑)0:03:521110.13
シンデレラ(Giga First Night Remix)0:02:20671.904
FREELY TOMORROW0:04:001149.29
Nostalogic0:04:011150.90
フォニィ0:03:08900.535
どりーみんチュチュ0:03:591143.09

4K 120Hz AV1 2pass

曲名時間サイズ(MB)時間倍率サイズ倍率
疑心暗鬼0:08:44339.5393.070.41
被害妄想携帯女子(笑)0:11:51454.8803.060.41
シンデレラ(Giga First Night Remix)0:07:10262.2133.070.39
FREELY TOMORROW0:12:08473.6743.030.41
Nostalogic0:12:16463.3143.050.40
フォニィ0:09:41338.1053.090.38
どりーみんチュチュ0:12:08444.8083.050.39

FHD 120Hz AV1 2pass

曲名時間サイズ(MB)時間倍率サイズ倍率
疑心暗鬼0:08:46113.8643.080.14
被害妄想携帯女子(笑)0:10:07153.6112.620.14
シンデレラ(Giga First Night Remix)06:19.192.38772.710.14
FREELY TOMORROW11:03.9159.1602.770.14
Nostalogic11:21.1159.0482.830.14
フォニィ08:19.1124.8012.650.14
どりーみんチュチュ11:08.3159.7462.800.14

4K 120Hz H264 NVENC 2pass

曲名時間サイズ(MB)時間倍率サイズ倍率
疑心暗鬼0:07:04276.5812.480.34
被害妄想携帯女子(笑)0:09:37373.0902.490.34
シンデレラ(Giga First Night Remix)05:46.8223.0332.480.33
FREELY TOMORROW09:54.7388.8312.480.34
Nostalogic09:58.8385.9262.480.34
フォニィ09:30.8303.6013.040.34
どりーみんチュチュ10:00.8388.1262.510.34

大体エンコード時間は2パスなら3倍程度、サイズは4Kなら3,4割、FHDなら2割程度かな

コメント