3

AVFoundationを実装するために使用していAVPlayerます。ビデオ クリップを連続してループさせたいので、AVPlayerItemDidPlayToEndTimeNotificationこのメソッドを呼び出すを登録します。

- (void)player1ItemDidReachEnd:(NSNotification *)notification
{ 
 dispatch_async(dispatch_get_main_queue(),
       ^{
        [player1 seekToTime:kCMTimeZero]; 
        [player1 play];
       });
}

時々動作しますが、おそらく の非同期完了が原因で、最終的に再生が停止しseekToTimeます。このコードを防弾にするにはどうすればよいですか?

4

4 に答える 4

5

AVPlayer の AVPlayerActionAtItemEnd プロパティを AVPlayerActionAtItemEndNone に設定することで、これを修正しました。デフォルトは AVPlayerActionAtItemEndPause でした。AVPlayer はクリップの最後で一時停止しなくなるため、再生を再開する必要はありません。また、seekToTime をメイン キューにディスパッチする必要がないこともわかりました。

于 2010-11-01T04:53:02.177 に答える
5
player.actionAtItemEnd = AVPlayerActionAtItemEndNone; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(playerItemDidReachEnd:)
name:AVPlayerItemDidPlayToEndTimeNotification object:[player currentItem]];

(void)playerItemDidReachEnd:(NSNotification *)notification {
AVPlayerItem *p = [notification object];
 [p seekToTime:kCMTimeZero];
}   
于 2011-05-02T10:51:55.253 に答える
0
- (void)playLogo {
NSString *path = [[NSBundle mainBundle] pathForResource:@"logo" 
                                                 ofType:@"m4v" 
                                            inDirectory:@"../Documents"];

self.myplayerItem = [AVPlayerItem playerItemWithURL:[NSURL fileURLWithPath:path]];
self.myplayer = [AVPlayer playerWithPlayerItem:self.myplayerItem];
[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerItemDidReachEnd:)
                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                           object:[self.myplayer currentItem]];
[videoView setPlayer:self.myplayer];
[videoView setAlpha:0.5f];
[self.myplayer play]; }

- (void)playerItemDidReachEnd:(NSNotification *)notification {
[videoView setAlpha:0.0f];
[[NSNotificationCenter defaultCenter] removeObserver:self 
                                                name:AVPlayerItemDidPlayToEndTimeNotification 
                                              object:[self.myplayer currentItem]];
[self playLogo];    }
于 2011-02-08T14:41:48.373 に答える
0

Controller.hに追加

AVPlayer *myplayer;

Controller.mに追加

#import <CoreMedia/CoreMedia.h>

[[NSNotificationCenter defaultCenter] addObserver:self
                                         selector:@selector(playerItemDidReachEnd:)
                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                           object:[myplayer currentItem]];
[myplayer play];

セレクターから機能を追加します

- (void)playerItemDidReachEnd:(NSNotification *)notification {
AVPlayerItem *playerItem = [notification object];
[playerItem seekToTime:kCMTimeZero];
[myplayer play];

}

これはビデオのループに役立ちますが、何らかの方法でキャッシュする必要があります(スムーズなループのために)

于 2011-02-07T05:36:31.157 に答える