ffmpegをMinGWでビルド(Windowsで使えるdll,libも作る)

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を入れる。

gcc-core-4.2.1-sjlj-2.tar.gz

これを入れると、gcc4.2.1は"gcc-sjlj"という名前で入るので、

  • gccコマンド = 3.4.5
  • gcc-sjljコマンド = 4.2.1

と使い分けができる。

ffmpegのソースを取得

Get 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。

タイトルとURLをコピーしました