【问题标题】:Ios: Remove audio from videoIos:从视频中删除音频
【发布时间】:2015-10-13 10:26:59
【问题描述】:

我有时需要静音视频发送最终用户,所以我需要从视频中删除音频文件。 为单个进程传递视频以进行静音。

【问题讨论】:

    标签: ios iphone audio video


    【解决方案1】:
    // 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;
    }
    

    【讨论】:

      【解决方案2】:

      在 Swift 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)
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-10
        • 1970-01-01
        • 2018-07-09
        • 2021-11-04
        相关资源
        最近更新 更多