【问题标题】:I have a .mp4 video how i can add water mark我有一个 .mp4 视频如何添加水印
【发布时间】:2016-12-09 09:22:24
【问题描述】:

我有 .mp4 视频,我想从中生成新视频,并在适当的位置添加水印。

是否有可能我可以创建函数并传递视频,它会返回给我带水印的视频。

【问题讨论】:

    标签: ios objective-c swift swift2


    【解决方案1】:

    试试这个:

    此代码在视频上添加文本或字符串,保存视频后,您将在任何播放器上播放。 此代码的最大优点是提供带声音的视频。一切尽在一个代码中(即文本和图像)。

        #import <AVFoundation/AVFoundation.h>
    
        -(void)MixVideoWithText
        {
            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] objectAtIndex:0];
            AVMutableCompositionTrack *compositionAudioTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio preferredTrackID:kCMPersistentTrackID_Invalid];
            AVAssetTrack *clipAudioTrack = [[videoAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0];
            //If you need audio as well add the Asset Track for audio here
    
            [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] objectAtIndex:0] preferredTransform]];
    
            CGSize sizeOfVideo=[videoAsset naturalSize];
    
            //TextLayer defines the text they want to add in Video
            //Text of watermark 
            CATextLayer *textOfvideo=[[CATextLayer alloc] init];
            textOfvideo.string=[NSString stringWithFormat:@"%@",text];//text is shows the text that you want add in video.
            [textOfvideo setFont:(__bridge CFTypeRef)([UIFont fontWithName:[NSString stringWithFormat:@"%@",fontUsed] size:13])];//fontUsed is the name of font
            [textOfvideo setFrame:CGRectMake(0, 0, sizeOfVideo.width, sizeOfVideo.height/6)];
            [textOfvideo setAlignmentMode:kCAAlignmentCenter];
            [textOfvideo setForegroundColor:[selectedColour CGColor]];
    
            //Image of watermark 
            UIImage *myImage=[UIImage imageNamed:@"one.png"];
            CALayer layerCa = [CALayer layer];
            layerCa.contents = (id)myImage.CGImage;
            layerCa.frame = CGRectMake(0, 0, sizeOfVideo.width, sizeOfVideo.height); 
            layerCa.opacity = 1.0; 
    
            CALayer *optionalLayer=[CALayer layer];
            [optionalL addSublayer:textOfvideo];
            optionalL.frame=CGRectMake(0, 0, sizeOfVideo.width, sizeOfVideo.height);
            [optionalL setMasksToBounds:YES];
    
            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);
            [parentLayer addSublayer:videoLayer];
            [parentLayer addSublayer:optionalLayer];
            [parentLayer addSublayer:layerCa];
    
            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] objectAtIndex:0];
            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:AVAssetExportPresetMediumQuality];
            exportSession.videoComposition=videoComposition;
    
            exportSession.outputURL = [NSURL fileURLWithPath:destinationPath];
            exportSession.outputFileType = AVFileTypeQuickTimeMovie;
            [exportSession exportAsynchronouslyWithCompletionHandler:^{
            switch (exportSession.status)
            {
                case AVAssetExportSessionStatusCompleted:
                    NSLog(@"Export OK");
                    if (UIVideoAtPathIsCompatibleWithSavedPhotosAlbum(destinationPath)) {
                        UISaveVideoAtPathToSavedPhotosAlbum(destinationPath, self, @selector(video:didFinishSavingWithError:contextInfo:), nil);
                    }
                    break;
                case AVAssetExportSessionStatusFailed:
                    NSLog (@"AVAssetExportSessionStatusFailed: %@", exportSession.error);
                    break;
                case AVAssetExportSessionStatusCancelled:
                    NSLog(@"Export Cancelled");
                    break;
            }
          }];
        }
    Shows the error they will come after saving video.
    
        -(void) video: (NSString *) videoPath didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo 
        {
            if(error)
                NSLog(@"Finished saving video with error: %@", error); 
        }
    

    发件人:https://stackoverflow.com/a/22016800/3901620

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-23
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多