首页 > 解决方案 > 如何为视频添加水印(文本或图像)?

问题描述

我正在我的应用程序中进行一些视频操作。目前,此代码获取用户生成的视频,并为视频添加声音,然后以相同的质量导出。这很好用,但我不知道如何在视频中添加水印。我很高兴用 UIIMage 或文本层来做这件事,我只想让它在视频上说出我的应用程序的名称,而不会降低质量。有谁知道我可以如何扩充此代码以添加水印?

我在 Objective-C 中工作,而不是 Swift。

AVMutableComposition* mixComposition = [AVMutableComposition composition];

NSURL *audioPath = [[NSBundle mainBundle] URLForResource:@"sound" withExtension:@"mp3"];
AVURLAsset* audioAsset = [[AVURLAsset alloc]initWithURL:audioPath options:nil];
AVURLAsset* videoAsset = [[AVURLAsset alloc]initWithURL:self.videoUrl options:nil];
AVAssetTrack *assetVideoTrack = [videoAsset tracksWithMediaType:AVMediaTypeVideo].lastObject;

// add video


AVMutableCompositionTrack *compositionVideoTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeVideo
                                                                                    preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionVideoTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
                               ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]
                                atTime:kCMTimeZero error:nil];
[compositionVideoTrack setPreferredTransform:assetVideoTrack.preferredTransform];

// add video audio


AVMutableCompositionTrack *videoSoundTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio
preferredTrackID:kCMPersistentTrackID_Invalid];

[videoSoundTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, videoAsset.duration)
ofTrack:[[videoAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
 atTime:kCMTimeZero error:nil];

// add sound

AVMutableCompositionTrack *compositionCommentaryTrack = [mixComposition addMutableTrackWithMediaType:AVMediaTypeAudio
                                                                                    preferredTrackID:kCMPersistentTrackID_Invalid];
[compositionCommentaryTrack insertTimeRange:CMTimeRangeMake(kCMTimeZero, audioAsset.duration)
                                    ofTrack:[[audioAsset tracksWithMediaType:AVMediaTypeAudio] objectAtIndex:0]
                                     atTime:self.avPlayer.currentTime error:nil];

CGSize sizeOfVideo = [compositionVideoTrack naturalSize];    

AVAssetExportSession* _assetExport = [[AVAssetExportSession alloc] initWithAsset:mixComposition
                                                                      presetName:AVAssetExportPresetPassthrough];

NSArray *dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docsDir = [dirPaths objectAtIndex:0];
NSString *savePath = [docsDir stringByAppendingPathComponent:@"video.mov"];
NSURL    *savetUrl = [NSURL fileURLWithPath:savePath];
if ([[NSFileManager defaultManager] fileExistsAtPath:savePath]) {
    [[NSFileManager defaultManager] removeItemAtPath:savePath error:nil];
    [[NSFileManager defaultManager] removeItemAtURL:savetUrl error:nil];
}
_assetExport.outputFileType = @"com.apple.quicktime-movie";
_assetExport.outputURL = savetUrl;
_assetExport.shouldOptimizeForNetworkUse = YES;

[_assetExport exportAsynchronouslyWithCompletionHandler:
    ^(void ) {
    dispatch_async(dispatch_get_main_queue(), ^{
        [MBProgressHUD hideHUDForView:self.view animated:YES];
    });
        switch (_assetExport.status)
        {
            case AVAssetExportSessionStatusFailed:
            {
                NSLog (@"FAIL %@",_assetExport.error);
                break;
            }
            case AVAssetExportSessionStatusCompleted:
            {
                dispatch_async(dispatch_get_main_queue(), ^{

                    // work with the video

                    });
                break;
            }
            case AVAssetExportSessionStatusCancelled:
            {
                NSLog (@"CANCELED");
                break;
            }
        }
        NSLog(@"Export Status %d-- %@", _assetExport.status, _assetExport.outputURL);
       }
    ];

标签: iosobjective-cavfoundation

解决方案


推荐阅读