PyFFmpeg 2.1beta win32使い方メモ。
Pymediaは古いし、PygletでAVbin経由でビデオを開くと、シークが大雑把にしかできない問題がある。PyffmpegはffmpegのDLLへのラッパーなので正確なフレーム単位でのシークも可能で動作も速い。問題はドキュメンテーションが全くないところ。DLLを直接Cから叩いている人ならきっと分かるのだろうが、ffmpegのドキュメンテーションを丁寧によまないと各メソッドの正確な違いとかはわからないだろう。でも、簡単なことをするのは適当にいじっているとわかるし、多少はサンプルも配布されているので、それらを参考にすると問題ない。
使い方メモ。
取りあえずPython Image Library(PIL)をつかって読み込んだフレームを表示してみるテスト。PILに対応したメソッドはpyffmpeg.VideoStream。
import pyffmpeg
fname = r'C:\projects\test\movie.avi'
stream = pyffmpeg.VideoStream()
stream.open(fname)
nth_frame = 0
frame = stream.GetFrameNo(nth_frame)
frame.show()
streamの下にある
'GetCurrentFrame'
'GetFrameNo',
'GetFramePts',
'GetNextFrame'
はPILのイメージとしてフレームを取ってくるので、show()で内容の確認ができる。
PILを自分でインポートする必要はないが、パソコンにインストールされている必要はある。
次は、FFMpegReaderでフレームをNumpy ArrayとしてGetする場合。ついでにビデオの総フレーム数とビデオレートからビデオの長さを秒数で計算してみる。streamの下のtvにも似たようなメソッドがあるが、どう違うのかはよくわからない。PIL同様にnumpyは自分でimportしなくともよい。またimport numpy as npしても大丈夫。
import pyffmpeg
fname = r'C:\projects\test\movie.avi'
mp=pyffmpeg.FFMpegReader()
mp.open(fname, pyffmpeg.TS_VIDEO)
tracks=mp.get_tracks()[0]
frame = tracks.get_current_frame()[2]
numer_of_frame = tracks.duration()
frame_rate = tracks.get_base_freq()
video_duration = numer_of_frame / frame_rate
dir(tracks) とすると利用可能なメソッドが出てくる。
'check_end',
'check_start',
'close',
'duration',
'duration_time',
'get_base_freq',
'get_cur_pts',
'get_current_frame',
'get_current_frame_frameno',
'get_current_frame_pts',
'get_current_frame_type',
'get_fps',
'get_next_frame',
'get_no',
'get_orig_size',
'get_size',
'init',
'on_frame_finished',
'prefill_videobank',
'prepare_to_read_ahead',
'print_buffer_stats',
'refill_videobank',
'reset_buffers',
'safe_smallest_videobank_time',
'seek_to_frame',
'seek_to_pts',
'seek_to_seconds',
'set_hurry',
'set_observer',
'smallest_videobank_time'
tracks.get_current_frame()
を今回は使ったが、
tracks.get_next_frame()
の方が速いので、できるだけこちらを使うようにコーディングした方がよい。
シークはseek_to_frameとかseek_to_secondsあたりでできる。
現在のFrameの番号を得るにはget_current_frame_frameno。
durationだと全フレーム数。
duration_timeがよくわからん。全フレーム数を10の6乗で割った数になる。
get_base_freqでもget_fpsでもフレームレートが得られる。違いは不明。
mpから使えるメソッドはtracksから使えるのとかなりダブっているがmpから使うと多分複数のビデオを開いたときに全部に影響すると思われる(未確認)。
« Matlabの代わりにDreampie上でpylab使い始め。覚書。 | トップページ | ゲームセンター嵐によるPythonで統計検定できるウェブサイト »
「Python」カテゴリの記事
- Noteの記事をPythonでバックアップしといた。(2021.05.05)
- JupyterLabでも好きな外部エディターを使いたい!(2018.05.02)
- ローカルエリア内のJupyterLabサーバーにLAN経由で接続する。(2018.05.02)
- Juliaやってみよう。五日目。Pythonと速度比較。(2017.08.01)
- Juliaやってみよう。四日目。@timeでプロファイリング(2017.07.16)
« Matlabの代わりにDreampie上でpylab使い始め。覚書。 | トップページ | ゲームセンター嵐によるPythonで統計検定できるウェブサイト »



コメント