QTMovieのcurrentFrameImageを改善する
QTKitのQTMovieの
- (NSImage *)currentFrameImage; - (NSImage *)frameImageAtTime:(QTTime)time;
あたりは,使うたびにメモリリークする。数回呼ぶくらいならどうってことないけど,大量に呼ぶと大変なことに。
この問題を回避するには,QuickTimeのAPIを使わなければいけない??。
MovieとかGWorldとかよく分からないんだけど…。
とりあえず,いろいろ試行錯誤してできたのが,フレーム画像を大量に呼び出しても大丈夫なクラス。
でもなぜこれでいいのかは,謎(SetMovieGWorldすると,それが開放されないような?)。
@interface QTFastMovie : QTMovie { GWorldPtr gworld; } - (NSImage *)fastCurrentFrameImage; @end @implementation QTFastMovie - (GWorldPtr)offScreenGWorld { if(!gworld){ Rect srcRect; GetMovieBox([self quickTimeMovie],&srcRect); NewGWorld(&gworld, k32ARGBPixelFormat, &srcRect, NULL, NULL, 0); SetMovieGWorld([self quickTimeMovie], gworld,NULL); } return gworld; } - (NSImage *)fastCurrentFrameImage { Movie movie = [self quickTimeMovie]; GWorldPtr offscreen = [self offScreenGWorld]; MoviesTask(movie, 0); NSImage *image = imageFromGworld(offscreen); return image; } @end
imageFromGWorld()は,
HMDT > Cocoa Programming Tips 1001 > GWorldをNSImageに変換する
のもの。
でもTigerで使うと,いくつもDeprecatedって警告がでる。
Leopardでは,そもそもQTKitのメモリリークの問題がなおるのか,TigerからはCoreVideoを使えということなのか…?。