FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PyFFmpeg を MinGW64 でビルドする

PyFFmpeg は win32 向けに Python 2.6 用のバイナリが配布されてますが,64bit で利用したければ自前でモジュールをビルドする必要があります.本記事では MinGW64 を用いて,PyFFmpeg を Python 2.6 64bit 用にビルドする方法を説明します.

Keywords: python,pyffmpeg,MinGW64


PyFFmpeg は MSVC コンパイラではビルドできません.Windows でビルドするためには MinGW が必要です.MinGW64 をインストールされていない方は,当サイトの記事を参考にインストールを済ませてください.PyFFmpeg は Cython と numpy に依存しています.64bit用のライブラリパッケージはこちらで配布されているので,必要な方はインストールしてください.scipy との関係も考えると,numpy は MKL 版をインストールするのが良いと思います.

作業環境
Python 2.6.6 x64
Cython-0.14.1
numpy-1.6.0

1.ソースコード類の準備

(i) git でウェブからリポジトリを入手します.本記事では C:\temp 内に pyffmpeg という名前でリポジトリをクローンします.コマンドプロンプトで C:\temp に移動し,以下のコマンドを実行します.

git clone https://github.com/tranx/pyffmpeg.git pyffmpeg

(ii) FFmpeg の64bit用ライブラリを入手します.以下のものをダウンロードしてください.本記事で用いたバージョンがなくなった場合でも,
・avcodec-52
・avformat-52
・avutil-50
・swscale-0
が含まれていればビルド可能であると思います(検証はしてません).

http://ffmpeg.zeranoe.com/builds/win64/shared/ >> ffmpeg-git-1aeb88b-win64-shared.7z
http://ffmpeg.zeranoe.com/builds/win64/dev/ >> ffmpeg-git-1aeb88b-win64-dev.7z

(iii) コピーしてきたリポジトリ(今回の例では C:\temp\pyffmpeg)の中に,ffmpeg というディレクトリを作成します.
(iv) ダウンロードしたアーカイブを展開し,中身(bin や include など)を作成した ffmpeg 内に移動します.

2.pyffmpeg.pyx の修正

Cython 0.14 では __new__ の代わりに __cinit__ を使うようになりました.pyffmpeg.pyx の807,1841行目の __new__ を __cinit__ に書き換えてください.

807: def __cinit__(self):
808: pass

1841: def __cinit__(self,with_readahead=True,seek_before=4000):
1842: self.filename = None
1843: self.tracks=[]

3.ビルド

(i) setup.py を修正します.修正部分が多いので,私がビルドする際に用いた setup.py を付録に示します.コピーして上書きするなどして利用してください.

(ii) libmsvcr90.a を pyffmpeg ディレクトリ内に置きます.( ※ libmsvcr90.a の作成方法はこちらの記事で説明してあります)

(iii) python setup.py build --compiler=mingw32 を実行します.

以上でビルドは完了です.作成されたモジュールの利用には avcodec-52.dll や avutil-50.dll などが必要になるので気をつけてください.

付録 setup.py
import os
import numpy.distutils.misc_util as nd
from distutils.core import setup
from distutils.extension import Extension
from Cython.Distutils import build_ext


ffmpegpath = 'ffmpeg'

libs = ['avformat.dll', 'avcodec.dll', 'avutil.dll', 'swscale.dll']

incdir = [ os.path.join(ffmpegpath, 'include')] + nd.get_numpy_include_dirs()
libdir = [ os.path.join(ffmpegpath, 'lib') , '.']

with_numpy=True

ext_modules = [
Extension('pyffmpeg', ['pyffmpeg.pyx'],
include_dirs=incdir,
library_dirs=libdir,
libraries=libs),
Extension('audioqueue', ['audioqueue.pyx'],
include_dirs=incdir,
library_dirs=libdir,
libraries=libs),
Extension('pyffmpeg_numpybindings', ['pyffmpeg_numpybindings.pyx'],
include_dirs=incdir,
library_dirs=libdir,
libraries=libs)
]

setup(
name = 'pyffmpeg',
cmdclass = {'build_ext': build_ext},
version = "1.9.1",
ext_modules = ext_modules
)

スポンサーサイト

コメントの投稿

非公開コメント

プロフィール

Ishida Akihiko

Author:Ishida Akihiko
FC2ブログへようこそ!

免責事項
当サイトに掲載する記事内容は,必ずしも正確性,信頼性,妥当性,有用性,完成度などを保証しません.記事の利用はすべて自己責任でお願いします.当サイトに掲載された内容によって発生したいかなる損害に対しても,管理人は一切の責任を負いかねます.
最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
アクセスカウンター
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QR
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。