2017-04-25 1 views
-2
> - (void) createWatermark:(UIImage*)image video:(NSURL*)videoURL 
{ 
    if (videoURL == nil) 
     return; 

    AppDelegate* appDelegate = [[UIApplication sharedApplication] delegate]; 
    //[appDelegate showLoadingView: YES]; 

    AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:videoURL options:nil]; 
    AVMutableComposition* mixComposition = [AVMutableComposition composition]; 

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

    AVAssetTrack* clipVideoTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) 
            ofTrack:clipVideoTrack 
            atTime:kCMTimeZero error:nil]; 

    [compositionVideoTrack setPreferredTransform:[[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0] preferredTransform]]; 

    // create the layer with the watermark image 
    CALayer* aLayer = [CALayer layer]; 
    aLayer.contents = (id)image.CGImage; 
    aLayer.frame = CGRectMake(50, 100, image.size.width, image.size.height); 
    aLayer.opacity = 0.9; 

    //sorts the layer in proper order 

    AVAssetTrack* videoTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    CGSize videoSize = [videoTrack naturalSize]; 
    CALayer *parentLayer = [CALayer layer]; 
    CALayer *videoLayer = [CALayer layer]; 
    parentLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height); 
    videoLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height); 
    [parentLayer addSublayer:videoLayer]; 
    [parentLayer addSublayer:aLayer]; 

    // create text Layer 
    CATextLayer* titleLayer = [CATextLayer layer]; 
    titleLayer.backgroundColor = [UIColor clearColor].CGColor; 
    titleLayer.string = @"Dummy text"; 
    titleLayer.font = CFBridgingRetain(@"Helvetica"); 
    titleLayer.fontSize = 28; 
    titleLayer.shadowOpacity = 0.5; 
    titleLayer.alignmentMode = kCAAlignmentCenter; 
    titleLayer.frame = CGRectMake(0, 50, videoSize.width, videoSize.height/6); 
    [parentLayer addSublayer:titleLayer]; 

    //create the composition and add the instructions to insert the layer: 

    AVMutableVideoComposition* videoComp = [AVMutableVideoComposition videoComposition]; 
    videoComp.renderSize = videoSize; 
    videoComp.frameDuration = CMTimeMake(1, 30); 
    videoComp.animationTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer]; 

    /// instruction 
    AVMutableVideoCompositionInstruction* instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 

    instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mixComposition duration]); 
    AVAssetTrack* mixVideoTrack = [[mixComposition tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 
    AVMutableVideoCompositionLayerInstruction* layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:mixVideoTrack]; 
    instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; 
    videoComp.instructions = [NSArray arrayWithObject: instruction]; 

    // export video 

    _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetMediumQuality]; 
    _assetExport.videoComposition = videoComp; 

    NSLog (@"created exporter. supportedFileTypes: %@", _assetExport.supportedFileTypes); 

    NSString* videoName = @"NewWatermarkedVideo.mov"; 

    NSString* exportPath = [NSTemporaryDirectory() stringByAppendingPathComponent:videoName]; 
    NSURL* exportUrl = [NSURL fileURLWithPath:exportPath]; 

    if ([[NSFileManager defaultManager] fileExistsAtPath:exportPath]) 
     [[NSFileManager defaultManager] removeItemAtPath:exportPath error:nil]; 

    _assetExport.outputFileType = AVFileTypeQuickTimeMovie; 
    _assetExport.outputURL = exportUrl; 
    _assetExport.shouldOptimizeForNetworkUse = YES; 

    [_assetExport exportAsynchronouslyWithCompletionHandler: 
    ^(void) { 

     //[appDelegate showLoadingView:NO]; 

     //Final code here 

     switch (_assetExport.status) 
     { 
      case AVAssetExportSessionStatusUnknown: 
       NSLog(@"Unknown"); 
       break; 
      case AVAssetExportSessionStatusWaiting: 
       NSLog(@"Waiting"); 
       break; 
      case AVAssetExportSessionStatusExporting: 
       NSLog(@"Exporting"); 
       break; 
      case AVAssetExportSessionStatusCompleted: 
       NSLog(@"Created new water mark image"); 
       playBtn.hidden = NO; 
       break; 
      case AVAssetExportSessionStatusFailed: 
       NSLog(@"Failed- %@", _assetExport.error); 
       break; 
      case AVAssetExportSessionStatusCancelled: 
       NSLog(@"Cancelled"); 
       break; 
     } 
    } 
    ]; 
} 
> Use of unresolved identifier 'presentMoviePlayerViewControllerAnimated' 
> 
> 'videoComposition()' is unavailable: use object construction 'AVMutableVideoComposition()' 

Enum cas « inconnu » introuvable dans le type 'AVAssetExportSessionStatus? Cela fonctionne très bien dans Objective C Les étiquettes d'argument '(_ :)' ne correspondent à aucune surcharge disponible Ce sont les quelques erreurs que je reçois pendant que je fais dans swift Je suis totalement nouveau à swift, toute aide?Je suis en train d'ajouter une marque d'eau sur la vidéo, je l'ai fait dans l'objectif c mais son lot montrant des erreurs dans rapide

+1

