2017-06-19 102 views
0

我使用下面的代碼在視頻上添加圖像水印,但結果視頻的幀旋轉了180度,我嘗試了所有可能的解決方案來阻止它。我只是想與水印視頻相同的視頻。請提出解決方案。添加一個圖像作爲水印上的視頻結果倒視頻

-(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; 
     } 
    }]; 
} 

回答

0

嘗試設置AVAssetTrackpreferredTransform到層指令

的setTransform:atTime:

設置的固定變換,以從指定的時刻應用,直到下一次在哪個變換是[...]在設置變換的第一個指定時間之前,仿射變換保持不變,其值爲 CGAffineTransformIdentity ;在設置了變換的最後時間之後,仿射變換在該最後的值處保持恆定。