2017-03-06 10 views
3

ffmpegを取得しようとしていて、今までスタックで多くの問題をカバーしていましたので、タイムラプスビデオを作成できます。matplotlib.animationでffmpegを正しく有効にするにはどうすればよいですか?

私はCentOS 7マシンで、python3.7.0a0を実行しています。

python3 
>>> import numpy as np 
>>> np.__version__ 
'1.12.0' 
>>> import matplotlib as mpl 
>>> mpl.__version__ 
'2.0.0' 
>>> import mpl_toolkits.basemap as base 
>>> base.__version__ 
'1.0.7' 

ffmpegのインストール時にthis github gistが見つかりました。クロムソースを使用し、prefixオプションなしでインストールしました(デフォルトを使用)。

私はffmpegがインストールされていることを確認しましたが、動作しているかどうかのテストについては何も知らないです。

which ffmpeg 
/usr/local/bin/ffmpeg 

ffmpeg -version 
ffmpeg version N-83533-gada281d Copyright (c) 2000-2017 the FFmpeg dev elopers 
built with gcc 4.8.5 (GCC) 20150623 (Red Hat 4.8.5-11 
configuration: 
libavutil  55. 47.100/55. 47.100 
libavcodec  57. 80.100/57. 80.100 
libavformat 57. 66.102/57. 66.102 
libavdevice 57. 2.100/57. 2.100 
libavfilter  6. 73.100/6. 73.100 
libswscale  4. 3.101/4. 3.101 
libswresample 2. 4.100/2. 4.100 

は、私は私がオンラインで見つけるいくつかのサンプル例を実行しようとした:

[1] http://matplotlib.org/examples/animation/basic_example_writer.html

私はアニメーションを保存しようとするまで、[2] https://stackoverflow.com/a/23098090/3454650

すべてがアップ正常に動作しますファイル。

[1]

anim.save('basic_animation.mp4', writer = FFwriter, fps=30, extra_args=['-vcodec', 'libx264']) 

[2]

im_ani.save('im.mp4', writer=writer) 

を私は明示的ffmpegのパスを設定する必要があるかもしれないhereを発見したので、私は、テストスクリプトの上部にこれを追加しました:

plt.rcParams['animation.ffmpeg_path'] = '/usr/local/bin/ffmpeg' 

コードでいくつかの調整を試みましたが、常に同じ応答が返されます。私は解読を始める方法を知らない:

Traceback (most recent call last): 
    File "testanim.py", line 27, in <module> 
    writer.grab_frame() 
    File "/usr/local/lib/python3.7/contextlib.py", line 100, in __exit__ 
    self.gen.throw(type, value, traceback) 
    File "/usr/local/lib/python3.7/site-packages/matplotlib/animation.py", line 256, in saving 
    self.finish() 
    File "/usr/local/lib/python3.7/site-packages/matplotlib/animation.py", line 276, in finish 
    self.cleanup() 
    File "/usr/local/lib/python3.7/site-packages/matplotlib/animation.py", line 311, in cleanup 
    out, err = self._proc.communicate() 
    File "/usr/local/lib/python3.7/subprocess.py", line 836, in communicate 
    stdout, stderr = self._communicate(input, endtime, timeout) 
    File "/usr/local/lib/python3.7/subprocess.py", line 1474, in _communicate 
    selector.register(self.stdout, selectors.EVENT_READ) 
    File "/usr/local/lib/python3.7/selectors.py", line 351, in register 
    key = super().register(fileobj, events, data) 
    File "/usr/local/lib/python3.7/selectors.py", line 237, in register 
    key = SelectorKey(fileobj, self._fileobj_lookup(fileobj), events, data) 
    File "/usr/local/lib/python3.7/selectors.py", line 224, in _fileobj_lookup 
    return _fileobj_to_fd(fileobj) 
    File "/usr/local/lib/python3.7/selectors.py", line 39, in _fileobj_to_fd 
    "{!r}".format(fileobj)) from None 
ValueError: Invalid file object: <_io.BufferedReader name=6> 

私の設定が不正な形式ですか?私はしばらくの間このエラーのためのGoogleを捜したが、アニメーション/ ffmpegに関連するものは決して見つけられなかった。どんな助けでも大歓迎です。


