How to trim the video file and convert to 15 seconds video with iOS SDK?

前端 未结 2 836
独厮守ぢ
独厮守ぢ 2020-12-15 12:40

I want to trim a video file. I want to just pick the video from a gallery and convert it to a 15-second video. If I use normal trimming with picker view controller, it does

相关标签:
2条回答
  • 2020-12-15 12:54

    The above answer worked for me with a little change in case we need to set both start time and end time to trim.

    I changed this:

    CMTime start = CMTimeMakeWithSeconds(1.0, 600); // you will modify time range here
    CMTime duration = CMTimeMakeWithSeconds(15.0, 600);
    CMTimeRange range = CMTimeRangeMake(start, duration);
    

    To this:

    CMTime start = CMTimeMakeWithSeconds(self.StartTime, 600); // you will modify time range here
        CMTime duration = CMTimeSubtract(CMTimeMakeWithSeconds(self.EndTime, 600), start);
        CMTimeRange range = CMTimeRangeMake(start, duration);
    

    It worked for me.

    0 讨论(0)
  • 2020-12-15 13:03

    Objective-C

    -(void)cropVideo:(NSURL*)videoToTrimURL{
        AVURLAsset *asset = [AVURLAsset URLAssetWithURL:videoToTrimURL options:nil];
        AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:asset presetName:AVAssetExportPresetHighestQuality];
    
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *outputURL = paths[0];
        NSFileManager *manager = [NSFileManager defaultManager];
        [manager createDirectoryAtPath:outputURL withIntermediateDirectories:YES attributes:nil error:nil];
        outputURL = [outputURL stringByAppendingPathComponent:@"output.mp4"];
        // Remove Existing File
        [manager removeItemAtPath:outputURL error:nil];
    
    
        exportSession.outputURL = [NSURL fileURLWithPath:outputURL];
        exportSession.shouldOptimizeForNetworkUse = YES;
        exportSession.outputFileType = AVFileTypeQuickTimeMovie;
        CMTime start = CMTimeMakeWithSeconds(1.0, 600); // you will modify time range here
        CMTime duration = CMTimeMakeWithSeconds(15.0, 600);
        CMTimeRange range = CMTimeRangeMake(start, duration);
        exportSession.timeRange = range;
        [exportSession exportAsynchronouslyWithCompletionHandler:^(void)
         {
             switch (exportSession.status) {
                 case AVAssetExportSessionStatusCompleted:
                     [self writeVideoToPhotoLibrary:[NSURL fileURLWithPath:outputURL]];
                     NSLog(@"Export Complete %d %@", exportSession.status, exportSession.error);
                     break;
                 case AVAssetExportSessionStatusFailed:
                     NSLog(@"Failed:%@",exportSession.error);
                     break;
                 case AVAssetExportSessionStatusCancelled:
                     NSLog(@"Canceled:%@",exportSession.error);
                     break;
                 default:
                     break;
             }
    
             //[exportSession release];
         }];
    }
    

    In Swift 4.0

        static func cropVideo(atURL url:URL) {
        let asset = AVURLAsset(url: url)
        let exportSession = AVAssetExportSession.init(asset: asset, presetName: AVAssetExportPresetHighestQuality)!
        var outputURL = URL(string:NSSearchPathForDirectoriesInDomains(FileManager.SearchPathDirectory.documentDirectory, FileManager.SearchPathDomainMask.userDomainMask, true).last!)
    
        let fileManager = FileManager.default
        do {
            try fileManager.createDirectory(at: outputURL!, withIntermediateDirectories: true, attributes: nil)
        } catch {
    
        }
    
        outputURL?.appendPathComponent("output.mp4")
        // Remove existing file
        do {
            try fileManager.removeItem(at: outputURL!)
        }
        catch {
    
        }
    
        exportSession.outputURL = outputURL
        exportSession.shouldOptimizeForNetworkUse = true
        exportSession.outputFileType = AVFileTypeQuickTimeMovie
        let start = CMTimeMakeWithSeconds(1.0, 600) // you will modify time range here
        let duration = CMTimeMakeWithSeconds(15.0, 600)
        let range = CMTimeRangeMake(start, duration)
        exportSession.timeRange = range
        exportSession.exportAsynchronously {
            switch(exportSession.status) {
            case .completed: break
                //
            case .failed: break
                //
            case .cancelled: break
                //
            default: break
            }
        }
    }
    
    0 讨论(0)
提交回复
热议问题