2011-12-26 221 views
7

我使用AVAssetReader从视频文件逐个获取帧缓冲区,然后在帧上执行一些操作,然后使用AVAssetWritter将新帧保存到临时文件。现在我有临时文件路径,其中保存了所有新帧逐个。 有没有什么方法可以在时间帧上播放视频不断添加到临时文件?使用AVPlayer播放视频

这里是代码从临时路径播放视频(如肋骨不断增加)

- (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]; 
} 

和代码从未运行块内。

+0

寻找你的建议? – iOSPawan 2011-12-27 05:34:41

+0

仍在为此寻求解决方案 – iOSPawan 2011-12-27 09:51:27

+0

它看起来像'loadValuesAsynchronouslyForKeys:completionHandler:'是'AVMetaDataItem'上的方法,而不是'AVURLAsset'或'AVAsset'。你能确认'NSURL'对象不是'nil'吗? – sho 2011-12-29 21:41:57

回答

4

将视频分成多个子视频为我工作。

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

所以现在功能与视频流相同。 :)

+0

听起来像是一个非常好的解决方案 – Magnus 2012-01-03 23:37:58

1

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

AVFoundation Programming Guide中有一个示例代码,显示如何进行此转换。