2

У меня есть видеофайл, который я могу загрузить в AVAsset. Я хочу изменить скорость при воспроизведении этого видео и удвоить его скорость, чтобы, если видео было 10 секунд, оно ускорилось бы до 5 секунд.Как увеличить скорость видео при сохранении с помощью AVAssetExportSession

Вот код, который я пытаюсь использовать, может ли кто-нибудь сказать мне, где я буду не так?

Является ли продолжительность кадра собственностью, необходимой мне для достижения моей цели.

AVAsset *anAsset = self.moviePlayer.currentItem.asset; 


NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:anAsset]; 
if ([compatiblePresets containsObject:AVAssetExportPreset640x480]) { 
    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] 
              initWithAsset:anAsset presetName:AVAssetExportPreset640x480]; 
    // Implementation continues. 

    NSString *tmpStr = [[aclip selectedTakeUrl] stringByReplacingOccurrencesOfString:@".m4v" withString:@""]; 

    NSString *filePath = [NSString stringWithFormat:@"%@_applied.m4v", tmpStr]; 


    exportSession.outputURL = [NSURL fileURLWithPath:filePath]; 

    AVMutableVideoComposition *vidcomp = [AVMutableVideoComposition videoCompositionWithPropertiesOfAsset:anAsset]; 

    vidcomp.frameDuration = CMTimeMake(1, 24); 
    //self.moviePlayer.currentItem.videoComposition = vidcomp; 

    exportSession.videoComposition = vidcomp; 
    //exportSession.videoComposition.frameDuration = CMTimeMake(1, 50); 

    // what is the song URL before loading startRecordingViewController? 
    NSLog(@"From Save settgins Choose Song -Song URL : %@", exportSession.outputURL); 

    // NSLog(@"start time%f, end time %f", CMTimeGetSeconds(self.startTime),CMTimeGetSeconds(self.endTime)); 

    exportSession.outputFileType = AVFileTypeMPEG4; 

    //CMTimeRange range = CMTimeRangeMake(CMTimeMake(0.0, 1), CMTimeMake(diffTime/currentround,1)); 
    // startTime and endTime is the duration that we need to save. 
    //exportSession.timeRange = range; 


    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 

     switch ([exportSession status]) { 
      case AVAssetExportSessionStatusCompleted: 
       NSLog(@"Export Completed"); 

       break; 
      case AVAssetExportSessionStatusWaiting: 
       NSLog(@"Export Waiting"); 
       break; 
      case AVAssetExportSessionStatusExporting: 
       NSLog(@"Export Exporting"); 
       break; 
      case AVAssetExportSessionStatusFailed: 
      { 
       NSError *error = [exportSession error]; 
       NSLog(@"Export failed: %@", [error localizedDescription]); 

       break; 
      } 
      case AVAssetExportSessionStatusCancelled: 
       NSLog(@"Export canceled"); 

       break; 
      default: 
       break; 
     } 

     dispatch_async(dispatch_get_main_queue(), ^{ 

      //[activityIndicator stopAnimating]; 

      //CMTime range = CMTimeSubtract(self.endTime, self.startTime); 
      //NSUInteger theLength = (int)CMTimeGetSeconds(range); 

      //[ self.songPickedDelegate songPickerDidMakeSelection:self.songTitle :self.audioPath :theLength]; 





     }); 

     //[exportSession release]; 
    }]; 
} 

ответ

4

Вы можете использовать - [AVMutableCompositionTrack scaleTimeRange: toDuration:] в масштабе всего актива от 10 секунд до 5 секунд. Свойство frameDuration будет просто выполнять преобразование частоты кадров.

+0

уже сделано спасибо – Jatin

+0

@ user3196356 У вас есть пример этого? для этого мало примеров, и чтение документов, похоже, не помогает. Если необходимо, дайте мне знать, и я поделюсь своим кодом, но он не работает вообще, поэтому нет смысла –

+0

@PranoyC использовать этот код для запуска https://developer.apple.com/library/content/samplecode/AVSimpleEditoriOS/Introduction /Intro.html – thedeveloper3124