2017-03-06 117 views
3

到目前爲止,我已經覆蓋了大量的地面試圖讓ffmpeg去,所以我可以製作一個timelapse視頻。如何正確啓用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) 

我發現here該顯式地設置的路徑的ffmpeg可能是必要的,所以我已將此添加到測試腳本的頂部:

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> 

是否有我的配置是格式不正確?我搜索了一段時間的谷歌這個錯誤,但從來沒有發現任何與動畫/ ffmpeg相關的東西。任何幫助將不勝感激。


UPDATE:

@LordNeckBeard指出我在這裏:https://trac.ffmpeg.org/wiki/CompilationGuide/Centos

我跑進與安裝的x264編碼依賴問題。 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_build文件夾複製ffmpeg二進制文件到/usr/local/bin/ffmpeg

運行腳本後,我得到了ffmpeg無法找到libx264共享對象的問題。我想我將不得不重新編譯使用不同前綴的所有內容。我的直覺告訴我有一些舊文件在我弄糟了所有東西之後就放棄了,使用了一些被破壞的配置。

所以我決定也許我應該嘗試使用NUX:http://linoxide.com/linux-how-to/install-ffmpeg-centos-7/ 我使用新的rpm安裝了ffmpeg,但無濟於事。由於缺少共享對象,我仍然無法運行ffmpeg。

最後,我沒有將文件複製到我的/usr/local/bin文件夾中,而是直接從build bin目錄運行ffmpeg。事實證明,這確實正常工作!因此,從本質上講,如果我想要安裝ffmpeg系統範圍,我需要再次手動從源編譯,但使用非本地前綴。

+0

我在您提供的輸出中看不到'ffmpeg'特定的信息;但是您嘗試使用libx264,但是您的ffmpeg configure缺少啓用此編碼器編碼所需的「--enable-gpl --enable-libx264」。你可以[下載](https://johnvansickle.com/ffmpeg/)一個支持libx264的'ffmpeg'二進制文件,然後將腳本指向它。 – LordNeckbeard

+0

我很困惑,爲什麼輸出與ffmpeg無關。不過非常感謝你的鏈接到二進制文件。我只是嘗試鏈接到它,它確實工作! 我打算嘗試使用所提到的標誌重新編譯ffmpeg,並在它們失敗/成功時返回此處。謝謝您的幫助! – spanishgum

回答

2

我在您提供的輸出中看不到ffmpeg的具體信息;但是您嘗試使用libx264,但是您的ffmpeg配置缺少--enable-gpl --enable-libx264,這是啓用此編碼器編碼所必需的。對於支持libx264的Linux,macOS或Windows,您可以使用download a ffmpeg二進制文件,然後將腳本指向它。

或者,compile ffmpeg使用上述配置選項。

+0

所以我今天嘗試重新編譯ffmpeg,但碰到一組新的問題,並在這樣做打破了我下載的二進制文件(我將重新下載,看看它是否能再次運行)。 不管怎樣,我無法在我的系統上安裝x264。我沒有回購它,當我嘗試從git源代碼編譯時,我在libavcodec下的源代碼中遇到了一系列未定義的引用錯誤。 當我找到一個完整的解決方案時會更新...希望 – spanishgum

+0

@spanishgum只需下載一個二進制文件,而不是編譯。請參閱答案中的鏈接。 – LordNeckbeard

+0

啊,我忘了回來了!二進制文件爲我工作,謝謝。在確定如何編譯所有內容之後,我確實花了幾天的時間。這是非常複雜的,但我在這個過程中瞭解了一些關於支持庫的知識。當我只添加幾幀時,mpl動畫庫有非常奇怪的副作用,我從來沒有想過。但是當我用幾百幀製作視頻時,它工作得很好。仍然有很多需要了解視頻編碼。無論如何,再次感謝! – spanishgum