やりたいこと
CentOS上のChinachuで録画したスクランブル解除済みMPEG-2 TSを、別のWindowsマシンへ自動投入し、CMを検出・除去してH.265/HEVCのMP4へ変換する。
そのうちやりたいと思っていたものをCodexで何とかしてもらったメモ。
CM切り出しだけChinachuの鯖でやってあとで MP4変換手動もしくはパッチ処理しないとだめなのかと思ったらすべて自動処理できるらしい。
ただし、この処理だとエンコード済みMP4はChinachuからは見えない。
中間ファイルとして「CMカット済みTS」は作らない。元TSをAmatsukazeへ直接渡し、CMカットとGPUエンコードを一度に行う。これにより、次の利点がある。
- 再圧縮は1回だけ
- TSのGOP境界で無理に切り貼りする必要がない
- CM判定、インターレース解除、エンコードを同じ時間軸で処理できる
- 自動化に失敗しても元TSが残る
構成
PT3
│
▼
Chinachu / CentOS Stream 9
│ NFS
│ 録画完了時にAmatsukazeAddTaskを実行
▼
NAS
│ SMB
▼
Windows 11 / RTX 4070 Ti
│ Amatsukaze Server + NVEncC
▼
出力先
録画TSはNAS上にあるため、LinuxからWindowsへコピーしない。Linux上のNFSパスと、Windowsから見た同じファイルのSMB UNCパスをAmatsukazeAddTaskの--remote-dirで対応付ける。
使用したバージョン
- Chinachu: Gitコミット
6b49bd7 - CentOS Stream 9
- Amatsukaze(rigaya版)1.0.8.8
- NVEncC 9.31
- NVIDIA GeForce RTX 4070 Ti 12GB
- NVIDIAドライバー 591.86
Amatsukazeは、旧nekopanda版0.9.1.4ではなく、現在保守されているrigaya版を使用した。1.0.8.8にはLinuxからWindows Serverへタスクを投入するAmatsukazeAddTask_Linuxが公式配布されている。
- Amatsukaze: https://github.com/rigaya/Amatsukaze
- NVEncC: https://github.com/rigaya/NVEnc
Windows側の準備
Amatsukazeの配置
Amatsukazeを次へ展開した。
C:\Tools\Amatsukaze
NVEncCは次へ展開した。
C:\Tools\Amatsukaze\NVEncC\NVEncC64.exe
GPU認識は次のコマンドで確認できる。
& 'C:\Tools\Amatsukaze\NVEncC\NVEncC64.exe' --check-device
今回の環境では次のように認識された。
DeviceId #0: NVIDIA GeForce RTX 4070 Ti
Amatsukaze Server
ServerのAPIポートを32768、Web UIを32769とした。
API: :32768
Web UI: :32769/
SMB共有の資格情報を利用できるよう、Amatsukaze ServerはWindowsへログオンしている通常ユーザーの権限で起動する。サービス用の別アカウントやSYSTEMで起動すると、UNCパスにアクセスできない場合がある。
Windowsログオン時の自動起動には、Startupフォルダへ次のVBScriptを配置した。
Option Explicit
Dim shell
Set shell = CreateObject("WScript.Shell")
shell.CurrentDirectory = "C:\Tools\Amatsukaze"
shell.Run """C:\Tools\Amatsukaze\exe_files\AmatsukazeServerCLI.exe"" -p 32768", 0, False
基本設定
Amatsukazeの基本設定は次のようにした。
- NVEncC:
C:\Tools\Amatsukaze\NVEncC\NVEncC64.exe - エンコード中はスリープしない: 有効
- 自動ロゴ解析・採用: 有効
- 並列数: 1(初期運用)
エンコードプロファイル
同梱のサンプル_NVEnc-HEVC10bit(要CUDA)を複製し、次の名前で保存した。
Chinachu_NVEnc_HEVC10_VFR_CMcut
主な設定は次のとおり。
| 項目 | 設定 |
|---|---|
| エンコーダ | NVEnc |
| 映像 | HEVC 10bit |
| NVEncオプション | -c hevc --output-depth 10 --qvbr 32 --preset quality --multipass 2pass-full --bref-mode each |
| 出力 | MP4 |
| CM処理 | CMをカット |
| インターレース解除 | KFM |
| 出力fps | VFR |
| CUDA処理 | 有効 |
| リサイズ | 無効 |
| 音声再エンコード | 無効 |
| チャプター別ファイル | 有効 |
| SAR | コンテナにのみ記録 |
| 処理後の元TS移動 | 無効 |
| 未登録DRCS外字 | 無視して続行 |
「元TS依存」のフレームレートにするため、固定30fps化や60fps化はせず、KFMのVFRを使用した。
最重要なのは「処理の終了後、入力ファイルを別フォルダに移動する」を無効にすること。導入直後から元TSを移動・削除しない。
Linux側の準備
Amatsukaze 1.0.8.8のLinux x64用タスク投入クライアントを次へ配置した。
/home/{user}/amatsukaze-addtask/AmatsukazeAddTask
実行権限を付ける。
chmod 755 /home/{user}/amatsukaze-addtask/AmatsukazeAddTask
Chinachu録画後スクリプト
/home/shiongu/chinachu-amatsukaze-post.shを作成した。
#!/usr/bin/env bash
set -u
readonly ADD_TASK="/home/shiongu/amatsukaze-addtask/AmatsukazeAddTask"
readonly PROFILE="Chinachu_NVEnc_HEVC10_VFR_CMcut"
readonly SERVER_IP="{WindowsHOST}"
readonly SERVER_PORT="32768"
readonly RECORDED_DIR="/home3/public/Videos"
readonly WINDOWS_RECORDED_DIR='{TS保存ディレクトリ}'
readonly WINDOWS_OUTPUT_DIR='{変換後保存先}'
readonly LOG_FILE="/home/{user}/log/amatsukaze-post.log"
readonly PROC_MODE="${AMATSUKAZE_PROC_MODE:-auto}"
recorded_file="${1:-}"
log() {
printf '%s %s\n' "$(date '+%Y-%m-%d %H:%M:%S')" "$*" >> "$LOG_FILE"
}
if [[ -z "$recorded_file" ]]; then
log "ERROR: Chinachu did not provide a recording path"
exit 2
fi
if [[ "$recorded_file" != "$RECORDED_DIR/"*.m2ts ]]; then
log "SKIP: unexpected path or extension: $recorded_file"
exit 0
fi
if [[ ! -f "$recorded_file" ]]; then
log "ERROR: recording does not exist: $recorded_file"
exit 3
fi
log "ADD: $recorded_file"
if "$ADD_TASK" \
--file "$recorded_file" \
--setting "$PROFILE" \
--proc-mode "$PROC_MODE" \
--outdir "$WINDOWS_OUTPUT_DIR" \
--remote-dir "$WINDOWS_RECORDED_DIR" \
--ip "$SERVER_IP" \
--port "$SERVER_PORT" >> "$LOG_FILE" 2>&1; then
log "QUEUED: $recorded_file"
else
status=$?
log "ERROR: AmatsukazeAddTask exited with status $status: $recorded_file"
exit "$status"
fi
権限と構文を確認する。
chmod 755 /home/{user}/chinachu-amatsukaze-post.sh
bash -n /home/{user}/chinachu-amatsukaze-post.sh
Chinachuとの接続
Chinachuのconfig.jsonへ次を追加した。
"recordedCommand": "/home/{user}/chinachu-amatsukaze-post.sh"
このChinachuでは録画終了時に次の形式でプロセスが起動される。
recordedCommand <録画ファイルの絶対パス> <番組情報JSON>
スクリプトは第1引数だけを利用する。パスが想定する録画ディレクトリ配下の.m2tsであることと、ファイルが存在することを確認してから投入する。
変更前の設定は次へバックアップした。
/home/{user}/chinachu/config.json.bak-before-amatsukaze-20260812
テストで遭遇した問題
SSH越しに空白・日本語入りファイル名を渡せない
PowerShellからSSHコマンドの中へ日本語番組名を直接埋め込むと、引用符の解釈が複雑になった。本運用ではChinachuが録画パスを直接スクリプトの第1引数として渡すため、この問題は発生しない。
テスト専用処理では、Linux側スクリプト自身が最新TSを選択するようにした。
DRCS外字のマッピングがなく停止
初回テストは次のエラーで停止した。
DRCS外字のマッピングがありませんでした
無人処理を優先し、専用プロファイルの「マッピングにないDRCS外字は無視する」を有効にした。字幕全体を無効化する設定ではない。
初回チャンネルは自動ロゴ生成が必要
チャンネルのロゴが未登録の場合、最初のタスクはペンディングになり、自動ロゴ生成が走る。
ペンディング / ロゴ設定がありません / 自動ロゴ生成中
今回のテストではTSをSMB経由で正常に解析し、ロゴ枠を検出・生成できた。以後、同じサービスIDの録画では生成済みロゴが利用される。
--weightpとBフレームの警告
ベースにしたサンプルプロファイルのオプションでは、NVEncC 9.31が次の警告を表示した。
weighted prediction with B frames unsupported.
エンコード自体は継続できたが、機能しない指定を残す理由がないため、専用プロファイルから--weightpを削除した。
実機テスト結果
2026年8月12日のABCテレビ録画をAmatsukazeのテストモードへ投入した。初回はDRCS外字で停止したが、設定修正後の再テストは完了した。
| 項目 | 結果 |
|---|---|
| 全処理時間 | 9分44秒 |
| CM・ロゴ解析 | 36.88秒 |
| 入力映像 | 1440×1080、30000/1001fps、インターレース |
| フィルタ出力 | 66,766フレーム、VFR(ベース60000/1001fps) |
| 映像コーデック | H.265/HEVC Main10 |
| NVEnc速度 | 197.60fps |
| NVEnc時間 | 5分37秒 |
| 映像平均ビットレート | 約2,112kbps |
| テスト映像サイズ | 約280MB |
| GPU Video Engine使用率 | 平均47.6% |
| 音声 | MPEG-2 AACを再構築、2トラック |
| 字幕 | SRTをMP4へ格納、ASSを別ファイル出力 |
| チャプター | 別ファイル出力+MP4へ格納 |
出力先には次の4ファイルが生成された。
番組名.mp4
番組名.ass
番組名.chapter.txt
番組名-enc.log
ログ上ではCMカット用のTrim区間、KFMのVFR時間コード、NVEncCのMain10出力、MP4BoxによるMuxまで確認できた。元の.m2tsは移動も削除もされていない。
ログと確認先
Linux側の投入ログ:
/home/{user}/chinachu/log/amatsukaze-post.log
Windows側:
http://{windowsHOST}:32769/
C:\Tools\Amatsukaze\data\Server.log
ポート確認:
netstat -ano | Select-String -Pattern ':32768|:32769'
運用上の注意
- CM判定は100%ではない。導入直後は元TSを残す。
- ロゴ変更時には再採取が必要になる場合がある。
- 通販番組、ロゴ付きCM、番組内広告などは誤判定しやすい。
- Windowsが停止中の場合、現在の単純フックは投入に失敗してログへ残る。将来は再投入キューやWake on LANを追加できる。
- WindowsのServerプロセスは、NASへアクセスできる通常ユーザーで起動する。
- まず並列数1で安定性を確認し、NASとGPUに余裕があれば増やす。
まとめ
録画後にCMカット済みTSを作るのではなく、元TSをWindows上のAmatsukazeへ直接渡してCM解析とNVEnc変換を一度に処理する構成にした。NFSとSMBが同じNAS上のファイルを指しているため、巨大なTSファイルのコピーも不要だった。
この方式なら、Chinachuは録画に専念し、重い解析・エンコード処理はRTX 4070 Ti搭載Windowsへ分離できる。元TSを保持する安全設定から始められるのも大きい。