2017-06-19 4 views
0

Ich füge Bild-Wasserzeichen auf Video mit dem folgenden Code, aber die resultierende Video-Frame wurde um 180 Grad gedreht und ich versuchte jede mögliche Lösung, um es zu stoppen. Ich möchte nur das gleiche Video mit Wasserzeichen als Quellvideo. Bitte schlagen Sie eine Lösung vor.Hinzufügen eines Bildes als Wasserzeichen auf Video-Ergebnisse invertiertes Video

-(void)watermarkVideoAtURL:(NSURL *)url fb:(BOOL)fb withCompletionHandler:(void(^)(bool success, NSURL *assetsURL, NSError *error))completionHandler { 

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

    AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo preferredTrackID:kCMPersistentTrackID_Invalid]; 
    AVAssetTrack *clipVideoTrack = [[videoAsset tracksWithMediaType:AVMediaTypeVideo] lastObject]; 
    AVMutableCompositionTrack *compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid]; 

    AVAssetTrack *clipAudioTrack = [[videoAsset tracksWithMediaType:AVMediaTypeAudio] lastObject]; 
    [compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:clipVideoTrack atTime:kCMTimeZero error:nil]; 
    [compositionAudioTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration) ofTrack:clipAudioTrack atTime:kCMTimeZero error:nil]; 
    [compositionVideoTrack setPreferredTransform:[[[videoAsset tracksWithMediaType:AVMediaTypeVideo] lastObject] preferredTransform]]; 
    CGSize sizeOfVideo = [videoAsset naturalSize]; 

    CALayer *parentLayer = [CALayer layer]; 
    CALayer *videoLayer = [CALayer layer]; 

    parentLayer.frame = CGRectMake(0, 0, sizeOfVideo.width, sizeOfVideo.height); 
    videoLayer.frame = CGRectMake(0, 0, sizeOfVideo.width, sizeOfVideo.height); 

    // Image of watermark 
    UIImage *myImage = [self imageByApplyingAlpha:watermarkOpacityFactor toImage:[UIImage imageNamed:@"iconbig"]]; 
    CALayer *layerCa = [CALayer layer]; 
    layerCa.contents = (id)myImage.CGImage; 
    layerCa.frame = CGRectMake(10, sizeOfVideo.height - 50, 50, 50); 
    layerCa.opacity = 1.0; 

    CALayer *layerCa2 = [CALayer layer]; 
    layerCa2.contents = (id)myImage.CGImage; 
    layerCa2.frame = CGRectMake(sizeOfVideo.width - 60, 10, 50, 50); 
    layerCa2.opacity = 1.0; 

    [parentLayer addSublayer:videoLayer]; 
    [parentLayer addSublayer:layerCa]; 
    [parentLayer addSublayer:layerCa2]; 

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

    AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 

    instruction.timeRange = CMTimeRangeMake(kCMTimeZero, [mixComposition duration]); 
    AVAssetTrack *videoTrack = [[mixComposition tracksWithMediaType:AVMediaTypeVideo] lastObject]; 


    AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack]; 

    instruction.layerInstructions = [NSArray arrayWithObject:layerInstruction]; 
    videoComposition.instructions = [NSArray arrayWithObject:instruction]; 


    NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0]; 
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; 
    [dateFormatter setDateFormat:@"yyyy-MM-dd_HH-mm-ss"]; 
    NSString *destinationPath = [documentsDirectory stringByAppendingFormat:@"/utput_%@.mov", [dateFormatter stringFromDate:[NSDate date]]]; 

    AVAssetExportSession *exportSession = [[AVAssetExportSession alloc] initWithAsset:mixComposition presetName:AVAssetExportPresetHighestQuality]; 
    exportSession.videoComposition = videoComposition; 
    exportSession.outputURL = [NSURL fileURLWithPath:destinationPath]; 
    exportSession.outputFileType = AVFileTypeQuickTimeMovie; 

    [exportSession exportAsynchronouslyWithCompletionHandler:^{ 
     switch (exportSession.status) { 
      case AVAssetExportSessionStatusCompleted: { 
       ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; 
       [library writeVideoAtPathToSavedPhotosAlbum:exportSession.outputURL completionBlock:^(NSURL *assetURL, NSError *error) { 
        if (!error) { 
         completionHandler(YES, assetURL, nil); 
        } else { 
         completionHandler(NO, nil, error); 
        } 
       }]; 
      } 
       break; 

      case AVAssetExportSessionStatusFailed: { 
       completionHandler(NO, nil, exportSession.error); 
      } 
       break; 

      case AVAssetExportSessionStatusCancelled: { 
       completionHandler(NO, nil, exportSession.error); 
      } 
       break; 

      default: 
       break; 
     } 
    }]; 
} 

Antwort

0

Try einzustellen AVAssetTrack ‚s preferredTransform Anweisung Schicht

setTransform: atTime:

ein aus der angegebenen Zeit bis zur nächsten Zeit, zu den Sets feste Transformation einer Transformation anzuwenden ist set. [...] Vor der ersten angegebenen Zeit, für die eine Transformation festgelegt ist, wird die affine Transformation konstant auf dem Wert CGAffineTransformIdentity gehalten; Nach der letzten Zeit, für die eine Transformation gesetzt ist, wird die affine Transformation bei diesem letzten Wert konstant gehalten.

Verwandte Themen