5
votes

I'm trying to trim and download online video using AVExportSession.

code:

FileMove *fileMove = (FileMove*)data;
  NSString *url = @"http://download.wavetlan.com/SVV/Media/HTTP/H264/Talkinghead_Media/H264_test1_Talkinghead_mp4_480x360.mp4";
    NSURL *videoURL = [NSURL URLWithString:[url stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]];
    NSLog(@"VideoURL: %@",videoURL);


    AVAsset *anAsset = [AVURLAsset URLAssetWithURL:videoURL options:nil];    
    NSArray *compatiblePresets = [AVAssetExportSession exportPresetsCompatibleWithAsset:anAsset];
    if ([compatiblePresets containsObject:AVAssetExportPresetLowQuality]) {
        AVAssetExportSession *exportSession = [[AVAssetExportSession alloc]
                                               initWithAsset:anAsset presetName:AVAssetExportPresetLowQuality];
        NSURL *outputURL = [NSURL fileURLWithPath:fileMove.dst];
        NSLog(@"outputURL: %@",outputURL);
        exportSession.outputURL = outputURL;
        exportSession.outputFileType = AVFileTypeQuickTimeMovie;

        CMTime start = CMTimeMakeWithSeconds(1.0, 600);
        CMTime duration = CMTimeMakeWithSeconds(3.0, 600);
        CMTimeRange range = CMTimeRangeMake(start, duration);
        exportSession.timeRange = range;

        if ([[NSFileManager defaultManager] fileExistsAtPath:fileMove.dst])
            [[NSFileManager defaultManager] removeItemAtPath:fileMove.dst error:nil];

        [exportSession exportAsynchronouslyWithCompletionHandler:^{

            switch ([exportSession status]) {
                case AVAssetExportSessionStatusFailed:
                    NSLog(@"Export failed: %@", [[exportSession error]description ]);
                    break;
                case AVAssetExportSessionStatusCancelled:
                    NSLog(@"Export canceled");
                    break;
                default:
                    break;
            }
        }];
    }

Error:

Export failed: Error Domain=AVFoundationErrorDomain Code=-11800 "The operation could not be completed" UserInfo=0x635a820 {NSLocalizedDescription=The operation could not be completed, NSUnderlyingError=0x1ff4240 "The operation couldn’t be completed. (OSStatus error -12780.)", NSLocalizedFailureReason=An unknown error occurred (-12780)}

Do you guys see any issue in the code ? Is there any limitation in AVExportSession accessing online video ?

3

3 Answers

3
votes

I've managed to trim remote video using AVFoundation. Here is the sample code which is written in Swift:

let range: CMTimeRange
let sourceURL: NSURL
let targetFileURL: NSURL
let requiredKeys = [ "exportable", "tracks" ]
let asset = AVAsset(URL: sourceURL)
asset.loadValuesAsynchronouslyForKeys(requiredKeys) {

    // Error handling code here
    precondition(asset.statusOfValueForKey("exportable", error: nil) == .Loaded)
    precondition(asset.statusOfValueForKey("tracks", error: nil) == .Loaded)
    precondition(asset.exportable)


    let composition = AVMutableComposition()
    do {
        try composition.insertTimeRange(range, ofAsset: asset, atTime: kCMTimeZero)
    } catch {
        // Error handling code here
        return
    }

    let finalComposition = composition.copy() as! AVComposition
    guard let export = AVAssetExportSession(asset: finalComposition, presetName: AVAssetExportPresetPassthrough) else {
        // Error handling code here
        return
    }

    export.outputURL = targetFileURL
    export.outputFileType = AVFileTypeMPEG4
    export.exportAsynchronouslyWithCompletionHandler {
        switch export.status {
        case .Completed:
            // Alright!
            break

        case .Cancelled, .Failed:
            // Error handling code here
            break

        default:
            fatalError("Shouldn't be called")
        }
    }
}
1
votes

The URL used for creating an AVAsset needs to be a local file that you have access to. You will need to download it onto the device before creating the AVAsset like so

0
votes

I think we are not able to export online videos see here: Unable to export AVPlayerItem

So I guess, you can download video first locally and then trim,save and use it.