Windows環境でffmpegのAPIをC言語から叩きたい。ということで、ffmpegをソースからビルドすることにした。
以下のサイトを参考にしながら、手始めに外部のライブラリを取り込まずに最小構成でのビルドで。
FFmpeg APIで、さまざまな動画を操る - 前編:CodeZine
FFmpeg APIで、さまざまな動画を操る - 前編:CodeZine を Windows(Mingw/MSYS) で試してみた - A More Beautiful day
MinGWのインストール
Automated MinGW Installerを使うと楽かも。
Automated MinGW Installer
ただし、私が使ったときはインストールオプションで"MinGW make"を選択するとダウンロードに失敗した。インストーラが感知しているバージョンと、実際にサーバにあるバージョンが異なるようだ。
インストーラ起動後、インストーラを起動させたまま、同じフォルダに作られるmingw.iniの内容を書き換えると上手くインストールできる。
[current]
make=mingw32-make-3.81-20080326-2.tar.gz|727
↓
make=mingw32-make-3.81-20080326-3.tar.gz|727
w32apiのインストール
標準でインストールされたw32apiはバージョンが古く、このままではffmepgのconfigureで弾かれる(3.13以上が必要)ので、w32apiの最新版を入れる。MinGWをインストールしたディレクトリに上書き解凍すればOK。
w32api-3.13-mingw32-dev.tar.gz
gcc4.2.1のインストール
gcc3.4.5でもビルドは通るし、exeも生成されるのだけど、いざ実行させてみると
Compiler did not align stack variables. Libavcodec has been miscompiled
and may be very slow or crash. This is not a bug in libavcodec,
but in the compiler. You may try recompiling using gcc >= 4.2.
Do not report crashes to FFmpeg developers.
とメッセージが出る。これでも特に動作はするのだけど、この警告メッセージが気になるのでgcc4.2.1を入れる。
これを入れると、gcc4.2.1は"gcc-sjlj"という名前で入るので、
- gccコマンド = 3.4.5
- gcc-sjljコマンド = 4.2.1
と使い分けができる。
ffmpegのソースを取得
今回は2009-03-27のnightlyを使った。リビジョンはr18200。これを適当なディレクトリに解凍する。
configureの前準備
configureを行う前に、スクリプトの中で使われているprコマンドを入れる必要がある。
参考にしたサイトはこちら↓。coreutilsを入れる。
猫科研究所(felid labo) - 今更MinGW(6)
configure
ffmpegのソースディレクトリに移動して、configure。まずは、
./configure --help
として、どのオプションが指定可能かを先に見ておいたほうがよい。
ネットで検索して出てくる記事(1〜2年前くらい)でのconfigureのオプションは、最近のffmpegのバージョンでは使えなくなっていることが多いので。
gcc4.2.1を使うようにするのと、最低限必要らしい"--enable-memalign-hack"、ライブラリを生成するための"--enable-shared"を付けてconfigure。
./configure --cc=gcc-sjlj --enable-memalign-hack --enable-shared
ビルド
おそらくconfigureはエラー無く終了するはずなので、make。
make完了後には、ffmpeg.exeと、libavformat、libavcodec、libswscale、libavutil、libavdeviceのそれぞれのフォルダに、.defと.dllファイルが生成されるはず。
ビルドして生成されたffmpegのバージョンは以下の通り
FFmpeg version SVN-r18200-snapshot, Copyright (c) 2000-2009 Fabrice Bellard, et al. configuration: --enable-shared --enable-memalign-hack --cc=gcc-sjlj libavutil 50. 2. 0 / 50. 2. 0 libavcodec 52.22. 3 / 52.22. 3 libavformat 52.32. 0 / 52.32. 0 libavdevice 52. 1. 0 / 52. 1. 0 libswscale 0. 7. 1 / 0. 7. 1 built on Mar 28 2009 02:39:23, gcc: 4.2.1-sjlj (mingw32-2)
補足
ただしここまでの手順だと、.def,.dllはできても.libが生成されない。
.defと.dllだと、プログラムから使うときにGetProcAddress()しなければならず、少し面倒。なので.libにしてリンクしてしまったほうが楽。
.libも作られるようにするには、VisualStudio2008などをインストールしたときに入る、libコマンドへのパスが通っている必要がある。
なのでVIsualStudio向けの環境変数設定を行うために、vcvarsall.batを実行しそのコマンドラインからmsysを起動してffmpegのビルドを行えばOK。
ffmpegのmake中に
Microsoft (R) Library Manager Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. ライブラリ libavdevice/avdevice-52.lib とオブジェクト libavdevice/avdevice-52.exp を作成中
と表示されていたらOK。
コメント
ffmpeg/mplayer/mencoder for Windows 動画や音声のエンコードで有名なOSS(オープンソースソフトウェア)、ffmpeg、mplayer、mencoderをWIndows環境でビルドする方法、使… …
[…] peg.lib)をビルドしなければならない.まぁ…それもT.Sugimotoさんのブログ( https://swingingblue.sakura.ne.jp/blog/archives/002420.html )に従えばできるのだが.あと,GPLではなくLGPLにしなければならない状況 […]