Как лучше всего перекодировать видео в target-c (iOS)? - PullRequest
6 голосов
/ 19 февраля 2012

Я хотел бы, в зависимости от устройства и настроек в моем приложении, транскодировать видео в определенный формат видео.Например, если у пользователя iPhone 4S и он выбирает средние настройки в моем приложении, я хотел бы преобразовать видео в 540p перед началом обработки.Если он выберет высокий, то я бы хотел перекодировать в 720p.

Я мог бы читать видео кадр за кадром, изменять размер и сохранять на диск, но это не очень эффективно.Какой самый простой и быстрый способ перекодировать видео, которое я могу передать в мои библиотеки обработки видео?

Я пытался использовать настройки videoQuality на моем UIImagePickerController, но, похоже, он не работает, даже когда я установилэто UIImagePickerControllerQualityTypeIFrame960x540 мое видео получается в формате 720p (640x480 работает, но мне нужно быть более детальным).

1 Ответ

3 голосов
/ 14 марта 2012

Возможно, вы захотите взглянуть на AVAssetExportSession, который позволяет достаточно просто перекодировать видео. Я думаю, что это также поддерживается аппаратно, когда это возможно, как и остальные AVFoundation:

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

Обратите внимание, что видео никогда не будет больше, чем сейчас, поэтому вы не гарантированно получите требуемый размер вывода. Следующий код может быть началом того, что вы хотите, при условии, что у вас есть экземпляр 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
  }
}

Например, вы хотите передать качество AVAssetExportPreset960x540 для 540p и AVAssetExportPreset1280x720 для 720p.

...