2012-02-19 27 views
6

Uygulamamdaki cihaza ve ayarlara bağlı olarak, bir videoyu belirli bir video formatına dönüştürmek istiyorum. Örneğin, kullanıcının bir iPhone 4S'si varsa ve uygulamamda orta ayarları seçerse, işleme koyulmadan önce videoyu 540p'ye dönüştürmek istiyorum. Eğer yüksek seçerse o zaman ben 720p'ye dönüştürmek istiyorum.Bir videoyu objektif-c (iOS) olarak dönüştürmenin en iyi yolu nedir?

Video karesini çerçeveye göre okuyabilir, yeniden boyutlandırabilir ve diske kaydedebilirim ancak bu çok etkili görünmüyor. Video işleme kütüphanelerime besleyebileceğim bir videoyu dönüştürmenin en kolay ve hızlı yolu ne olurdu?

benim UIImagePickerController üzerinde Video Kalitesi ayarları kullanarak çalıştım ama Video 720p olarak çıkar UIImagePickerControllerQualityTypeIFrame960x540 olarak ayarlayın zaman (640x480 çalışıyor ama daha ayrıntılı olması gerekiyor) olarak bile çalışmıyor gibi görünüyor var.

+0

Eminim bunu biliyorsunuzdur ama donanım desteği olmadan kod dönüştürme en iyi fikir olmayabilir, pil. –

+0

Evet, biliyorum. Ön taraftaki kamera ile video kaydederken, UIImagePickerController kod çözücüsünü 560p'ye dönüştürebilirsiniz. Kütüphaneden seçilen videolar için çalışmaz. Benzer bir şey (yani kitaplığınızdaki herhangi bir video için aynı işlemi yapmak için doğrudan API çağrısı) arayın. – Michel

cevap

3

AVAssetExportSession'a bakmak isteyebilirsiniz, bu da videoları yeniden kodlamak için oldukça basit bir yöntemdir. Ben de donanım destekli mümkün AVFoundation geri kalanı gibi olduğunu düşünüyorum: Eğer çıkış boyutunu almak için garanti edilmez yüzden, zaten daha Video büyütmek asla

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

Not istek. Aşağıdaki kod ALAsset bir örneğini var varsayarak, ne istediğinizi için bir başlangıç ​​olabilir:

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

Örneğin, 720p için 540p ve AVAssetExportPreset1280x720 için AVAssetExportPreset960x540 bir kalite geçmek istemez.

+0

AVAssetExportSession'da çerçeve hızını ayarlamanın bir yolu var mı. Hangisini seçeceğime bağlı olarak farklı kare hızları elde ettiğime benziyor. Düşük seçersem 15 fps alıyorum ve 720p için 30p aldım. 60p'lik çekimlerimi korumak istiyorum ama 60 fps yapan herhangi bir ön ayar görünmüyor. – Michel

+0

@ user1219167: AVAssetExportSession'ın videoComposition özelliğiyle bunu yapabileceğinizi düşünmekteydim, ancak daha sonra karşılaştım: http://stackoverflow.com/questions/9725193/setting-avmutablecompositions-frameduration –

+0

Merhaba, VideoQuality UIImagePickerControllerQualityTypeIFrame960x540 (16: 9 en boy oranıyla) alan bir videonun bellek alanını azaltın mı? –

İlgili konular