2012-02-19 13 views
6

Chciałbym, w zależności od urządzenia i ustawień w mojej aplikacji, transkodować wideo do określonego formatu wideo. Na przykład, jeśli użytkownik ma iPhone'a 4S i wybiera średnie ustawienia w mojej aplikacji, chciałbym przekonwertować wideo na 540p przed rozpoczęciem przetwarzania. Jeśli wybierze wysoką, chciałbym transkodować do 720p.Jaki jest najlepszy sposób na transkodowanie wideo w układzie c-cel (iOS)?

Mogłem czytać klatkę po klatce, zmieniać rozmiar i zapisywać na dysku, ale to nie wydaje się bardzo skuteczne. Jaki byłby najprostszy i najszybszy sposób transkodowania pliku wideo, który można przesłać do moich bibliotek przetwarzania wideo?

Próbowałem użyć ustawień wideoQuality na moim UIImagePickerController, ale wygląda na to, że nie działa on tak samo, gdy ustawię go na UIImagePickerControllerQualityTypeFrame960x540 mój film wychodzi jako 720p (640x480 działa, ale muszę być bardziej ziarnisty).

+0

Jestem pewien, że wiesz o tym, ale transkodowanie bez wsparcia sprzętowego może nie być najlepszym pomysłem, jeśli chodzi o baterie. –

+0

Tak, wiem. Podczas nagrywania wideo z przednią kamerą można uzyskać transkodowanie UIImagePickerController do 560p, co robi się naprawdę szybko. Nie działa w przypadku filmów wybranych z biblioteki. Poszukuje czegoś podobnego (tj. Bezpośredniego wywołania interfejsu API, aby zrobić to samo dla dowolnego pliku wideo w bibliotece). – Michel

Odpowiedz

3

Możesz chcieć spojrzeć na AVAssetExportSession, dzięki czemu można dość łatwo ponownie kodować wideo. Myślę, że to też sprzętowo obsługiwane, jeśli to możliwe jak reszta AVFoundation:

https://developer.apple.com/library/ios/#DOCUMENTATION/AudioVideo/Conceptual/AVFoundationPG/Articles/01_UsingAssets.html

Zauważ, że to nigdy nie będzie wideo większe niż już jest, więc nie są gwarantowane, aby uzyskać rozmiar pliku wyjściowego żądanie. Poniższy kod może być początek tego, co chcesz, zakładając, że masz instancję ALAsset:

- (void)transcodeLibraryVideo:(ALAsset *)libraryAsset 
     toURL:(NSURL *)fileURL 
     withQuality:(NSString *quality) { 
    // get a video asset for the original video file 
    AVAsset *asset = [AVAsset assetWithURL: 
    [NSURL URLWithString: 
     [NSString stringWithFormat:@"%@", 
     [[libraryAsset defaultRepresentation] url]]]]; 
    // see if it's possible to export at the requested quality 
    NSArray *compatiblePresets = [AVAssetExportSession 
    exportPresetsCompatibleWithAsset:asset]; 
    if ([compatiblePresets containsObject:quality]) { 
    // set up the export 
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] 
     initWithAsset:asset presetName:quality]; 
    exportSession.outputURL = fileURL; 
    exportSession.outputFileType = AVFileTypeQuickTimeMovie; 
    // run the export 
    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
     switch ([exportSession status]) { 
     case AVAssetExportSessionStatusFailed: 
      //TODO: warn of failure 
      break; 
     case AVAssetExportSessionStatusCancelled: 
      //TODO: warn of cancellation 
      break; 
     default: 
      //TODO: do whatever is next 
      break; 
     } 
     [exportSession release]; 
    }]; 
    } 
    else { 
    //TODO: warn that the requested quality is not available 
    } 
} 

co chcesz przekazać jakość AVAssetExportPreset960x540 dla 540P i AVAssetExportPreset1280x720 do 720p, na przykład.

+0

Czy istnieje sposób ustawienia framerate na AVAssetExportSession. Wygląda na to, że otrzymuję różne szybkości klatek w zależności od tego, które wybiorę. Jeśli wybiorę niski, otrzymam 15 fps, a 720p otrzymam 30p. Chcę zachować moje nagranie 60 pensów, ale nie wydaje mi się, żeby było jakieś ustawienie, które daje 60fps. – Michel

+0

@ user1219167: Pomyślałem, że możesz to zrobić z właściwością videoComposition AVAssetExportSession, ale wtedy natknąłem się na to: http://stackoverflow.com/questions/9725193/setting-avmutablecompositions-frameduration –

+0

Witam, czy możemy zmniejszyć ilość pamięci, jaką ma wideo z videoQuality UIImagePickerControllerQualityTypeFrame960x540 (ze współczynnikiem kształtu 16: 9)? –

Powiązane problemy