5

应用说明:车速表。有针盘和动画针作为视频的叠加层。我通过后期处理将针的动画输出到视频上。我使用 AVAssetExportSession,并构造一个 AVComposition,其中包含我的动画层以及视频中的视频和音频轨道。这工作正常。视频节目,针动画。

目前为了在后期处理期间重播动画,我已经保存了自“录制”视频开始以来的任何速度变化。在后处理过程中,我会根据保存的时间/速度数据启动一个计时器,然后将针设置为下一个速度。

问题:生成的视频/动画对并不完全准确,并且在拍摄视频时显示的速度与播放和合成时显示的速度之间经常存在不匹配。(通常针在视频之前)因为导出期间的合成/压缩不一定是实时的。

问题:有没有办法可以将速度信息嵌入到录制的视频流中,然后在导出时访问它,以便视频和速度计在时间上匹配?

在导出期间的特定时间获得包含我的速度数据的回调会很好。

一如既往……谢谢!

4

5 回答 5

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/

于 2011-07-09T13:53:18.003 回答
1

自从提出这个问题以来已经有一段时间了,但是在四处寻找之后,我设法通过在录制过程中实时采样数据(以 1/30 秒。以 30fps 录制视频的计时器)并存储它在一个数组中。然后在后处理中,我在循环中为数组中的每个数据元素创建多个 CALayer,并在每一层上绘制该数据的可视化。

每个层都有一个 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;

它是处理器和内存密集型的,因此不适用于长视频或复杂的绘图。我确信有更优雅的方法,但这有效,我希望这会有所帮助。

于 2014-03-19T21:09:14.050 回答
1

您应该使用 CAAnimations 和 beginTime 属性提前设置动画,然后在导出时使用AVVideoComposition + AVVideoCompositionCoreAnimationTool将它们添加到视频中。请注意其文档状态:

任何动画都将在视频的时间线上进行解释,而不是实时...

因此,您的动画将在您指定的位置与生成的电影完全对齐。

于 2011-07-10T01:15:07.590 回答
1

根据您记录的速度数据创建关键帧动画,而不是使用计时器来为您的针设置动画。

计时器和 CA 通常不能很好地混合,至少不是我从您的描述中推断的方式。

于 2011-07-09T12:39:24.277 回答
0

今年的 WWDC 有一个会议可能会为您的工作提供不同的方法。您可以在此处观看视频:http: //developer.apple.com/videos/wwdc/2011/。寻找一个名为“在 AVFoundation 中使用媒体”的文章。有趣的部分大约在 26 分钟左右。我不完全确定我理解了这个问题,但是当我阅读它时,我想到了那个会话。

此致。

于 2011-07-09T23:54:11.750 回答