macOS で untrunc をビルドする

こんにちは、masm11 です。

突然ですが、動画って面倒ですよね… 主に mp4 の話ですが、 ファイルが途中で切れてると、全然再生してくれないんです。 データがあるところまでは再生してくれればいいのに…

で、データがあるところまでで辻褄を合わせて再生できるように するツールを作ってくれた人がいます。

https://github.com/ponchio/untrunc

弊社社長の和田が、これが macOS でビルドできない、 と困っていたので、今回はビルドしてみます。

ターゲットは macOS 12.4 Monterey です。

ビルドする

と言っても、上記の README.md には Mac OSX という項目があり、 基本的にはこの手順に従うだけです。基本的には。

ただ、

Follow the above steps for "Installing on other operating system",

とあるにも関わらず、Installing on other operating system という 項目はありません。いきなりつまずきました。

仕方ないので Installing from git に従います。

git clone --recurse-submodules https://github.com/ponchio/untrunc

ここでは、untrunc を clone してきます。 --recurse-submodules が付いています。 これで、submodule の libav も clone します。

cd untrunc/libav
./configure
make
cd ..

まず libav をビルドします。

g++ -o untrunc -I./libav file.cpp main.cpp track.cpp atom.cpp codec_*.cpp codecstats.cpp codec.cpp mp4.cpp log.cpp -L./libav/libavformat -lavformat -L./libav/libavcodec -lavcodec -L./libav/libavresample -lavresample -L./libav/libavutil -lavutil -lpthread -lz

とありますが、ここは Mac OSX 項目のコマンドラインで置き換えます。

g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp codec_*.cpp codecstats.cpp codec.cpp mp4.cpp log.cpp -I./libav-12.3 -L./libav-12.3/libavformat -lavformat -L./libav-12.3/libavcodec -lavcodec -L./libav-12.3/libavresample -lavresample -L./libav-12.3/libavutil -lavutil -lpthread -lz -framework CoreFoundation -framework CoreVideo -framework VideoDecodeAcceleration -lbz2 -DOSX

これです。これを実行してみたところ、エラーがたくさん出ました。

mp4.cpp:46:10: fatal error: 'libavcodec/avcodec.h' file not found
#include "libavcodec/avcodec.h"
         ^~~~~~~~~~~~~~~~~~~~~~

よく見てください。コマンドラインに指定したのは ./libav-12.3 ですが、 実在するディレクトリは ./libav です。コマンドラインを書き換えましょう。

g++ -o untrunc file.cpp main.cpp track.cpp atom.cpp codec_*.cpp codecstats.cpp codec.cpp mp4.cpp log.cpp -I./libav -L./libav/libavformat -lavformat -L./libav/libavcodec -lavcodec -L./libav/libavresample -lavresample -L./libav/libavutil -lavutil -lpthread -lz -framework CoreFoundation -framework CoreVideo -framework VideoDecodeAcceleration -lbz2 -DOSX

次に遭遇したエラーは以下のものです。

mp4.cpp:707:44: error: expected expression
        std::sort(packets.begin(), packets.end(), [](const Match &m1, const Match &m2) { return m1.offset < m2.offset; });
                                                  ^

?? この文法は何でしょう? 見たことありますか?

これは C++ のラムダ (lambda) です。いつの間にか C++ にラムダが導入されてたんですね… ソートする際に使う要素同士の大小関係を算出する関数を指定しているのでしょう。

このエラーメッセージは、どう見ても、ラムダを認識しているようには見えません。 きっとコンパイラが古いのでしょう (最新 Monterey なのに…)

Homebrew で gcc をインストールします。

brew install gcc

これで使えるようになる最新の g++ は g++-11 というコマンド名です。 先ほどのコマンドラインを更に修正します。

g++-11 -o untrunc file.cpp main.cpp track.cpp atom.cpp codec_*.cpp codecstats.cpp codec.cpp mp4.cpp log.cpp -I./libav -L./libav/libavformat -lavformat -L./libav/libavcodec -lavcodec -L./libav/libavresample -lavresample -L./libav/libavutil -lavutil -lpthread -lz -framework CoreFoundation -framework CoreVideo -framework VideoDecodeAcceleration -lbz2 -DOSX

warning がたくさん出ることは出ますが、通ったようです!

Installing from git に戻ると、あとはコピーだけですね。これで動きそうです。

まとめ

  • include path を修正する
  • 最新のコンパイラを使う

以上でコンパイルできました!