AVSynchronizedLayer动画适用于本地文件,但不适用于流式传输

时间:2014-07-16 11:11:45

标签: ios video-streaming avplayer avplayerlayer

我有一个动画可以使用AVSynchronizedLayer在本地视频文件中正常工作。现在,当我用流媒体链接(同一文件)替换本地文件时,动画完全停止工作。我没有任何线索导致这种情况,多次尝试过它在本地文件上完全正常但在流式传输时却没有。有什么想法吗?

编辑:

- (void)observeValueForKeyPath:(NSString*) path
                  ofObject:(id)object
                    change:(NSDictionary*)change
                   context:(void*)context{
/* AVPlayerItem "status" property value observer. */
if (context == AVPlayerDemoPlaybackViewControllerStatusObservationContext)
{
    [self syncPlayPauseButtons];

    AVPlayerStatus status = [[change objectForKey:NSKeyValueChangeNewKey] integerValue];
    switch (status)
    {
            /* Indicates that the status of the player is not yet known because
             it has not tried to load new media resources for playback */
        case AVPlayerStatusUnknown:
        {
            [self removePlayerTimeObserver];
            [self syncScrubber];

            [self disableScrubber];
            [self disablePlayerButtons];
        }
            break;

        case AVPlayerStatusReadyToPlay:
        {
            /* Once the AVPlayerItem becomes ready to play, i.e.
             [playerItem status] == AVPlayerItemStatusReadyToPlay,
             its duration can be fetched from the item. */

            [self initScrubberTimer];

            [self enableScrubber];
            [self enablePlayerButtons];
        }
            break;

        case AVPlayerStatusFailed:
        {
            AVPlayerItem *playerItem = (AVPlayerItem *)object;
            [self assetFailedToPrepareForPlayback:playerItem.error];
        }
            break;
    }
}
/* AVPlayer "rate" property value observer. */
else if (context == AVPlayerDemoPlaybackViewControllerRateObservationContext)
{
    [self syncPlayPauseButtons];
}
/* AVPlayer "currentItem" property observer.
 Called when the AVPlayer replaceCurrentItemWithPlayerItem:
 replacement will/did occur. */
else if (context == AVPlayerDemoPlaybackViewControllerCurrentItemObservationContext)
{
    AVPlayerItem *newPlayerItem = [change objectForKey:NSKeyValueChangeNewKey];

    /* Is the new player item null? */
    if (newPlayerItem == (id)[NSNull null])
    {
        [self disablePlayerButtons];
        [self disableScrubber];
    }
    else /* Replacement of player currentItem has occurred */
    {
        /* Set the AVPlayer for which the player layer displays visual output. */
        [self.playbackView setPlayer:_player];

        /* Specifies that the player should preserve the video’s aspect ratio and
         fit the video within the layer’s bounds. */
        [self.playbackView setVideoFillMode:AVLayerVideoGravityResizeAspect];

        [self syncPlayPauseButtons];
    }
}
else if( context == AVPlayerDemoPlaybackViewControllerCurrentItemObservationContextForDisplay)
{
    AVPlayerLayer *layer = (AVPlayerLayer*) object;
    if (layer.readyForDisplay){
        [layer removeObserver:self forKeyPath:kReadyForAdDisplayKeyT];

        AVPlayerItem *item = _player.currentItem;
        AVSynchronizedLayer *syncedLayer = [AVSynchronizedLayer synchronizedLayerWithPlayerItem:item];
        syncedLayer.frame = CGRectMake(0, 0, 568, 320);
        syncedLayer.backgroundColor = [[UIColor clearColor] CGColor];
        //ADDING THE SYNCHRONIZED LAYER TO MY VIEW
        [self.madnessView addSyncedLayer:syncedLayer player:[self.playbackView player] withGravity:layer.videoGravity];
    }
}
else
{
    [super observeValueForKeyPath:path ofObject:object change:change context:context];
}}

这是我将AVSynchronized图层添加到播放动画的自定义视图的位置。动画的代码是:

CAKeyframeAnimation *anim = [CAKeyframeAnimation animationWithKeyPath:@"transform"];
anim.beginTime = AVCoreAnimationBeginTimeAtZero;
anim.duration = self.videoDuration;
anim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
anim.removedOnCompletion = NO;
anim.fillMode = kCAFillModeForwards;
anim.values = [self.transforms objectAtIndex:adNumber];
UIImageView* imageView = [self.adViews objectAtIndex:adNumber];
[imageView.layer addAnimation:anim forKey:@"transformAnimation"];
imageView.hidden = NO;

2 个答案:

答案 0 :(得分:0)

检查 self.videoDuration 值,我在播放视频时遇到同样的问题 - 持续时间始终为0.希望这会有所帮助。

答案 1 :(得分:0)

问题在于创建图层的时间。一旦我修复了它(即在视频播放器准备播放后创建了图层/动画),事情开始按预期工作。