こんにちは、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 を修正する
- 最新のコンパイラを使う
以上でコンパイルできました!