Yusk's UseCase

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

openFrameworks v007でFullHD動画の総フレーム数を取得する

openFrameworksは、非常にバージョンに厳しいフレームワーク(addon含む)で、最新版にアップデートする度に過去に作成したプログラムが何かしらの理由で動かなくなる。
というわけで、2012年12月現在oFの最新版はv0073だが、自分は未だにv007を使っている。
以下に書く内容は、v007で確認したもので、v0073では直っているかもしれないが、一応まとめておくことにする。
(ちなみに環境はOS X 10.8.2/xcode 4.5.2/OS X SDK 10.6)


日展示を行った作品で、動画をofQuickTimePlayerで読み込んでごにょごにょしていたのだが、最初640x480動画でテストして正常に動作していたプログラムが、いざFullHD動画にしたところ動かなくなった。
どこで問題が発生しているか根気よく探したところ、総フレーム数を取得しているofQuickTimePlayer::getTotalNumFrames()で、640x480では正確な値が返ってくるところが、FullHDだと必ず1が返ってくることに気がついた。
総フレーム数は、ofQuickTimePlayer::loadMovie(string)内の

while( curMovieTime >= 0 )
{
    nFrames++;
    GetMovieNextInterestingTime(moviePtr,flags,1,&whichMediaType,curMovieTime,0,&curMovieTime,&duration);
    flags = nextTimeMediaSample;
}
    nFrames--; // there's an extra time step at the end of themovie

で取得されているみたいだが、FullHD動画では、どうもうまく取得されないらしい。
H.264が問題だというサイトも見たが、640x480の動画もH.264圧縮したものなので、やはり解像度が問題?)

そこで、上記のプログラムの後に以下のコードを入れたところ、何とか正常値が返ってきた。

if(nFrames == 1)
{
    Media movieMedia;
    MediaHandler movieMediaHandler;
    MovieGetVideoMediaAndMediaHandler(moviePtr, &movieMedia, &movieMediaHandler);
    nFrames = GetMediaSampleCount(movieMedia);
}

完全に応急処置的な解決法だが、とりあえず現時点ではこれでよしとする。