【備忘録】ラズパイを使った録画サーバの構築 4回(自動エンコード構築編)
ラズパイを使った録画サーバの構築(自動エンコード構築編)
前回の続き.前回↓ miyakonorth.hatenablog.jp
テレビ番組の録画から保存までをできるようになりました.しかし,現状では地上波の生データをそのまま保存しているため,結構な容量があります(例えば,1時間の番組だと6 GBくらい使います).
よって,録画した番組をエンコードし,容量を圧縮して保存するようにします.本ブログでは自動で定期的にエンコードを行う所までを実装します.
本ブログ記事での環境
環境 | バージョン |
---|---|
Raspberry Pi | 3 Model B+ |
OS | Raspbian GNU/Linux 10 (buster) |
kernel | 4.19.97-v7+ |
エンコード周りの構築
まず,エンコード周りについて調べていたら宇宙猫*1と化しました.
とは言え環境構築をしないと何も始まらないので,各フォーマットにおけるメリットやデメリット等のサーベイは取り敢えず保留し,思考停止でH.264の規格でエンコードすることにします.
H.264の規格でエンコードするにはx264が便利らしいので,x264に対応させた形でFFmpegをビルドします.
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のインストール
この辺記憶が曖昧で,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
--enable-nonfree
,--enable-gpl
:GPLライセンスを承認するオプション.x264はGPLライセンスであるため,GPLライセンスであることを承認しないとビルドできません.enable-x264
:x264を有効にするオプション
ライブラリの再読み込み
$ 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をビルドする