使用AVPlayer播放视频

时间:2011-12-26 04:57:21

标签: iphone ios avplayer

我正在使用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 个答案:

答案 0 :(得分:4)

在多个子视频中划分视频对我有用。

我做了什么而不是在一个临时路径中保存完整视频。我在多个子视频中划分了该视频,然后相应地替换了AVPlayerItem AVPlayer属性。

所以现在功能与视频流一样。 :)

答案 1 :(得分:1)

您还可以将AVAssetReader返回的CMSampleBuffer转换为CGImage,然后转换为UIImage并在UIImageView中显示,以便在从原始视频文件中拉出帧时渲染帧。

AVFoundation Programming Guide中的示例代码显示了如何进行此转换。