雑多物ストア

内容に一貫性は無く雑多です.暇潰しで弄った工作物のメモ書きや旅行した際の写真を置くことがメインになると思います.

雑多物ストア

環境構築のメモとかをして容量2bitの頭を補完する場所.
後は旅行の際の写真を上げたり.
内容に一貫性は無く雑多になってます.

【備忘録】ラズパイを使った録画サーバの構築 4回(自動エンコード構築編)

ラズパイを使った録画サーバの構築(自動エンコード構築編)

前回の続き.前回↓ miyakonorth.hatenablog.jp

テレビ番組の録画から保存までをできるようになりました.しかし,現状では地上波の生データをそのまま保存しているため,結構な容量があります(例えば,1時間の番組だと6 GBくらい使います).
よって,録画した番組をエンコードし,容量を圧縮して保存するようにします.本ブログでは自動で定期的にエンコードを行う所までを実装します.

本ブログ記事での環境

環境 バージョン
Raspberry Pi 3 Model B+
OS Raspbian GNU/Linux 10 (buster)
kernel 4.19.97-v7+

エンコード周りの構築

エンコードにはFFmpegを使用します.

www.ffmpeg.org

まず,エンコード周りについて調べていたら宇宙猫*1と化しました.
とは言え環境構築をしないと何も始まらないので,各フォーマットにおけるメリットやデメリット等のサーベイは取り敢えず保留し,思考停止でH.264の規格でエンコードすることにします.
H.264の規格でエンコードするにはx264が便利らしいので,x264に対応させた形でFFmpegをビルドします.

www.videolan.org

yasmのインストール

$ wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
$ tar xvfz yasm-1.3.0.tar.gz
$ cd yasm-1.3.0/
$ ./configure --prefix=/usr/local
$ make -j4
$ sudo make install -j4

nasmのインストール

$ sudo apt-get install nasm

alsaのインストール

http://ftp://ftp.alsa-project.org/pub/lib/

$ wget http://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz
$ tar xvfz yasm-1.3.0.tar.gz
$ cd yasm-1.3.0
$ ./configure --prefix=/usr/local
$ make -j4
$ sudo make install -j4

後で調べたらalsaもaptでインストールできたらしい...

x264のインストール

www.videolan.org

この辺記憶が曖昧で,x264のビルドにもっとライブラリが必要だった気がする.

$ git clone git://git.videolan.org/x264.git
$ cd x264/
$ ./configure  --enable-shared --disable-opencl --prefix=/usr/local
$ make -j4
$ sudo make install -j4
$ sudo ldconfig

FFmpegのインストール

$ git clone --depth 1 git://source.ffmpeg.org/ffmpeg.git
$ cd ffmpeg
$ ./configure --enable-gpl --enable-nonfree --enable-libx264 --enable-mmal --enable-omx-rpi --enable-omx --extra-cflags="-I/<path_to_ffmpeg>/ffmpeg/include" --extra-ldflags="-L/<path_to_ffmpeg>/ffmpeg/lib" --extra-libs=-ldl
$ make -j4
$ suo make install -j4

ライブラリの再読み込み

$ sudo ldconfig

FFmpegの実行テスト

$ ffmpeg -i test_movie.m2ts -b:v 1000k -b:a 128k -vcodec libx264 output.mp4

スクリプトからエンコードを実行する

以下を参考に Raspberry Pi 4+Chinachu v0.10.1-gamma.0 地デジ録画サーバー構築 - Qiita

以下のスクリプトを用意しました.以下ではスクリプト名をencode.shとします.

#! /bin/bash

X264="-f mp4 -c:v h264_omx -c:a copy -r 23.98 -s 1920x1080 -b:v 4500k -threads 0 -flags +ilme+ildct -top -1 -deinterlace -preset veryfast -y"

DIR1="/mnt/data/recorded"      #生データの番組を保存しているディレクトリのパス
DIR2="/mnt/data/processing"   #エンコード中の番組を置いておくパス
DIR3="/mnt/data/encoded"      #エンコードした番組を保存しておくディレクトリのパス
EXT="m2ts"
ENCEXT="mp4"

cd $DIR1
orgfpath=`find $DIR1 -maxdepth 1 -type f -name "*.$EXT" -print0 | xargs -0 ls -rt | awk 'NR==1' | awk '{printf $0}'`

# エンコード対象ファイルがない場合はスキップ
if ! [ -e "$orgfpath" ]; then
        exit 0
fi

orgfname="${orgfpath##*/}"
encfname="${orgfname%.*}.$ENCEXT"

echo "orgfile=$orgfname"
echo "encfile=$encfname"

cd  $DIR2
count=`find $DIR2 -maxdepth 1 -type f -name "*.$EXT" -printf '.' | wc -c`
echo "encoding count $count"
if [ $count -lt 2 ]; then
        mv "$orgfpath" "$DIR2"
        ffmpeg -fflags +discardcorrupt -i "$DIR2/$orgfname" -bsf:a aac_adtstoasc $X264 "$DIR2/$encfname"
        mv "$DIR2/$encfname" "$DIR3"
        rm -f "$DIR2/$orgfname"
fi
echo "end"

テストで動かしてみます.

$ sudo chmod 755 encode.sh
$ ./encode.sh

スクリプトを自動化する

cron*2スクリプトを定期的に動かしてくれるらしい.
rsyslog.confを開き

$ sudo vi /etc/rsyslog.conf

以下のコメントアウトを外す.

cron.*              /var/log/cron.log

再起動.

$ sudo /etc/init.d/rsyslog restart

crontabを開き編集します.

$ crontab -e

crontabを設定します.以下の設定で毎日午前10時にエンコードが実行されるように設定しました.

00 10 * * * /<エンコードするためのスクリプトのパス>/encoded.sh > /home/pi/myjob.log 2>&1

デバッグのためにmyjob.logにコマンド実行時のログを記録したかったので,> /home/pi/myjob.log 2>&1と明記.
数字は左から順番にコマンドを実行する曜日らしい.
例えば毎週金曜日の午後03時00分にコマンドTINTIN_frafra_Fridayを実行したい場合,以下のように設定します.

00 15 * * 5 TINTIN_frafra_Friday

ffmpegシンボリックリンクを設定

cronからだとffmpegコマンドが実行できなかったので,シンボリックリンクを貼りました.

$ sudo ln -s /usr/local/bin/ffmpeg /usr/bin/ffmpeg

終わりに

取り敢えず定期的にエンコードが実行される環境を構築できました.
普段動画編集とか一切しないのでエンコードに関する知見は新鮮でした.
あとcronの存在を初めて知りました.電源入れっぱなしを前提とするマシンではかなり便利につかえそうだなと思いました(ボキャ貧).

参考

Raspberry Pi 4+Chinachu v0.10.1-gamma.0 地デジ録画サーバー構築 - Qiita

H.264対応のffmpegをLinux環境でビルドする - 動かざることバグの如し

Rapberry Pi 3 のハードウエアエンコーダh264_omxが使えるFFmpegをビルドする

crontabコマンドについてまとめました 【Linuxコマンド集】

cronでffmpeg - Qiita

cron の設定ガイド

H.264でエンコード:tech.ckme.co.jp

cronでffmpeg - Qiita

ffmpeg で H.264 エンコーディングの動画を作る - akihiko’s tech note