2011-12-26 11 views
7

Otrzymuję bufor ramki jeden po drugim z pliku wideo przy użyciu AVAssetReader i wykonuję operację na ramce, a następnie zapisuję nową ramkę do pliku tymczasowego za pomocą AVAssetWritter. Teraz mam ścieżkę pliku tymczasowego, w której zapisuje się cała nowa klatka jeden po drugim. Czy istnieje sposób, aby odtworzyć wideo w ramach czasowych stale dodaje do pliku tymczasowego?Odtwórz wideo za pomocą AVPlayer

tutaj jest kod, aby odtworzyć film od ścieżki temp (gdzie jest ciągłe dodawanie ramki)

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

i kodu wewnątrz bloku nie działa.

+0

Szukasz swojej sugestii? – iOSPawan

+0

wciąż szuka rozwiązanie dla tego – iOSPawan

+0

Wygląda to 'loadValuesAsynchronouslyForKeys: completionHandler:' jest metodą na 'AVMetaDataItem', a nie' AVURLAsset' lub 'AVAsset'. Czy możesz potwierdzić, że obiekt 'NSURL' nie jest' nil'? – sho

Odpowiedz

4

Dzielenie wideo w wielu filmach podwiązkowych sprawdziło się u mnie.

Co zrobiłem zamiast zapisywania całego wideo w jednej ścieżce tymczasowej. Podzieliłem ten film wideo na wiele filmów podrzędnych, a następnie zmieniono odpowiednio wartość AVPlayerItem na AVPlayer.

Teraz funkcjonalność działa tak samo jak strumieniowanie wideo. :)

+0

brzmi jak bardzo dobre rozwiązanie – Magnus

1

Można również przekonwertować CMSampleBuffer, który AVAssetReader zwraca na obraz CGImage, a następnie UIImage i wyświetlać w UIImageView, aby renderować klatki podczas ich wyciągania z oryginalnego pliku wideo.

Istnieje przykład kodu wewnątrz AVFoundation Programming Guide, który pokazuje, jak wykonać tę konwersję.