Yusk's UseCase

プログラマの成れの果てTipsBlog

openFrameworks v007でFullHD動画の指定したフレームに移動する方法

先日に引き続き、oF v007のofQuickTimePlayerでFullHD動画を触る話。
環境は前回と同じ(OS X 10.8.2/xcode 4.5.2/OS X SDK 10.6)。


ofQuickTimePlayer::setFrame(int)は、指定したフレームに移動するためのメンバ関数だが、これもまた640x480動画では動作するものの、FullHD動画では「error in MediaGetStaticFrameRate, ofQtUtils」と表示されて動作しない。
そこで、エラー元を辿ってみると、setFrame内で呼ばれている

MovieGetStaticFrameRate(Movie, double*)

がエラーを返していることがわかった。
次に、そのMovieGetStaticFrameRateを覗いてみると、MovieGetStaticFrameRate内のGetMediaDuration(Media)を呼んだ直後でエラーが発生していることが判明。

しかし、エラー元が判明したところで、GetMediaDuration(Media)周りのバグについて調べても、報告は上がっているものの、有効な解決策が見つからない。
途方に暮れていると、

ofQuickTimePlayer::setPosition(float)

というものがあることに気づいた。
setPosition(float)は、0.0f〜1.0fで動画のフレーム移動を行うことができるメソッド。しかも、setPosition(float)内では、GetMediaDuration(Movie)ではなくGetMovieDuration(Movie)を使っているため、正常な値が返ってくる(!)

ということで、FullHD動画でのフレームスキップは、ofQuickTimePlayer::setFrame(int)ではなく、ofQuickTimePlayer::setPosition(float)で実装する必要がある……ということでした。