Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

AVAssetExportSession Trim & Download

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 ?

like image 521
user2787834 Avatar asked Sep 28 '22 08:09

user2787834


2 Answers

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")
        }
    }
}
like image 83
Dima Kalachov Avatar answered Oct 20 '22 14:10

Dima Kalachov


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

like image 44
Todd Anderson Avatar answered Oct 20 '22 16:10

Todd Anderson