Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 设置AVSynchonizedLayer_Ios_Video_Animation_Core Animation_Sync - Fatal编程技术网

Ios 设置AVSynchonizedLayer

Ios 设置AVSynchonizedLayer,ios,video,animation,core-animation,sync,Ios,Video,Animation,Core Animation,Sync,我一直在尝试制作一个将视频与动画对象连接起来的概念证明(本质上,我是在特定位置将用户选择的位图“旋转”到一个罐装视频上)。在观看了所有关于核心动画(WWDC10等)和AVSync..Layer(苹果WWDC10示例代码、doc示例代码)的可用苹果材料后,根本没有足够清晰的独立代码示例来推导如何正确实现此播放模式 使用CA,我有一个加载到CALayer的视频资源和一个附加到位图的动画,然后连接到另一个CALayer。我创建了一个AVSynchronizedLayer,并将这两个对象添加为子层 当这

我一直在尝试制作一个将视频与动画对象连接起来的概念证明(本质上,我是在特定位置将用户选择的位图“旋转”到一个罐装视频上)。在观看了所有关于核心动画(WWDC10等)和AVSync..Layer(苹果WWDC10示例代码、doc示例代码)的可用苹果材料后,根本没有足够清晰的独立代码示例来推导如何正确实现此播放模式

使用CA,我有一个加载到CALayer的视频资源和一个附加到位图的动画,然后连接到另一个CALayer。我创建了一个AVSynchronizedLayer,并将这两个对象添加为子层

当这棵树被添加到UIView的层属性时,我希望动画的播放与视频同步。相反,我只看到视频播放,动画从不执行——以下是我的相关代码片段,它们都位于单个视图控制器(称为ViewDidLoad)中

Video101.m4v=简单的m4v视频, gerald.png=位图

NSURL *fileURL = [[NSBundle mainBundle] URLForResource:@"Video101" withExtension:@"m4v"];
AVURLAsset *asset = [AVURLAsset URLAssetWithURL:fileURL options:nil];
AVPlayerItem *playerItem = [AVPlayerItem playerItemWithAsset:asset];

AVPlayer *player = [[AVPlayer playerWithPlayerItem:playerItem]retain];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = CGRectMake(0, 0, 1024, 768);
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

CALayer *gerald = [CALayer layer];
gerald.frame = CGRectMake(0, 0, 120, 120);
gerald.contents = (id) [UIImage imageNamed:@"gerald.png"].CGImage;

[self.view.layer addSublayer:playerLayer];
[self.view.layer insertSublayer:gerald above:playerLayer];


CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"position"];
anim.duration = 18.0;

anim.values = [NSArray arrayWithObjects:
               [NSValue valueWithCGPoint:CGPointMake(320.0, 406.0)],
               [NSValue valueWithCGPoint:CGPointMake(310.0, 400.0)],
               [NSValue valueWithCGPoint:CGPointMake(320.0, 406.0)],
               [NSValue valueWithCGPoint:CGPointMake(310.0, 400.0)],
               [NSValue valueWithCGPoint:CGPointMake(320.0, 406.0)],
               [NSValue valueWithCGPoint:CGPointMake(310.0, 400.0)],
               [NSValue valueWithCGPoint:CGPointMake(480.0, 206.0)],
               [NSValue valueWithCGPoint:CGPointMake(310.0, 400.0)],
               [NSValue valueWithCGPoint:CGPointMake(320.0, 406.0)],
               [NSValue valueWithCGPoint:CGPointMake(320.0, 406.0)],
               [NSValue valueWithCGPoint:CGPointMake(310.0, 400.0)],
               [NSValue valueWithCGPoint:CGPointMake(320.0, 406.0)],
               [NSValue valueWithCGPoint:CGPointMake(10.0, 760.0)],
               [NSValue valueWithCGPoint:CGPointMake(320.0, 406.0)],
               [NSValue valueWithCGPoint:CGPointMake(310.0, 400.0)],
               [NSValue valueWithCGPoint:CGPointMake(320.0, 406.0)],
               [NSValue valueWithCGPoint:CGPointMake(310.0, 400.0)], nil];


anim.keyTimes = [NSArray arrayWithObjects:
                 [NSNumber numberWithFloat:0.02],
                 [NSNumber numberWithFloat:0.06],
                 [NSNumber numberWithFloat:0.09],
                 [NSNumber numberWithFloat:0.1], 
                 [NSNumber numberWithFloat:0.12],
                 [NSNumber numberWithFloat:0.2],
                 [NSNumber numberWithFloat:0.25],
                 [NSNumber numberWithFloat:0.32], 
                 [NSNumber numberWithFloat:0.38],
                 [NSNumber numberWithFloat:0.49],
                 [NSNumber numberWithFloat:0.53],
                 [NSNumber numberWithFloat:0.59], 
                 [NSNumber numberWithFloat:0.63],
                 [NSNumber numberWithFloat:0.69],
                 [NSNumber numberWithFloat:0.78],
                 [NSNumber numberWithFloat:0.81], 
                 [NSNumber numberWithFloat:0.91], 
                 [NSNumber numberWithFloat:1.0], nil];


AVSynchronizedLayer *syncLayer = [AVSynchronizedLayer synchronizedLayerWithPlayerItem:playerItem];
[syncLayer addSublayer:gerald];
[gerald addAnimation:anim forKey:@"transform.position"];

[self.view.layer addSublayer:syncLayer];

[player play];

实现AVSynchronizedLayer以使动画和视频同时播放的正确格式或方式是什么?

您已正确设置了
CAKeyframeAnimation
,除了一位: 根据WWDC“利用AV基金会编辑媒体”讲座,您需要将动画的
beginTime
属性设置为非零值

零开始时间自动转换为CACurrentMediaTime()。使用一个小的非零数字:例如1e-100或-1e-100(AVCoreAnimationBeginTimetZero)


我认为如果您添加
anim.beginTime=avcoreanimationbegintimezero您会发现动画在视频开始播放时就开始了。

我是否可以通过以下操作为动画添加延迟:avcoreAnimationBeginTimesZero+1或caccurrentMediaTime()+1