2011-12-26 10 views
7

AVAssetReaderを使用してビデオファイルからフレームバッファを1つずつ取得していて、フレームで何らかの操作を行い、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

+0

これはまだ解決策を探しています – iOSPawan

+0

'loadValuesAsynchronouslyForKeys:completionHandler:'は 'AVMetaDataItem'のメソッドであり、' AVURLAsset'や 'AVAsset'ではありません。 'NSURL'オブジェクトが' nil'ではないことを確認できますか? – sho

答えて

4

複数のサブビデオでビデオを分割することは私の仕事でした。

フルビデオを1つの一時パスに保存するのではなく、何をしましたか。私はそのビデオを複数のサブビデオで分割し、それに応じてAVPlayerItemプロパティをAVPlayerに置き換えました。

これで機能はビデオストリーミングと同じように機能します。 :)

+0

はとても良い解決策のようです – Magnus

1

また、AVAssetReaderがCGImageに返すCMSampleBufferを変換し、UIImageViewにそれを表示して、フレームを元のビデオファイルから引き出したときにレンダリングすることもできます。

AVFoundation Programming Guideには、この変換方法を示すサンプルコードがあります。

関連する問題