Воспроизвести видео с помощью AVPlayer - PullRequest
7 голосов
/ 26 декабря 2011

Я получаю буфер кадров один за другим из видеофайла, используя AVAssetReader, и выполняю некоторую операцию с кадром, а затем сохраняю новый кадр во временный файл, используя AVAssetWritter. Теперь у меня есть путь к временному файлу, в котором сохраняется весь новый кадр по одному. Есть ли способ воспроизвести видео, когда кадры постоянно добавляются во временный файл ??

вот код для воспроизведения видео с временного пути (где кадры постоянно добавляются)

- (void)loadAssetFromFile {

    AVURLAsset *asset = [AVURLAsset URLAssetWithURL:[NSURL fileURLWithPath:[(mMediaReader.mCameraRecorder) tempVideoFilePath ]] options:nil];
    NSString *tracksKey = @"tracks";

    [asset loadValuesAsynchronouslyForKeys:[NSArray arrayWithObject:tracksKey] completionHandler:
     ^{

         // Completion handler block.
         dispatch_async(dispatch_get_main_queue(),
                        ^{
                            NSError *error = nil;
                            AVKeyValueStatus status = [asset statusOfValueForKey:tracksKey error:&error];

                            if (status == AVKeyValueStatusLoaded) {
                                self.mPlayerItem = [AVPlayerItem playerItemWithAsset:asset];
                                [mPlayerItem addObserver:self forKeyPath:@"status"
                                                options:0 context:&ItemStatusContext];
                                [[NSNotificationCenter defaultCenter] addObserver:self
                                                                         selector:@selector(playerItemDidReachEnd:)
                                                                             name:AVPlayerItemDidPlayToEndTimeNotification
                                                                           object:mPlayerItem];
                               self.mPlayer = [AVPlayer playerWithPlayerItem:mPlayerItem];
                                [mPlayerView setPlayer:mPlayer];
                                [self play:nil];
                            }
                            else {
                                // You should deal with the error appropriately.
                                NSLog(@"The asset's tracks were not loaded:\n%@", [error localizedDescription]);
                            }
                        });
     }];
}

- (IBAction)play:sender {
    [mPlayer play];
}

И код внутри блока никогда не запускается.

Ответы [ 2 ]

4 голосов
/ 30 декабря 2011

Разделение видео на несколько вспомогательных видео сработало для меня.

То, что я сделал вместо сохранения полного видео в одном временном пути. Я разделил это видео на несколько вспомогательных видео, а затем заменил AVPlayerItem свойство AVPlayer соответственно.

Так что теперь функциональность работает так же, как потоковое видео. :)

1 голос
/ 04 января 2012

Вы также можете преобразовать CMSampleBuffer, который AVAssetReader возвращает в CGImage, а затем UIImage, и отобразить его в UIImageView, чтобы визуализировать кадры, когда они извлекаются из исходного видеофайла.

Пример кода приведен в Руководстве по программированию AVFoundation , в котором показано, как выполнить это преобразование.

...