Могу ли я проверить, когда IOS4 AVPlayer seekToTime завершится? - PullRequest
3 голосов
/ 01 ноября 2010

Я использую AVFoundation для реализации AVPlayer. Я хочу постоянно зацикливать видеоклип, поэтому я регистрирую AVPlayerItemDidPlayToEndTimeNotification для вызова этого метода:

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

Иногда он работает, но в конце концов воспроизведение останавливается, предположительно из-за асинхронного завершения seekToTime. Как я могу сделать этот код пуленепробиваемым?

Ответы [ 4 ]

5 голосов
/ 02 мая 2011
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];
}   
5 голосов
/ 01 ноября 2010

Теперь я исправил это, установив для свойства AVPlayerActionAtItemEnd AVPlayer значение AVPlayerActionAtItemEndNone - по умолчанию было AVPlayerActionAtItemEndPause. AVPlayer больше не делает паузу в конце клипа, поэтому воспроизведение не нужно перезапускать. Также обнаружено, что нет необходимости отправлять seekToTime в главную очередь.

0 голосов
/ 08 февраля 2011
- (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];    }
0 голосов
/ 07 февраля 2011

в 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];

}

Это поможет мне зациклить видео, но вам нужно его как-то кешировать (для плавного цикла)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...