AmatsukazeサーバーをLinuxから操作する方法

2021年2月26日

この記事を読むと得られる情報

  • 録画データのCMカット&エンコードを自動で実行する方法
  • AmatsukazeサーバーをLinuxから操作する方法

Amatsukazeについて

AmatuskazeはWindows上で動作する高性能なCMカット機能を持ったエンコードソフトです。
基本的な使い方に関しましては配布元であるGithubにて、偉大なる作者様がご丁寧に記載してくださっているので省略させて頂きます。
今回はLinuxからAmatsukazeを操作する方法をサンプルコードを交えてご紹介します。

想定環境

録画環境をLinux上で構築(以下:録画サーバー)しており、別にWindows上でAmatsukazeを導入済み(以下:Amatsukazeサーバー)であること前提にお話いたします。

かつてはテレビチューナーといえばPT3などのアースソフト社製のチューナーが有名でしたが、最近は入手困難ですので、PLEX社製TVチューナーを採用・検討することが多いと思います。
その構築プラットフォームの選択時に安定性を考慮してLinuxを選んだ、そんなマニアックなあなたへ向けた記事になります
(ちなみにLinux上でPLEX社製TVチューナーを使った録画環境の構築方法はこちらが有名です)


今回のゴールは
録画サーバーから、Amatsukazeへエンコードタスクを自由に操作できるようになること
です。
ちなみに、NW構成は下記の図をイメージしていますが、NASは必須では有りません。
録画したtsファイルを録画サーバーとAmatsukazeサーバーそれぞがアクセスできれば問題有りません。

NW構成図
NW構成図

Amatsukazeサーバーの準備

ではまず、AmatsukazeサーバーをWindows上で構築していきますが、前提として

・通常起動
・各放送局のロゴ取得
・エンコードプロファイルの設定

が完了しているものとします。

上記を一通りこなしてれば後は簡単。Amatsukazeをサーバーモードで起動しておくだけです。
Amatsukazeのフォルダ内にある「AmatsukazeServer.vbs」をダブルクリックしてください。

Amatsukazeサーバーの起動方法
Amatsukazeサーバーの起動方法

下記のようなウインドウがでて32768ポートで待ち受けていればOKです。
このウインドウは閉じず、そのまま放置しておきましょう。
場合によってはスタートアップに登録しておくものいいと思います。

Amatsukazeサーバー起動画面
Amatsukazeサーバー起動画面

録画サーバー側の準備

続いて録画サーバーの設定ですが、こちらも簡単
最低限動かす場合はLinuxで.NETを動かすmonoコマンドがあればOKです。
ただし、エンコード対象のファイル名にスペースなどがあるとうまく行かない場合が多いので、後ほど紹介するスクリプトを使う場合はrenameコマンドも必要です。
各コマンドのインストールは下記参照。
特にmonoコマンドに関して、うまく行かない場合は公式HPを参照してください。

# monoコマンドのインストール
sudo apt install gnupg ca-certificates
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
echo "deb https://download.mono-project.com/repo/ubuntu stable-focal main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
sudo apt update
sudo apt install mono-devel

# renameコマンドのインストール
sudo apt install rename

録画サーバーにもAmatsukazeサーバーと同じようにAmatsukaze本体を任意の場所に配置します。
(Linux版みたいな特別なものはないので全く同じ物を全て配置してください)
動作確認としてAmatsukazeディレクトリ内のexe_files/AmatsukazeAddTask.exeに対してmonoコマンドを実施します。

mono exe_files/AmatsukazeAddTask.exe

下記のようなヘルプの記述が出れば成功です。

$ mono exe_files/AmatsukazeAddTask.exe
入力ファイルパスを入力してください
amatsukaze/exe_files/AmatsukazeAddTask.exe <オプション> -f <input.ts>
オプション
  -f|--file <パス>        入力ファイルパス
  -s|--setting <プロファイル名> エンコード設定プロファイル
  -b|--bat <バッチファイル名> 追加時実行バッチ
  --priority <優先度>     優先度
  -ip|--ip <IPアドレス>   AmatsukazeServerアドレス
  -p|--port <ポート番号>  AmatsukazeServerポート番号
  -o|--outdir <パス>      出力先ディレクトリ
  -d|--nasdir <パス>      NASのTSファイル置き場
  -r|--amt-root <パス>    Amatsukazeのルートディレクトリ(サーバ起動用)
  --remote-dir <パス>     サーバから入力ファイルにアクセスするときのディレクトリパス
                          サーバからだとパスが異なる場合に必要
                          ファイル名部分は入力ファイル名からコピーされるのでディレクトリパスのみ入力すること
                          NASにコピーするときはコピー先のディレクトリをサーバからアクセスするときのパスを指定すること
                          例) \\rec-pc\share\rec
                          Bash等から打つときは\(バックスラッシュ)がエスケープ文字となることがあるため注意
  --no-move               NASにコピーしたTSファイルをtransferedフォルダに移動しない
  --clear-succeeded       NASにコピーする際、コピー先のsucceededフォルダを空にする
  --with-related          NASにコピーする際、関連ファイルも一緒にコピー・移動する
  --subnet <サブネットマスク>  Wake On Lan用サブネットマスク
  --mac <MACアドレス>  Wake On Lan用MACアドレス

