« Matlabの代わりにDreampie上でpylab使い始め。覚書。 | トップページ | ゲームセンター嵐によるPythonで統計検定できるウェブサイト »

2011年4月24日 (日)

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」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック

この記事のトラックバックURL:
http://app.f.cocolog-nifty.com/t/trackback/1169291/39737002

この記事へのトラックバック一覧です: PyFFmpeg 2.1beta win32使い方メモ。:

« Matlabの代わりにDreampie上でpylab使い始め。覚書。 | トップページ | ゲームセンター嵐によるPythonで統計検定できるウェブサイト »

広告欄


やっつけタイムライン

広告欄

はてブ

人目の訪問です。

  • follow us in feedly

    かなり更新が不定期なため、RSSリーダーをオススメします。現在Feedlyに122人登録頂いています。多謝!RSSを表示

    ブログランキング用 にほんブログ村 IT技術ブログ Pythonへ ブログランキングならblogram






    Jenny Mayhem
2017年9月
          1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30

IT技術注目記事

無料ブログはココログ