FreeBSD: ffmpeg が動かない

大量のパッケージメンテナンスが発生し、pkgコマンドによるメンテナンスを行って、結果的に今回の大規模サーバーメンテナンスにつながるきっかけとなったのが、ffmpeg の動作不良。
FreeBSD上で ffmpeg コマンドを使用してcronでラジコを録音し、フォーマットやビットレート変換させて、最終的に iPodで聴ける形にしている一連の流れが、ffmpeg の動作不良で途切れてしまいました。これを復活させるまでの記録です。

これまでのメンテナンスの流れは次のようなもの。

  1. FreeBSD 10.3 のパッケージメンテナンスを行った
  2. ffmpeg が shared object libx265 が見つからないとメッセージを残し、実行出来なくなった。
  3. FreeBSD 10.3 p20  を p24 に上げた。(上げる時に rootディスクが死んだ。)
  4. FreeBSD 10.3 p24 でも症状に変化がなく、libx265 がエラーとなる。(ffmpeg が動いているサーバーは、ffmpeg3.4系 をソースビルドしたかも。その後、ports 下のffmpegは4系になってしまった。)
  5. テストサーバーをFreeBSD を10.4 に上げた。(上げる時にVirtualboxドライバーで Panicを起こした。)
    そして、ffmpeg を 4系に上げざるを得ませんでした。結果は、ffmpeg が core dump。
  6. テストサーバーの FreeBSD 10.4 を 11.1 に上げた。(上げる途中に、IDE HDDのドライバとデバイスファイルが変わっていて、mountroot で止まった。
    問題を解決して ffmpeg を試したら、Shared object “libdl.so.1” が無いと、またしても ffmpeg が動かなかった。

Shared object “libdl.so.1” not found

エラーであることには違いありませんが、core dump よりもわかりやすいのでありがたい。FreeBSD 11.1 で /usr/local/lib 下をチェックしてみたところ、確かに libdl.so という名前のライブラリはありません。では、本来のこのライブラリはどこにあるべきもの?
ports に含まれるなら、pkg upgrade -f でパッケージを入れ直せば依存関係で入るはず。
試してみたものの、入りません。ffmpegは相変わらずエラーを出力。ではソースからビルドしようと、portupgrade コマンドを使おうとしたところ、あれれ。portupgrade も shared object libdl.so not found となる!インストール済みコマンドを試してみると、bash まで動かない!

Web検索してみたところ、libdl.so は /usr/lib 以下にあるファイルでした。つまり、ports ではなく OSに含まれていて、しかも、FreeBSD11.1で発生する既知の不具合のようです。11.1のサポートは終了したので、もう対策される見込み無し。/usr/lib/libdl.so.1 が必要なパッケージを使うなら、11.2 に上げるしかありません。

ということで、テストサーバーを更に11.2 へバージョンアップ。

  1. OSをFreeBSD11.2 に上げ、ffmpeg問題が解決されることを望んでいたのですが、残念ながら解決せず。
    ffmpeg -h でまた core dump します。
  2. この後、「ffmpeg4 core dump」の検索結果を見ていたところ、ffmpeg の情報の他、core dump の解析方法に関しての情報が表示されました。私がビルドした訳ではないので core dump を解析することなど全く考えていませんでしたが、Webページを見てみると、core dump した位置を見つけるだけなら簡単そう。
    > gdb /usr/local/bin/ffmpeg ffmpeg.core
    でいいようです。gdbはコマンド、次にコマンドのパス、そして core ファイルのパス を指定するだけ。
  3. やってみた結果が以下。
> gdb /usr/local/bin/ffmpeg	ffmpeg.core 
GNU gdb 6.1.1 [FreeBSD]
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "i386-marcel-freebsd"...(no debugging symbols found)...
Core was generated by `ffmpeg -loglevel quiet -y -i TBS_201810151301_1.flv -ab 46k -ar 48k -strict expe'.
Program terminated with signal 4, Illegal instruction.
中略
Reading symbols from /libexec/ld-elf.so.1...(no debugging symbols found)...done.
Loaded symbols for /libexec/ld-elf.so.1
#0  0x29e8c492 in cv::ipp::setUseIPP_NE () from /usr/local/lib/libopencv_core.so.3.4
(gdb) bt
#0  0x29e8c492 in cv::ipp::setUseIPP_NE () from /usr/local/lib/libopencv_core.so.3.4
#1  0x29e8d4f5 in cv::ipp::setUseIPP_NE () from /usr/local/lib/libopencv_core.so.3.4
#2  0x29e9c8e2 in cv::va_intel::convertFromVASurface () from /usr/local/lib/libopencv_core.so.3.4
#3  0x29cbffd9 in _init () from /usr/local/lib/libopencv_core.so.3.4
#4  0xbfbfe208 in ?? ()
#5  0x28080154 in r_debug_state () from /libexec/ld-elf.so.1
#6  0x2807f65d in __tls_get_addr () from /libexec/ld-elf.so.1
#7  0x2807d12e in ?? () from /libexec/ld-elf.so.1
(gdb)
  1. やってよかった!core dumpするファイルがわかりました。
    /usr/local/lib/libopencv_core.so.3.4
    が犯人!
    pkg upgrade でメンテナンスした履歴を見直してみると、
    pkg: opencv-core upgraded: 2.4.13.1_1 -> 3.4.1_6
    と、一気にバージョンアップされています。ffmpeg とはどう結びついている?
    /usr/ports/multimedia/ffmpeg にて make config とやってみるとあるではないですか。
| |+[ ] OPENAL            Audio support via OpenAL                           | |                 
| |+[ ] OPENCL            Heterogeneous computing via OpenCL                 | |                 
| |+[x] OPENCV            Computer Vision support via OpenCV                 | |                 
| |+[ ] OPENGL            2D/3D rendering support via OpenGL                 | |                 
| |+[ ] OPENH264          H.264 video codec support via OpenH264             | |                 
| |+[ ] OPENJPEG          Enhanced JPEG graphics support
  1. この OPENCV のチェックを外してビルドしてみたところ、
    > ffmpeg
    ffmpeg version 4.0.2 Copyright (c) 2000-2018 the FFmpeg developers
    built with FreeBSD clang version 6.0.0 (tags/RELEASE_600/final 326565) (based on LLVM 6.0.0)と正常に起動!長かった〜。
  2. これで、自動録音している Radiko.jp の番組聴取復活です。

コメントを残す