上記のヘルプにしたがってコマンドを打てばAmatsukazeサーバーにタスクが投げられ、エンコードが開始されるのですが、今回は

  • エンコード追加命令の多重起動防止
  • 録画中のエンコードを防止
  • 複数の録画ファイル全てを順次タスクとして追加
  • ファイル名に存在するスペースをアンダースコアへ変換
  • 前回のエンコード成功ファイルの削除
  • 【必要な人向け】LINEへの通知

が簡単にできるスクリプトを用意しましたので、コメントアウトの説明文を参考に23行目までのパラメータを埋めてくれれば、あとはcronに仕込むなり録画完了時に実行するなりしてもらえれば良い感じにAmatsukazeサーバーへタスクが発行されます。

#!/bin/bash

# 変数宣言
## クライアントのAmatsukazeのEXEファイル
CLIENT_AMATSUKAZE=~/amatsukaze/exe_files/AmatsukazeAddTask.exe
## サーバーのAmatsukazeのディレクトリ
SERVER_AMATSUKAZE="C:\\Users\\Tom\\Documents\\Amatsukaze"
## サーバーIP(ドメインでも可)
IP="192.168.0.100"
## サーバーのAmatsukaze動作ポート
PORT="32768"
## サーバから見た入力ファイルのあるディレクトリ
SERVER_INPUT_DIR="T:\\tv\\input"
## クライアントから見た入力ファイルのディレクトリ
CLIENT_INPUT_DIR=/mnt/tv
## 出力先ディレクトリ
OUTPUT_DIR="T:\\tv\\processed"
## 入力ファイル名(後で動的に取得するので適当でOK)
INPUT_FILE="ERROR"
## エンコードプロファイルの指定
PROFILE="デフォルト"
## LINEのトークン(なくてもいいです)
LINE_TOKEN="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
## 回転変数
MAX=`\ls $CLIENT_INPUT_DIR | grep -c .ts`
## 通知判定用変数
FLAG=0

# Main
## 多重起動となる場合はエンコードを中止する
if [ `ps -aux | grep -c $0` -ne 3 ]; then
    curl -X POST -H "Authorization: Bearer ${LINE_TOKEN}" -F "message=すでにエンコードタスクが回っているのでスキップしたよ" https://notify-api.line.me/api/notify >/dev/null 2>&1
    exit
fi
## 録画プロセスが動いている場合はエンコードを中止する
if [ `ps -aux | grep -c arib-b25-stream-test` -ne 1 ]; then
    curl -X POST -H "Authorization: Bearer ${LINE_TOKEN}" -F "message=録画中なので今日のエンコードはスキップしたよ" https://notify-api.line.me/api/notify >/dev/null 2>&1
    exit
fi
## 前回のエンコードファイルの削除
rm $CLIENT_INPUT_DIR/succeeded/*
## スペースを_へリネーム
find $CLIENT_INPUT_DIR -name "* *" | rename 's/ /_/g'
## エンコード
for ((i=1; i < $MAX+1; i++)); do
    ### エンコード対象のファイル名を取得
    INPUT_FILE=`\ls $CLIENT_INPUT_DIR | grep .ts  | sed -n "$i"p`
    ### エンコード対象をサーバーへ通知
    mono $CLIENT_AMATSUKAZE -ip $IP -p $PORT -f $SERVER_INPUT_DIR\\$INPUT_FILE -s $PROFILE --priority 2 -r $SERVER_AMATSUKAZE -o $OUTPUT_DIR
    ### エンコードタスクの追加完了を通知
    curl -X POST -H "Authorization: Bearer ${LINE_TOKEN}" -F "message=${INPUT_FILE}のエンコードタスクを追加したよ" https://notify-api.line.me/api/notify >/dev/null 2>&1
    FLAG=1
done
## 完了通知
if [ ${FLAG} -eq 0 ]; then
    curl -X POST -H "Authorization: Bearer ${LINE_TOKEN}" -F "message=今日のエンコード対象はなかったよ" https://notify-api.line.me/api/notify >/dev/null 2>&1
elif [ ${FLAG} -eq 1 ]; then
    curl -X POST -H "Authorization: Bearer ${LINE_TOKEN}" -F "message=全てのエンコードタスクの追加が終わったよ" https://notify-api.line.me/api/notify >/dev/null 2>&1
else
    curl -X POST -H "Authorization: Bearer ${LINE_TOKEN}" -F "message=予期せぬエラーで終了しました" https://notify-api.line.me/api/notify >/dev/null 2>&1
fi

LINEによる通知はなくても全く問題有りませんので不要な方は該当行を削除してください。
なおLINEのAPIの利用方法に関してはこの方の解説がわかりやすいので、こちらを参考にどうぞ。