我有一个 .mp4 视频如何添加水印

Posted

技术标签:

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

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

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

【问题讨论】:

【参考方案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://***.com/a/22016800/3901620

【讨论】:

以上是关于我有一个 .mp4 视频如何添加水印的主要内容,如果未能解决你的问题,请参考以下文章

7 ffmpeg 截图 水印,动图

请教ffmpeg加滚动水印怎么让它周期显示

FFMPEG音视频开发: 添加图片水印

200分求:使用ffmpeg给视频加水印

采用七牛接口给视频添加水印功能

JAVA调用FFmpeg实现音视频转码加水印功能