2011-12-26 192 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中有一個示例代碼,顯示如何進行此轉換。