App Descrtiption :车速表。针盘和动画针在视频上叠加。我通过后处理将针的动画输出到视频上。我使用AVAssetExportSession,并构建一个AVComposition,其中包含我的动画图层以及视频中的视频和音频曲目。这很好用。视频显示,针动画。
目前,为了在后期处理过程中重播动画,我已经保存了自视频“录制”开始以来的速度变化。在后期处理过程中,我会根据保存的时间/速度数据启动计时器,然后将指针设置为下一个速度。
问题:产生的视频/动画对不完全准确,并且在拍摄视频时以及播放和合成视频时显示的速度经常不匹配。 (由于导出期间的合成/压缩不一定是实时的,因此通常针在视频之前)。
问题:有没有办法可以将速度信息嵌入到录制视频流中,然后在导出时访问它,以便视频和速度计在时间上匹配?
在包含我的速度数据的导出过程中,在特定时间获得回调会很不错。
一如既往......谢谢!
答案 0 :(得分:1)
不使用定时器为指针设置动画,而是根据您录制的速度数据创建关键帧动画。
定时器和CA通常不能很好地混合,至少不是我从你的描述推断的方式。
答案 1 :(得分:1)
如果您需要在应用程序在iPhone上运行时嵌入元数据,我不知道该怎么做。如果您之前可以进行嵌入,请使用HTTP LIve Streaming和HTTP Live Streaming Tools。
元数据由id3taggenerator在文件上生成,并使用mediafilesegmenter嵌入到视频中。例如:
id3taggenerator -o camera1.id3 -text "Dolly camera"
id3taggenerator -o camera2.id3 -text "Tracking camera"
您可以嵌入多种元数据,包括二进制对象。有关详细信息,请参阅手册页。现在我们需要从“元宏文件”引用生成的文件。这是一个纯文本文件,格式如下:
60 id3 camera1.id3
120 id3 camera2.id3
第一个数字是自要插入通知的视频开始以来经过的秒数。我完全不记得mediafilesegmenter命令,抱歉,你必须至少传递宏文件,索引和视频文件。
生成的视频包含由MPMoviePlayerController
作为通知发布的元数据。有关详细信息,请参阅此页:http://jmacmullin.wordpress.com/2010/11/03/adding-meta-data-to-video-in-ios/
答案 2 :(得分:1)
您应该使用CAAnimations和beginTime属性提前设置动画,然后在导出时使用AVVideoComposition + AVVideoCompositionCoreAnimationTool将其添加到视频中。请注意其文档说明:
任何动画都将在视频的时间轴上进行解释,而不是实时...
因此,您的动画会准确排列您指定的结果影片的位置。
答案 3 :(得分:1)
自问这个问题以来已经有一段时间了,但在查看到处后,我已经设法通过在录制期间实时采样数据(1/30秒,带有30fps记录的视频计时器)来提出类似的东西并将其存储在一个数组中。然后在后处理中,我在循环中为数组中的每个数据元素创建多个CALayers,并在每个图层上绘制该数据的可视化。
每个图层都有一个CAAnimation,它使用 beginTime 属性在正确的媒体时间轴上淡化不透明度,这只是1/30秒。乘以数组索引。这是一个很短的时间,层立即出现在前一层上。如果图层背景是不透明的,它将遮挡在前一层中渲染的针,因此看起来使针的动画与原始视频捕获非常好地同步。您可能需要稍微调整一下时间,但我不会超过一帧。
/******** this has not been compiled but you should get the idea ************
// Before starting the AVAssetExportSession session and after the AVMutableComposition routine
CALayer* speedoBackground = [[CALayer alloc] init]; // background layer for needle layers
[speedoBackground setFrame:CGRectMake(x,y,width,height)]; // size and location
[speedoBackground setBackgroundColor:[[UIColor grayColor] CGColor]];
[speedoBackground setOpacity:0.5] // partially see through on video
// loop through the data
for (int index = 0; index < [dataArray count]; index++) {
CALayer* speedoNeedle = [[CALayer alloc] init]; // layer for needle drawing
[speedoNeedle setFrame:CGRectMake(x,y,width,height)]; // size and location
[speedoNeedle setBackgroundColor:[[UIColor redColor] CGColor]];
[speedoNeedle setOpacity:1.0]; // probably not needed
// your needle drawing routine for each data point ... e.g.
[self drawNeedleOnLayer:speedoNeedle angle:[self calculateNeedleAngle[dataArray objectAtIndex:index]]];
CABasicAnimation *needleAnimation = [CABasicAnimation animationWithKeyPath:@"opacity"];
needleAnimation.fromValue = [NSNumber numberWithFloat:(float)0.0];
needleAnimation.toValue = [NSNumber numberWithFloat:(float)1.0]; // fade in
needleAnimation.additive = NO;
needleAnimation.removedOnCompletion = NO; // it obscures previous layers
needleAnimation.beginTime = index*animationDuration;
needleAnimation.duration = animationDuration -.03; // it will not animate at this speed but layer will appear immediately over the previous layer at the correct media time
needleAnimation.fillMode = kCAFillModeBoth;
[speedoNeedle addAnimation:needleAnimation forKey:nil];
[speedoBackground addSublayer:needleOverlay];
}
[parentLayer addSublayer:speedoBackground];
.
.
.
// when the AVAssetExportSession has finished, make sure you clear all the layers
parentLayer.sublayers = nil;
处理器和内存密集,因此对于长视频或复杂绘图来说并不是很好。我相信有更优雅的方法,但这有效,我希望这会有所帮助。
答案 4 :(得分:0)
今年的WWDC会议上可能会提供与您正在做的事情不同的方法。您可以在此处查看视频:http://developer.apple.com/videos/wwdc/2011/。寻找一个名为“在AVFoundation中使用媒体”的版本。有趣的位是大约26分左右。我不完全确定我理解这个问题,但是当我读到它时,那个会话发生在我身上。
最好的问候。