Зацикливание видео с AVFoundation AVPlayer? - PullRequest
136 голосов
/ 19 марта 2011

Есть ли относительно простой способ зацикливания видео в AVFoundation?

Я создал свой AVPlayer и AVPlayerLayer примерно так:

avPlayer = [[AVPlayer playerWithURL:videoUrl] retain];
avPlayerLayer = [[AVPlayerLayer playerLayerWithPlayer:avPlayer] retain];

avPlayerLayer.frame = contentView.layer.bounds;
[contentView.layer addSublayer: avPlayerLayer];

и затем я проигрываю видео с:

[avPlayer play];

Видео воспроизводится нормально, но останавливается в конце. С MPMoviePlayerController все, что вам нужно сделать, это установить для его свойства repeatMode правильное значение. Похоже, что в AVPlayer подобного свойства нет. Также, кажется, нет обратного вызова, который сообщит мне, когда фильм закончится, так что я могу вернуться к началу и воспроизвести его снова.

Я не использую MPMoviePlayerController, потому что он имеет некоторые серьезные ограничения. Я хочу иметь возможность воспроизводить несколько видеопотоков одновременно.

Ответы [ 16 ]

0 голосов
/ 02 мая 2018

Я сделал так, чтобы он воспроизводился в цикле, как показано ниже:

[player addPeriodicTimeObserverForInterval:CMTimeMake(1.0, 1.0)
queue:dispatch_get_main_queue() usingBlock:^(CMTime time) {
    float current = CMTimeGetSeconds(time);
    float total = CMTimeGetSeconds([playerItem duration]);
    if (current >= total) {
        [[self.player currentItem] seekToTime:kCMTimeZero];
        [self.player play];
    }
}];
0 голосов
/ 22 августа 2017

мое решение в target-c с AVQueuePlayer - похоже, вам нужно продублировать AVPlayerItem и по окончании воспроизведения первого элемента немедленно добавить еще одну копию.«Вид» имеет смысл и работает для меня без каких-либо отклонений

NSURL *videoLoopUrl; 
// as [[NSBundle mainBundle] URLForResource:@"assets/yourVideo" withExtension:@"mp4"]];
AVQueuePlayer *_loopVideoPlayer;

+(void) nextVideoInstance:(NSNotification*)notif
{
 AVPlayerItem *currItem = [AVPlayerItem playerItemWithURL: videoLoopUrl];

[[NSNotificationCenter defaultCenter] addObserver:self
                                      selector:@selector(nextVideoInstance:)
                                      name:AVPlayerItemDidPlayToEndTimeNotification
                                      object: currItem];

 [_loopVideoPlayer insertItem:currItem afterItem:nil];
 [_loopVideoPlayer advanceToNextItem];

}

+(void) initVideoPlayer {
 videoCopy1 = [AVPlayerItem playerItemWithURL: videoLoopUrl];
 videoCopy2 = [AVPlayerItem playerItemWithURL: videoLoopUrl];
 NSArray <AVPlayerItem *> *dummyArray = [NSArray arrayWithObjects: videoCopy1, videoCopy2, nil];
 _loopVideoPlayer = [AVQueuePlayer queuePlayerWithItems: dummyArray];

 [[NSNotificationCenter defaultCenter] addObserver: self
                                      selector: @selector(nextVideoInstance:)
                                      name: AVPlayerItemDidPlayToEndTimeNotification
                                      object: videoCopy1];

 [[NSNotificationCenter defaultCenter] addObserver: self
                                      selector: @selector(nextVideoInstance:)
                                      name: AVPlayerItemDidPlayToEndTimeNotification
                                      object: videoCopy2];
}

https://gist.github.com/neonm3/06c3b5c911fdd3ca7c7800dccf7202ad

0 голосов
/ 29 июня 2017

Вы можете добавить наблюдателя AVPlayerItemDidPlayToEndTimeNotification и воспроизвести видео с самого начала в селекторе, код как показано ниже

 //add observer
[[NSNotificationCenter defaultCenter] addObserver:self                                                 selector:@selector(playbackFinished:)                                                     name:AVPlayerItemDidPlayToEndTimeNotification
object:_aniPlayer.currentItem];

-(void)playbackFinished:(NSNotification *)notification{
    [_aniPlayer seekToTime:CMTimeMake(0, 1)];//replay from start
    [_aniPlayer play];
}
0 голосов
/ 03 мая 2016

используйте AVPlayerViewController ниже кода, его работа для меня

        let type : String! = "mp4"
        let targetURL : String? = NSBundle.mainBundle().pathForResource("Official Apple MacBook Air Video   YouTube", ofType: "mp4")

        let videoURL = NSURL(fileURLWithPath:targetURL!)


        let player = AVPlayer(URL: videoURL)
        let playerController = AVPlayerViewController()

        playerController.player = player
        self.addChildViewController(playerController)
        self.playView.addSubview(playerController.view)
        playerController.view.frame = playView.bounds

        player.play()

Все элементы управления, которые будут показаны, надеюсь, это полезно

0 голосов
/ 26 января 2016

После загрузки видео в AVPlayer (конечно, через его AVPlayerItem):

 [self addDidPlayToEndTimeNotificationForPlayerItem:item];

Метод addDidPlayToEndTimeNotificationForPlayerItem:

- (void)addDidPlayToEndTimeNotificationForPlayerItem:(AVPlayerItem *)item
{
    if (_notificationToken)
        _notificationToken = nil;

    /*
     Setting actionAtItemEnd to None prevents the movie from getting paused at item end. A very simplistic, and not gapless, looped playback.
     */
    _player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
    _notificationToken = [[NSNotificationCenter defaultCenter] addObserverForName:AVPlayerItemDidPlayToEndTimeNotification object:item queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification *note) {
        // Simple item playback rewind.
        [[_player currentItem] seekToTime:kCMTimeZero];
    }];
}

В вашем представлении методWillDisappear:

if (_notificationToken) {
        [[NSNotificationCenter defaultCenter] removeObserver:_notificationToken name:AVPlayerItemDidPlayToEndTimeNotification object:_player.currentItem];
        _notificationToken = nil;
    }

В объявлении интерфейса вашего контроллера представления в файле реализации:

id _notificationToken;

Вам нужно увидеть это и запустить, прежде чем пытаться?Загрузите и запустите этот пример приложения:

https://developer.apple.com/library/prerelease/ios/samplecode/AVBasicVideoOutput/Listings/AVBasicVideoOutput_APLViewController_m.html#//apple_ref/doc/uid/DTS40013109-AVBasicVideoOutput_APLViewController_m-DontLinkElementID_8

В моем приложении, использующем именно этот код, между концом видео и началом нет никакой паузы.На самом деле, в зависимости от видео, я не могу сказать, что видео снова в начале, сохранить отображение временного кода.

0 голосов
/ 23 апреля 2015
/* "numberOfLoops" is the number of times that the sound will return to the beginning upon reaching the end. 
A value of zero means to play the sound just once.
A value of one will result in playing the sound twice, and so on..
Any negative number will loop indefinitely until stopped.
*/
@property NSInteger numberOfLoops;

Это свойство уже определено внутри AVAudioPlayer. Надеюсь, это поможет вам. Я использую Xcode 6.3.

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