设置AVPlayerLayer VideoGravity适用于模拟器,而不适用于iPad

时间:2012-03-23 09:30:56

标签: objective-c ios avplayer

我目前正在使用AVPlayer Framework为流媒体内容开发视频播放器。 我偶然发现了AVPlayerLayer的VideoGravity String-Property,它允许我将玩家缩放/调整模式设置为不同的值。

为了向用户提供默认播放器中已知的缩放功能,我设置了一个执行以下代码的方法:

AVPlayerLayer *layer = (AVPlayerLayer *)[self.videoContainer layer];

if([layer.videoGravity isEqualToString:AVLayerVideoGravityResizeAspect])
    layer.videoGravity = AVLayerVideoGravityResizeAspectFill;
else 
    layer.videoGravity = AVLayerVideoGravityResizeAspect;

这在模拟器中运行得很好,但不知何故没有安装iOS 5.0.1的iPad 2。

有没有人遇到过类似的问题?这是一个已知的iOS Bug 5.0.1吗?是否有更好的方法使用AVPlayerLayer实现缩放/调整大小?

非常感谢任何想法/提示/帮助和建议,

谢谢,

山姆

2 个答案:

答案 0 :(得分:21)

设置边界将在内部setNeedsLayout。如果你只改变引力,你必须称之为自己。调用setNeedsDisplay强制重新绘制也不会有任何影响,尽管我认为AVPlayerLayer正在频繁更新图层内容以至于无关紧要。

编辑:你的名字是我的两倍!

答案 1 :(得分:4)

我终于通过以下方式交换上述声明来解决我的问题...

    if (self.player.status == AVPlayerStatusReadyToPlay) {
    if([((AVPlayerLayer *)[self.videoContainer layer]).videoGravity isEqualToString:AVLayerVideoGravityResizeAspect])
        ((AVPlayerLayer *)[self.videoContainer layer]).videoGravity = AVLayerVideoGravityResizeAspectFill;
    else 
        ((AVPlayerLayer *)[self.videoContainer layer]).videoGravity = AVLayerVideoGravityResizeAspect;

    ((AVPlayerLayer *)[self.videoContainer layer]).bounds = ((AVPlayerLayer *)[self.videoContainer layer]).bounds;
}

将AVPlayerLayer的边界设置为AVPlayerLayer的边界似乎可以解决问题。虽然我不明白为什么。

但是:欢迎工作解决方案。