2015-10-13 138 views

回答

4
// Remove audio from video  
- (void) RemoveAudioFromVideo:(NSString *)VideoLocalPath { 
    NSString * initPath1 = VideoLocalPath; 
    AVMutableComposition *composition = [AVMutableComposition composition]; 

    NSString *inputVideoPath = initPath1; 
    AVURLAsset * sourceAsset = [[AVURLAsset alloc] initWithURL:[NSURL fileURLWithPath:inputVideoPath] options:nil]; 

    AVMutableCompositionTrack *compositionVideoTrack = [composition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 

    BOOL ok = NO; 

    AVAssetTrack * sourceVideoTrack = [[sourceAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 

    CMTimeRange x = CMTimeRangeMake(kCMTimeZero, [sourceAsset duration]); 

    ok = [compositionVideoTrack insertTimeRange:x ofTrack:sourceVideoTrack atTime:kCMTimeZero error:nil]; 

    if([[NSFileManager defaultManager] fileExistsAtPath:initPath1]) { 
     [[NSFileManager defaultManager] removeItemAtPath:initPath1 error:nil]; 
    } 

    NSURL *url = [[NSURL alloc] initFileURLWithPath: initPath1]; 

    AVAssetExportSession *exporter = [[AVAssetExportSession alloc] initWithAsset:composition presetName:AVAssetExportPresetHighestQuality]; 

    exporter.outputURL=url; 

    NSLog(@";%@", [exporter supportedFileTypes]); 

    exporter.outputFileType = @"com.apple.quicktime-movie"; 
    [exporter exportAsynchronouslyWithCompletionHandler:^{ 
     [self savefinalVideoFileToDocuments:exporter.outputURL]; 
    }]; 
} 

// Write final Video 
-(void)savefinalVideoFileToDocuments:(NSURL *)url { 
    NSString *storePath = [[self applicationCacheDirectory] stringByAppendingPathComponent:@"Videos"]; 
    NSData * movieData = [NSData dataWithContentsOfURL:url]; 
    [movieData writeToFile:storePath atomically:YES]; 
} 

// Directory Path 
- (NSString *)applicationCacheDirectory { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = ([paths count] > 0) ? [paths objectAtIndex:0] : nil; 
    return documentsDirectory; 
} 
1

在夫特3,

func removeAudioFromVideo(_ videoPath: String) { 
    let initPath1: String = videoPath 
    let composition = AVMutableComposition() 
    let inputVideoPath: String = initPath1 
    let sourceAsset = AVURLAsset(url: URL(fileURLWithPath: inputVideoPath), options: nil) 
    let compositionVideoTrack: AVMutableCompositionTrack? = composition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid) 
    let sourceVideoTrack: AVAssetTrack? = sourceAsset.tracks(withMediaType: AVMediaTypeVideo)[0] 
    let x: CMTimeRange = CMTimeRangeMake(kCMTimeZero, sourceAsset.duration) 
    _ = try? compositionVideoTrack!.insertTimeRange(x, of: sourceVideoTrack!, at: kCMTimeZero) 
    if FileManager.default.fileExists(atPath: initPath1) { 
     try? FileManager.default.removeItem(atPath: initPath1) 
    } 
    let url = URL(fileURLWithPath: initPath1) 
    let exporter = AVAssetExportSession(asset: composition, presetName: AVAssetExportPresetHighestQuality) 
    exporter?.outputURL = url 
    exporter?.outputFileType = "com.apple.quicktime-movie" 
    exporter?.exportAsynchronously(completionHandler: {() -> Void in 
     self.saveFinalVideoFile(toDocuments: exporter!.outputURL!) 
    }) 
} 

func saveFinalVideoFile(toDocuments url: URL) { 
    let fileURL = try! FileManager.default.url(for: .documentDirectory, in: .userDomainMask, appropriateFor: nil, create: false).appendingPathComponent("Videos") 
    let movieData = try? Data(contentsOf: url) 
    try? movieData?.write(to: fileURL, options: .atomic) 
}