2012-02-19 1 views
6

Mi piacerebbe, a seconda del dispositivo e delle impostazioni della mia applicazione, transcodificare un video in un formato video specifico. Ad esempio, se l'utente ha un iPhone 4S e sceglie le impostazioni medie nella mia applicazione, vorrei convertire il video in 540p prima di iniziare l'elaborazione. Se sceglie high, mi piacerebbe transcodificare a 720p.Qual è il modo migliore per transcodificare un video in ogg-c (iOS)?

Potrei leggere il video fotogramma per fotogramma, ridimensionarlo e salvarlo su disco ma questo non sembra molto efficace. Quale sarebbe il modo più semplice e veloce per transcodificare un video che posso alimentare nelle mie librerie di elaborazione video?

Ho provato con le impostazioni videoQuality sul mio UIImagePickerController, ma sembra che non funziona come anche quando ho impostato a UIImagePickerControllerQualityTypeIFrame960x540 mio video viene fuori come 720p (640x480 sta lavorando, ma ho bisogno di essere più granulare).

+0

Sono sicuro che lo sai, ma la transcodifica senza supporto hardware potrebbe non essere la migliore idea, batteria. –

+0

Sì, lo so. Durante la registrazione di un video con la fotocamera frontale, è possibile eseguire la transcodifica UIImagePickerController su 560p, operazione che avviene molto rapidamente. Non funziona per i video selezionati dalla libreria. Alla ricerca di qualcosa di simile (ad esempio una chiamata API diretta per fare lo stesso per qualsiasi video nella tua libreria). – Michel

risposta

3

Si potrebbe voler vedere AVAssetExportSession, che rende ragionevolmente semplice ricodificare i video. Penso che sia anche supportata da hardware quando possibile, come il resto della AVFoundation:

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

Nota che non potrà mai fare il video più grande di quanto già non sia, quindi non sono garantiti per ottenere la dimensione di output richiesta. Il codice seguente potrebbe essere un inizio per ciò che si vuole, a patto di avere un esempio di 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 
    } 
} 

Si vorrebbe passare una qualità di AVAssetExportPreset960x540 per 540p e 720p per AVAssetExportPreset1280x720, per esempio.

+0

C'è un modo per impostare il framerate su AVAssetExportSession. Sembra che ottenga frame rate diversi a seconda di quale scelgo. Se scelgo basso ottengo 15 fps e per 720p ottengo 30p. Voglio mantenere il mio filmato a 60p, ma non sembra essere un preset che fa 60fps. – Michel

+0

@ user1219167: stavo pensando che potresti essere in grado di farlo con la proprietà videoComposition di AVAssetExportSession, ma poi ho trovato questo: http://stackoverflow.com/questions/9725193/setting-avmutablecompositions-frameduration –

+0

Ciao, possiamo Riduci lo spazio di memoria che richiede un video con videoQuality UIImagePickerControllerQualityTypeIFrame960x540 (con proporzioni 16: 9)? –