空飛ぶ気まぐれ雑記帳

主に趣味とかプログラミングについて扱います。

Windowsでffmpegを使ってみた話

はじめに

ffmpegを使ってみた話ですが、あくまでもC++から使ってみようっていう話。
ffmpegバイナリを使うって話はググれば山ほど出てくるんだけど、Cのライブラリを使うって言う話はあまり出てこなかったので、備忘録を兼ねて。

そもそも、どうしてffmpegを使おうと思い至ったかと言いますと、OpenCVのVideoCaptureってコーデックが揃った外部のffmpegを指定してもフレームのシークや動画情報の取得が上手く行かない場合が多く、そもそもコーデックに対応してないなんて場合もあって微妙に使いづらいという問題があります。(汎用的な機構でいろんな動画フォーマットを開けるというだけで十分便利なのですがね)

それで、ffmpegを直接使えば多少の手間はかかれど、そういう問題はないだろうと思い、実際に試してみました。

準備

いつも通り、Windows環境での話しかしませんので、MacLinuxの人はパッケージマネージャーで適当に準備してください。
それで、Windows環境の場合ですが一からffmpegをビルドするのは大量のコーデックをビルドする必要があって、かなり骨が折れるので下記からダウンロードしてきましょう。
32bit、64bit、好きな方を選んで、SharedとDevの両方のパッケージをダウンロードしましょう。なぜかはわかりませんが、Devを選択してダウンロードしてくるとリンクするシンボルが含まれたlibファイルはあるのにdllがないのでSharedパッケージに含まれるdllを併せて利用します。

Builds - Zeranoe FFmpeg

テストコード

下記のサンプルコードを改変してC++で使えるようにしました。ただ、それだけだと面白みが無いので、フレームのシークをできるようにてみました。(正しく動いているとは言ってない)
ffmpeg tutorial

ポイントは、ffmpegのヘッダーを extern "C" で括ってやることぐらいですかね。
ただ、このコード。たまにシーク出来ないことがあるので、おそらくどこか間違ってるんでしょうね。おいおい修正します。

gist.github.com