Vous avez dit que vous obtenez des erreurs dans votre code rapide, bien que vous ayez fourni aucun exemple d'un code rapide. Tout le code est dans l'objectif-C que vous dites fonctionne bien. Pour nous aider à répondre au mieux à votre question, veuillez fournir un exemple de votre code Swift défectueux. – torinpitchers

Répondre

0

VOTRE SWIFT 3.0 VERSION:

func createWatermark(_ image: UIImage, video videoURL: URL) 
    { 
       if videoURL == nil 
    { 
        return 
       } 
       let appDelegate: AppDelegate? = UIApplication.shared.delegate 
       //[appDelegate showLoadingView: YES]; 
       let videoAsset = AVURLAsset(url: videoURL, options: nil) 
       let mixComposition = AVMutableComposition() 
       let compositionVideoTrack: AVMutableCompositionTrack? = mixComposition.addMutableTrack(withMediaType: AVMediaTypeVideo, preferredTrackID: kCMPersistentTrackID_Invalid) 
       let clipVideoTrack: AVAssetTrack? = (videoAsset.tracks(withMediaType: AVMediaTypeVideo)[0] as? AVAssetTrack) 
       try? compositionVideoTrack?.insertTimeRange(CMTimeRangeMake(kCMTimeZero, videoAsset.duration), of: clipVideoTrack, atTime: kCMTimeZero) 
       compositionVideoTrack?.preferredTransform = videoAsset.tracks(withMediaType: AVMediaTypeVideo)[0].preferredTransform 
      } 



    // create the layer with the watermark image 
    var aLayer = CALayer() 
    aLayer.contents = (image.cgImage as? Any) 
    aLayer.frame = CGRect(x: CGFloat(50), y: CGFloat(100), width: CGFloat(image.size.width), height: CGFloat(image.size.height)) 
    aLayer.opacity = 0.9 

    //sorts the layer in proper order 
    var videoTrack: AVAssetTrack? = (videoAsset.tracks(withMediaType: AVMediaTypeVideo)[0] as? AVAssetTrack) 
    var videoSize: CGSize? = videoTrack?.naturalSize 
    var parentLayer = CALayer() 
    var videoLayer = CALayer() 
    parentLayer.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(videoSize?.width), height: CGFloat(videoSize?.height)) 
    videoLayer.frame = CGRect(x: CGFloat(0), y: CGFloat(0), width: CGFloat(videoSize?.width), height: CGFloat(videoSize?.height)) 
    parentLayer.addSublayer(videoLayer) 
    parentLayer.addSublayer(aLayer) 

     // create text Layer 
    var titleLayer = CATextLayer() 
    titleLayer.backgroundColor = UIColor.clear.cgColor 
    titleLayer.string = "Dummy text" 
    titleLayer.font = CFBridgingRetain("Helvetica") 
    titleLayer.fontSize = 28 
    titleLayer.shadowOpacity = 0.5 
    titleLayer.alignmentMode = kCAAlignmentCenter 
    titleLayer.frame = CGRect(x: CGFloat(0), y: CGFloat(50), width: CGFloat(videoSize.width), height: CGFloat(videoSize.height/6)) 
    parentLayer.addSublayer(titleLayer) 

    //create the composition and add the instructions to insert the layer: 
    var videoComp = AVMutableVideoComposition.videoComposition 
    videoComp.renderSize = videoSize 
    videoComp.frameDuration = CMTimeMake(1, 30) 
    videoComp.animationTool = AVVideoCompositionCoreAnimationTool(postProcessingAs: videoLayer, in: parentLayer) 

    /// instruction 
var instruction = AVMutableVideoCompositionInstruction.videoCompositionInstruction 
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, mixComposition.duration) 
var mixVideoTrack: AVAssetTrack? = (mixComposition.tracks(withMediaType: AVMediaTypeVideo)[0] as? AVAssetTrack) 
var layerInstruction = AVMutableVideoCompositionLayerInstruction(mixVideoTrack) 
instruction.layerInstructions = [layerInstruction] 
videoComp.instructions = [instruction] 

// export video 
assetExport = AVAssetExportSession(asset: mixComposition, presetName: AVAssetExportPresetMediumQuality) 
assetExport.videoComposition = videoComp 
print("created exporter. supportedFileTypes: \(assetExport.supportedFileTypes)") 
var videoName: String = "NewWatermarkedVideo.mov" 
var exportPath: String = URL(fileURLWithPath: NSTemporaryDirectory()).appendingPathComponent(videoName).absoluteString 
var exportUrl = URL(fileURLWithPath: exportPath) 
if FileManager.default.fileExists(atPath: exportPath) { 
    try? FileManager.default.removeItem(atPath: exportPath) 
} 
assetExport.outputFileType = AVFileTypeQuickTimeMovie 
assetExport.outputURL = exportUrl 
assetExport.shouldOptimizeForNetworkUse = true 


assetExport.exportAsynchronously(withCompletionHandler: {(_: Void) -> Void in 
    //[appDelegate showLoadingView:NO]; 
    //Final code here 
    switch assetExport.status { 
     case .unknown: 
      print("Unknown") 
     case .waiting: 
      print("Waiting") 
     case .exporting: 
      print("Exporting") 
     case .completed: 
      print("Created new water mark image") 
      playBtn.isHidden = false 
     case .failed: 
      print("Failed- \(assetExport.error)") 
     case .cancelled: 
      print("Cancelled") 
    } 

})