1

AVFoundation によって再生されているビデオの上にオーバーレイされる NSView をセットアップしようとしています。ネイティブのクイックタイム プレーヤーに似たものを作成したいだけです。OS X アプリケーションでこれを実行しようとしています。

ビデオを再生するビューとコントロールを含むビューの 2 つのサブビューを持つ NSView をセットアップしました。ビデオの再生を開始するたびに、コントロール ビューがビデオ再生ビューの後ろに押し出され、コントロール ビューが役に立たなくなります。

この問題は、ビュー階層で同じレベルにある 2 つのサブビューを重ねることに関係していると思います。この問題は、コントロール ビューをビデオ再生ビューのサブビューにするという解決策につながります。問題は、AVFoundation でビデオを再生するには、ビデオ再生ビューがレイヤー ホスティング ビューになる必要があり、サブビューを持つことができないことです。

私が問題を解決しようとしたこと:

  • addSubview:positioned:relativeTo:ビューを並べ替えるために使用します。
  • スーパー ビューとコントロール ビュー レイヤーを裏打ちします。

これらのソリューションを間違って使用している可能性があるため、うまくいくと思われる場合はお知らせください。

これが、ビデオ再生ビューを設定する方法です。

self.playerItem = [AVPlayerItem playerItemWithAsset:self.asset];
[self.playerItem addObserver:self forKeyPath:@"status"
             options:0 context:&ItemStatusContext];
self.player = [AVPlayer playerWithPlayerItem:self.playerItem];

self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player];

[self.playerView setLayer:self.playerLayer];
[self.playerView setWantsLayer:YES];

これは、動画再生でよくあることのように思われるので、解決策をご存知の方がいらっしゃいましたら教えてください。ありがとう!

4

1 に答える 1

2

ドキュメントには、レイヤー ホスト ビューにサブビューを含めることはできないとは記載されていません。レイヤー ホスト ビューにサブビューを追加することはできないと書かれているだけです。最初に必要なすべてのサブビューをビューに追加してから、それをレイヤー ホスト ビューに変換できます。ただし、その場合でも、レイヤーとサブビューの順序は決定論的ではありません。

メイン ビュー内に 2 つのサブビューを作成することで問題を解決しました。サブビューの 1 つはレイヤーでホストされ、ビデオ再生レイヤーがあります。もう 1 つのサブビューは、コントロールを含むレイヤーに基づくビューです。この問題を解決した方法は次のとおりです。

   [self setWantsLayer:YES]; // Turn your main view into a layer backed view, so ordering of subviews is deterministic.

    _controlsView = [[NSView alloc]initWithFrame:frame];        
    _playButtonOverlay = [[NSImageView alloc] initWithFrame:frame];
    [ _playButtonOverlay setImage:[NSImage imageNamed:@"play_overlay"]];
    [_controlsView addSubview:_playOverlay];

    _videoView = [[NSView alloc]initWithFrame:frame];
    _playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player];        
    [_videoView setLayer:_playerLayer]; // make this subview layer-hosted
    [_videoView setWantsLayer:YES];
    [self insertSubview:_videoView belowSubview:_controlsView];

まだ参照していない場合は、NSView の setWantsLayer のドキュメントを参照してください。それは言います:

「レイヤーに支えられたビューは、コア アニメーション レイヤーに支えられたビューです。ビューによって行われたすべての描画は、バッキング レイヤーにキャッシュされます。setWantsLayer: を YES の値で呼び出して、レイヤーに支えられたビューを構成します。

「レイヤー ホスティング ビューは、直接操作する予定のコア アニメーション レイヤーを含むビューです。レイヤー ホスティング ビューを作成するには、コア アニメーション レイヤー クラスをインスタンス化し、そのレイヤーをビューの setLayer: メソッドに提供します。その後、の場合、値を YES にして setWantsLayer: を呼び出します。このメソッドの順序は非常に重要です。"

于 2013-08-16T23:23:43.390 に答える