itok's Lab

昔の開発ネタを記録として残してます

再生終了を検知する

動画や音声の再生終了を検知する。これもQuickTimeAPIをそのまま使うやり方と、QTKitを使ってCocoaのみのやり方が必要があります。

QuickTime API使用

呼び出し側。一応Objective-Cからの呼び出しってことで。

@implementation MyObject
...
{
...
    Movie qtmow = [nsmov QTMovie]; // NSMovieからの変換
    QTCallBackUPP qtCallBackUPP = NewQTCallBackUPP(s_movieDidFinished);
    TimeBase timeBase = GetMovieTimeBase(qtmov);
    // コールバックオブジェクト生成
    QTCallBack qtCallBack = NewCallBack(timeBase, callBackAtExtremes);
    if (qtCallBack != NULL) {
        // コールバック登録
        CallMeWhen(qtCallBack, 
            qtCallBackUPP, 
            (long)self,     /* refCon : 例えば自インスタンスを渡しておけば戻ってこれます */
            triggerAtStop,  /* flags : 終了時 */
            0,              /* param2 : 無視 */
            0);             /* param3 : 無視 */
    }
...
}
...
@end

で、呼び出され側。

// コールバック関数
static void s_movieDidFinished(QTCallBack callBack, long refcon) {
    // 例えばこれでObjective-Cクラスに戻ります
    [(MyObject*)refcon movieDidFinished:nil];
}

QTKit 使用 (要QuickTime7)

どうせObjective-Cから使うならこっちの方が楽です。NSNotificationの枠組みを使います。(教えていただいたSynさんありがとうございます)

{
...
    QTMovie* movie = [[QTMovie alloc] initWithURL:url error:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(movieDidEnd:) name:QTMovieDidEndNotification object:movie];
...
}

これだと呼び出され側もObjective-Cの枠組みですしね。

-(void) movieDidEnd:(NSNotification*)aNotification {
    // do something
}