1

我看到了一个与我询问如何将 AVPlayerLayer 添加到 NS 视图的问题类似的问题,但我看不到完整的源代码来了解它是如何工作的。我的问题的核心是我创建了一个播放器对象并使用移动 NSURL 对其进行初始化。我创建了一个 AVPlayerLayer 对象并使用播放器对其进行初始化。当我尝试将 AVPlayerLayer 添加到自己(我是 NSView)并运行该程序时,我什么也没得到。

NSURL *movie = [[NSURL alloc]     initWithString:@"file://localhost/Users/matthewmichal/Desktop/A%20Good%20To%20Die%20Hard.mov"];
[player initWithURL:movie];
[self setWantsLayer:YES];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
[self.layer addSublayer:playerLayer];
    [player play];
4

2 回答 2

2

您可能应该考虑阅读 Apple 的 AVFoundation 指南:

https://developer.apple.com/library/ios/DOCUMENTATION/AudioVideo/Conceptual/AVFoundationPG/Articles/00_Introduction.html

它没有具体说明 AppKit 和 UIKit 之间的细微差别,但您已经了解了([NSView setWantsLayer:], [NSView addSublayer])。您没有正确执行的是注册以观察 AVPlayer 状态属性的更新:

然而,与 AVAsset 一样,简单地初始化一个播放器项目并不一定意味着它已准备好立即播放。您可以观察(使用键值观察)项目的状态属性以确定它是否以及何时准备好播放。

假设所有其他事情都是正确的(这很难从您的代码中分辨出来 - 例如,您确定 NSURL 的形成是否正确?),这很可能是错误的 - 您在播放器之前将图层添加到 NSView准备玩。如果不是,那么我会确保您的 NSURL 实际上指向您正在寻找的资源。

于 2013-08-20T17:11:26.090 回答
0

导入 AVFoundation

#import <AVFoundation/AVFoundation.h> 

创建 AVPlayer 对象和播放器层(我在标题中定义这些)

AVPlayer *avPlayer;
AVPlayerLayer* playerLayer;

假设您的课程在 NSView 中,告诉 NSView 您要使用图层

[self setWantsLayer:YES];

现在函数...

[avPlayer pause];
avPlayer = nil;
playerLayer = nil;

NSURL *videoURL = [NSURL fileURLWithPath:@"file://localhost/Users/matthewmichal/Desktop/A%20Good%20To%20Die%20Hard.mov"];
avPlayer = [AVPlayer playerWithURL:videoURL];
playerLayer = [AVPlayerLayer playerLayerWithPlayer:avPlayer];
playerLayer.frame = self.frame;//or your desired CGRect
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
//playerLayer.masksToBounds = YES;
[self.layer addSublayer:playerLayer];

[avPlayer play];
于 2015-12-15T16:18:22.700 回答