How to do Slow Motion video in IOS

前端 未结 6 1344
小蘑菇
小蘑菇 2020-11-28 21:14

I have to do \"slow motion\" in a video file along with audio, in-between some frames and need to store the ramped video as a new video.

6条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-28 22:00

    I have achieved on adding slow motion to video including audio as well with proper output orientation.

     - (void)SlowMotion:(NSURL *)URl
     {
       AVURLAsset* videoAsset = [AVURLAsset URLAssetWithURL:URl options:nil]; //self.inputAsset;
    
    AVAsset *currentAsset = [AVAsset assetWithURL:URl];
    AVAssetTrack *vdoTrack = [[currentAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0];
    //create mutable composition
    AVMutableComposition *mixComposition = [AVMutableComposition composition];
    
    AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid];
    AVMutableCompositionTrack *compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
    
    NSError *videoInsertError = nil;
    BOOL videoInsertResult = [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
                                                            ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
                                                             atTime:kCMTimeZero
                                                              error:&videoInsertError];
    if (!videoInsertResult || nil != videoInsertError) {
        //handle error
        return;
    }
    
    NSError *audioInsertError =nil;
    BOOL audioInsertResult =[compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
                                                           ofTrack:[[currentAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
                                                            atTime:kCMTimeZero
                                                             error:&audioInsertError];
    
    if (!audioInsertResult || nil != audioInsertError) {
        //handle error
        return;
    }
    
    CMTime duration =kCMTimeZero;
    duration=CMTimeAdd(duration, currentAsset.duration);
    //slow down whole video by 2.0
    double videoScaleFactor = 2.0;
    CMTime videoDuration = videoAsset.duration;
    
    [compositionVideoTrack scaleTimeRange:CMTimeRangeMake(kCMTimeZero, videoDuration)
                               toDuration:CMTimeMake(videoDuration.value*videoScaleFactor, videoDuration.timescale)];
    [compositionAudioTrack scaleTimeRange:CMTimeRangeMake(kCMTimeZero, videoDuration)
                               toDuration:CMTimeMake(videoDuration.value*videoScaleFactor, videoDuration.timescale)];
    [compositionVideoTrack setPreferredTransform:vdoTrack.preferredTransform];
    
            NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
            NSString *docsDir = [dirPaths objectAtIndex:0];
            NSString *outputFilePath = [docsDir stringByAppendingPathComponent:[NSString stringWithFormat:@"slowMotion.mov"]];
            if ([[NSFileManager defaultManager] fileExistsAtPath:outputFilePath])
            [[NSFileManager defaultManager] removeItemAtPath:outputFilePath error:nil];
            NSURL *_filePath = [NSURL fileURLWithPath:outputFilePath];
    
    //export
    AVAssetExportSession* assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition
                                                                            presetName:AVAssetExportPresetLowQuality];
    assetExport.outputURL=_filePath;
                              assetExport.outputFileType =           AVFileTypeQuickTimeMovie;
      exporter.shouldOptimizeForNetworkUse = YES;
                               [assetExport exportAsynchronouslyWithCompletionHandler:^
                                {
    
                                    switch ([assetExport status]) {
                                        case AVAssetExportSessionStatusFailed:
                                        {
                                            NSLog(@"Export session faiied with error: %@", [assetExport error]);
                                            dispatch_async(dispatch_get_main_queue(), ^{
                                                // completion(nil);
                                            });
                                        }
                                            break;
                                        case AVAssetExportSessionStatusCompleted:
                                        {
    
                                            NSLog(@"Successful");
                                            NSURL *outputURL = assetExport.outputURL;
    
                                            ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
                                            if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:outputURL]) {
    
                                                [self writeExportedVideoToAssetsLibrary:outputURL];
                                            }
                                            dispatch_async(dispatch_get_main_queue(), ^{
                                                //                                            completion(_filePath);
                                            });
    
                                        }
                                            break;
                                        default:
    
                                            break;
                                    }
    
    
                                }];
    
    
     }
    
      - (void)writeExportedVideoToAssetsLibrary :(NSURL *)url {
    NSURL *exportURL = url;
    ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init];
    if ([library videoAtPathIsCompatibleWithSavedPhotosAlbum:exportURL]) {
        [library writeVideoAtPathToSavedPhotosAlbum:exportURL completionBlock:^(NSURL *assetURL, NSError *error){
            dispatch_async(dispatch_get_main_queue(), ^{
                if (error) {
                    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:[error localizedDescription]
                                                                        message:[error localizedRecoverySuggestion]
                                                                       delegate:nil
                                                              cancelButtonTitle:@"OK"
                                                              otherButtonTitles:nil];
                    [alertView show];
                }
                if(!error)
                {
                   // [activityView setHidden:YES];
                    UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Sucess"
                                                                        message:@"video added to gallery successfully"
                                                                       delegate:nil
                                                              cancelButtonTitle:@"OK"
                                                              otherButtonTitles:nil];
                    [alertView show];
                }
     #if !TARGET_IPHONE_SIMULATOR
                [[NSFileManager defaultManager] removeItemAtURL:exportURL error:nil];
    #endif
            });
        }];
    } else {
        NSLog(@"Video could not be exported to assets library.");
    }
    
    }
    

提交回复
热议问题