破棄されたブログ

このブログは破棄されました。

Comskip が Ubuntu の libav でも動くようにいじってみてる

週末に TS から CM 位置にチャプタの入った MP4 を吐き出す Docker コンテナを作ってたんだけど、CM 検出に使ってる Comskip が特定バージョンの FFmpeg に依存してるっぽくて、 Comskip を使うのにいちいち FFmpeg をビルドする必要があった。

FFmpeg をビルドしたことがある人はわかると思うけど、ビルドにクッソ時間がかかる。ビルドしてる間に一本エンコできるくらい時間がかかる。

そこで、 Docker コンテナで使う Ubuntu 14.04 のレポジトリにいる、 libav に合わせて Comskip を書き換えてみた。とりあえずコンパイルはできるようになったけど、動作未チェックなので、後日確認する。

Commits · pjxiao/comskip · GitHub

変更点

libav の AVFrame には channels がいない

AVFrame 構造体に channels プロパティが存在しないため、 channel_layout プロパティを av_get_channel_layout_nb_channels() に食わせて、オーディオチャンネル数を取得するようにした。直後に、 av_get_channel_layout_nb_channels() の戻り値と channels が一致しなかったら、 av_get_default_channel_layout() の戻り値を使うみたいな分岐があるんで、ぶっ壊れた可能性あり。

コンパイルエラーが起きた前後しかチェックしてないんで、何してるとこかわからんが、 CM と本編とでオーディオチャンネル数が変化するのを拾って CM 検知するところかなんかだと思う。

PTS の取得

libav には、 av_frame_get_best_effort_timestamp() がない。しゃあないので、 PTS をそのまま信じることに。ぶっ壊れた可能性大。

av_find_stream_info()

av_find_stream_info() から avformat_find_stream_info() に変わってるっぽい。普通に修正。

url_feof()

url_feof() を使わないで、 eof_reached プロパッティを参照しろってどっかで見かけたので、修正。

備考

  • Comskip は FFmpeg のバージョンを固定してあるんだけど、 libav/FFmpeg はかなり変更が激しいので、バージョン固定するのは正解かもしれない。
  • libav と FFmpeg の互換の無さにはツライものがある。両方の互換とか考えたくない。
  • そもそも C でその辺のお作法がどうなってるのかわかんねーのでどうしようもない。

参考資料

ところで、「ギフト件」で検索したら出てきたこいつはなんだろう。

広告を非表示にする