2018年12月9日日曜日

Linux boxでラジオ番組を自動録音する returns

以前、同じ目的の記事を書いた:

cf. [Linux boxでラジオ番組を自動録音する](https://typeinf-memo.blogspot.com/2016/01/linux-box.html)

今回、再び同じtitleで記事を書いたのは、録音に使っているLinux box (Debian sid)のinit systemを遂にsystemd化した (ずっとsysvinitで粘っていたが限界が訪れた)のが原因で録音に失敗したためである。

症状


* ffmpegを使って指定したpulseaudioのsourceから録音できない (cronからのみ)

logを取ってみるとこんな感じだった:

ffmpeg version N-92645-gc782e7aa9e Copyright (c) 2000-2018 the FFmpeg developers
  built with gcc 8 (Debian 8.2.0-10)
  configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-libass --enable-libfdk-aac --enable-libmp3lame --enable-libopus --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 --enable-libpulse --enable-gnutls --enable-ladspa --enable-libbluray --enable-libflite --enable-libmodplug --enable-libaom --enable-opencl --enable-vaapi --enable-vdpau --enable-pic --enable-shared --extra-cflags='-fPIC -Ofast'
  libavutil      56. 24.101 / 56. 24.101
  libavcodec     58. 41.102 / 58. 41.102
  libavformat    58. 23.102 / 58. 23.102
  libavdevice    58.  6.101 / 58.  6.101
  libavfilter     7. 46.101 /  7. 46.101
  libswscale      5.  4.100 /  5.  4.100
  libswresample   3.  4.100 /  3.  4.100
  libpostproc    55.  4.100 / 55.  4.100
alsa_input.pci-0000_00_1f.3.analog-stereo: Input/output error

これは多分前回の記事と同じerrorで、XDG_RUNTIME_DIRを指定すれば解決するはず。

なお、以前に記事を書いた時とpulseaudioのsourceが少し違っているが、以前systemd→sysvinitに戻した際変化した (cf. [PulseAudio w/o systemd](https://typeinf-memo.blogspot.com/2016/10/pulseaudio-wo-systemd.html))。

その時の変更をまた戻すことになった訳である。

対策


* XDG_RUNTIME_DIRを指定してffmpegを実行する

ついでに、backgroundでinvokeしたffmpegのPIDを取得しておき録音時間sleepさせた後kill -TERMで殺す、という方法ではなく、ffmpegの-t optionでduration指定する方法に改めた。

XDG_RUNTIME_DIR=/usr/user/1000 "${FFMPEG}" -f pulse -ac 2 -ar 44100 -i "${SOURCE}" -acodec libvorbis -q 3 -t ${DURATION} "${FILEPATH}" >${LOGFILE} 2>&1 &
なお、${FFMPEG}のような大文字の定数はscript内で
FFMPEG=/usr/local/bin/ffmpeg
といった具合に定義してある。


今後の展望


headless運用をしていて普段loginしない (maintenanceのためにたまにsshでloginするくらいの) Linux boxで自動録音をするなら、PulseAudioをsystem-wideなdaemonとして立ち上げておく方法が考えられる。

loginしていない時にはPulseAudioのper-user daemonが立ち上がっていないのでsourceも存在せずerrorを吐くと思うので。

ちなみにPulseAudioのdeveloperはPulseAudioのsystem-wide modeを推奨していない:

cf. [SystemWide](https://www.freedesktop.org/wiki/Software/PulseAudio/Documentation/User/SystemWide/)


0 件のコメント:

コメントを投稿