2013-04-23 54 views
2

我正在使用AVFoundation在我的電影中放入水印。這適用於在互聯網和蘋果公司正在進行的代碼。但我不想在完整的時間顯示水印,並且我想在同一部電影中顯示不同的水印。如何用不同的圖像和不同的CMTimes使用AVFoundation爲您的視頻添加水印

我有一個AVAsset:

NSString *path = [[NSBundle mainBundle] pathForResource:@"test" ofType:@"MOV"]; 
NSURL *url = [[NSURL alloc] initFileURLWithPath: path]; 

avasset_camera = [AVAsset assetWithURL:url]; 

一種AVMutableComposition:

AVMutableComposition *mix = [AVMutableComposition composition]; 

的UIImage的轉換爲CALayer的和比添加到另一個層與animationTool摻入:

UIImage *myImage = [UIImage imageNamed:@"watermark.png"]; 
CALayer *aLayer = [CALayer layer]; 
aLayer.contents = (id)myImage.CGImage; 
aLayer.frame = CGRectMake(0, 0, 568, 320);  
aLayer.opacity = 1.0; 

CGSize videoSize = [avasset_camera naturalSize]; 
CALayer *parentLayer = [CALayer layer]; 
CALayer *videoLayer = [CALayer layer]; 
parentLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height); 
videoLayer.frame = CGRectMake(0, 0, videoSize.width, videoSize.height); 
[parentLayer addSublayer:videoLayer]; 
[parentLayer addSublayer:aLayer]; 

而不是AVMutableVideoComposition:

AVMutableVideoComposition* videoComp = [[AVMutableVideoComposition videoComposition] retain]; 
videoComp.renderSize = videoSize; 
videoComp.frameDuration = CMTimeMake(1, 30); 
AVVideoCompositionCoreAnimationTool *animationVideoTool = [AVVideoCompositionCoreAnimationTool videoCompositionCoreAnimationToolWithPostProcessingAsVideoLayer:videoLayer inLayer:parentLayer]; 

videoComp.animationTool = animationVideoTool; 

爲VideoComposition指令:

AVMutableVideoCompositionInstruction *instruction = [AVMutableVideoCompositionInstruction videoCompositionInstruction]; 
instruction.timeRange = CMTimeRangeMake(kCMTimeZero, avasset_camera.duration); 

而對於層次的指令:

AVAssetTrack *videoTrack = [[mix tracksWithMediaType:AVMediaTypeVideo] objectAtIndex:0]; 

AVMutableVideoCompositionLayerInstruction *layerInstruction = [AVMutableVideoCompositionLayerInstruction videoCompositionLayerInstructionWithAssetTrack:videoTrack]; 

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

,並且比同VideoComposition的財產AVAssetExportSession出口它

這將導致帶有完整視頻水印的視頻。我想要實現的是一個來自攝像機的視頻,其中水印的前5秒。它會消失一段時間,而不是另一幅圖像(也是水印)。

我被卡住了...我已經看過WWDC上的AVFoundation數萬億次的視頻,但它缺乏深入的視野。

當我更改指令的timeRange時,它不會導出,因爲持續時間(範圍)必須與AVAssetTrack的持續時間(範圍)相同。我一直試圖插入多個指令,但迄今爲止沒有成功。

+0

您是否找到解決方案?我也面臨同樣的問題。 – 2017-02-20 12:55:03

回答

0

AVMutableVideoCompositionLayerInstruction有一個方法[setOpacityRampFromStartOpacity:toEndOpacity:timeRange:],您可以爲不同的片段設置(每個layerInstruction不重疊)。不是最好的解決方案是創建兩個視頻軌道 - 一個原始視頻和另一個需要水印和斜坡不透明(需要時只顯示某些段的原始信息和其他信息的水印)。

+0

要試試這個。我已經有了創作2部電影的想法,並將它們與不透明度放在一起。但是對於不同的水印,這一切都有點複雜:-)感謝您的回覆 – Michiel 2013-05-08 13:27:10