UPDATE:

@LordNeckBeardはここに私を指摘:私はx264のエンコードの依存関係をインストールすると問題に走ったhttps://trac.ffmpeg.org/wiki/CompilationGuide/Centos

。いくつかのlibavcodec/*。c(make出力)のファイルは、いくつかの関数への未定義の参照を報告していました。野生のガチョウの追跡は、この発見後:https://mailman.videolan.org/pipermail/x264-devel/2015-February/010971.html

x264のインストールを修正するには、私は単にいくつかのconfigureフラグを追加しました:

./configure --enable-static --enable-shared --extra-ldflags="-lswresample -llzma" 

UPDATE:

だからすべてがlibx264を固定した後罰金インストール問題。私は先に進み、ffmpegバイナリを ffmpeg_buildフォルダから /usr/local/bin/ffmpegにコピーしました。

スクリプトを実行した後、ffmpegがlibx264共有オブジェクトを見つけられなかった問題が発生しました。私は別の接頭辞を使ってすべてを再コンパイルする必要があると思う。私の直感は、壊れているいくつかの設定を使って、すべてを混乱させた後に古いファイルがあることを私に伝えます。

NUXを使ってみるといいかもしれません。http://linoxide.com/linux-how-to/install-ffmpeg-centos-7/ ffmpegは新しいrpmを使ってインストールしましたが、役に立たないと思います。私はまだ共有オブジェクトがないためにffmpegを実行できませんでした。

最後に、私の/usr/local/binフォルダにコピーされたusiongファイルの代わりに、ビルドbinディレクトリから直接ffmpegを実行しました。これは正しく動作することがわかります!

本質的には、ffmpegシステム全体をインストールする場合は、ソースから再度コンパイルする必要がありますが、ローカル以外のプレフィックスを使用する必要があります。

+0

私は、あなたが提供した出力に 'ffmpeg'という特定の情報を見ません。しかし、あなたはlibx264を使用しようとしていますが、ffmpeg configureにこのエンコーダでエンコードを有効にするために必要な '--enable-gpl --enable-libx264'がありません。 libx264をサポートしている 'ffmpeg'バイナリを(ダウンロードして)(https://johnvansickle.com/ffmpeg/)ダウンロードできます。 – LordNeckbeard

+0

私は、出力がffmpegとは何の関係もないので混乱していました。しかしバイナリへのリンクをありがとうございました。私はちょうどそれにリンクしようとしたと実際に動作します! 明日ffmpegを上記のフラグで再コンパイルしようとします。失敗した場合、ここで報告してください。助けてくれてありがとう! – spanishgum

答えて

2

私はあなたが提供した出力の具体的な情報ffmpegを見ません。 libx264を使用しようとしていますが、このエンコーダでエンコードを有効にするために必要なffmpeg configureには--enable-gpl --enable-libx264がありません。 downloadffmpegバイナリのLinux、macOS、またはWindowsでlibx264をサポートしている場合は、スクリプトを指定してください。

また、上記の設定オプションを使用してcompile ffmpegを使用してください。

+0

私は今日ffmpegを再コンパイルしようとしましたが、新たな問題が発生しました。ダウンロードしたバイナリを破ってしまいました。 とにかく、システムにx264をインストールできませんでした。私はリポジトリを持っていないし、gitソースからコンパイルしようとすると、libavcodecのソースコードで一連の未定義参照エラーが発生する。 完全な解決策を見つけたら更新されます...うまくいけば – spanishgum

+0

@spanishgum代わりにコンパイルするバイナリをダウンロードしてください。回答のリンクを参照してください。 – LordNeckbeard

+0

ああ私はこれに戻って忘れてしまった!バイナリは私のために働いた、ありがとう。私は実際にすべてをコンパイルする方法を考え出してから数日を過ごしました。非常に複雑でしたが、その過程でサポートするライブラリについて少し学びました。 mplアニメーションライブラリには、私が決して考え出さなかった数フレームを追加するだけで、非常に奇妙な副作用があります。しかし、数百フレームのビデオを作ったときにうまくいきました。ビデオエンコーディングについて学ぶためにはまだまだたくさんあります。とにかく、もう一度ありがとう! – spanishgum

関連する問題