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 の status プロパティの更新を監視するために登録することです。

ただし、AVAsset と同様に、単にプレーヤー アイテムを初期化したからといって、すぐに再生できる状態になるとは限りません。アイテムの status プロパティを (キー値の監視を使用して) 監視して、再生する準備ができているかどうか、いつ再生できるかを判断できます。

他のすべてが正しいと仮定すると (たとえば、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 に答える