6

AVPlayer のビデオ コンテンツを自分のビューに表示するための秘訣は何ですか?

次の AVPlayer コードを使用していますが、画面に何も表示されません。MPMoviePlayerController を使用して表示できたので、ビデオがあることがわかります。

使用しているコードは次のとおりです。

AVAsset *asset = [AVAsset assetWithURL:videoTempURL];
AVPlayerItem *item = [[AVPlayerItem alloc] initWithAsset:asset];
AVPlayer *player = [[AVPlayer alloc] initWithPlayerItem:item];
player.actionAtItemEnd = AVPlayerActionAtItemEndNone;
AVPlayerLayer *layer = [AVPlayerLayer playerLayerWithPlayer:player];
// layer.frame = self.view.frame;
[self.view.layer addSublayer:layer];
layer.backgroundColor = [UIColor clearColor].CGColor;
//layer.backgroundColor = [UIColor greenColor].CGColor;
[layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[player play];

現在のビューに対してレイヤーを不適切に設定していませんか?

4

2 に答える 2

14

レイヤーのフレーム プロパティを設定する必要があります。例えば:

 self.playerLayer.frame = CGRectMake(0, 0, 100, 100)

これを試してもビュー コントローラーのビューで機能しない場合は、レイヤーのframeプロパティをビュー コントローラーframeまたはが作成された時点のboundsプロパティに設定しようとした可能性があります。レイアウト パス中にプレーヤーのフレームを設定する必要があります。その時点で、View-Controllerは 以外に設定されます。これを正しく行うには:{0, 0, 0, 0}AVPlayerLayerframe{0, 0, 0, 0}

カスタム UIView (IB を含む) で自動レイアウトを使用している場合:

override func layoutSubviews() {
    super.layoutSubviews()

    //Match size of view
    CATransaction.begin()
    CATransaction.setDisableActions(true)
    self.playerLayer.frame = self.bounds
    CATransaction.commit()
}

カスタム UIViewController で自動レイアウトを使用している場合:

override fun viewDidLayoutSubviews() {
  //Match size of view-controller
  CATransaction.begin()
  CATransaction.setDisableActions(true)
  self.playerLayer.frame = self.view.bounds
  CATransaction.commit()
}

行は、CATransactionレイヤーのフレーム変更で暗黙的なアニメーションを無効にすることです。なぜこれが通常必要ないのか疑問に思っている場合は、UIView をサポートするレイヤーがデフォルトで暗黙的にアニメーション化されないためです。この場合、非ビュー バッキング レイヤー ( AVPlayerLayer)を使用しています。

最善の方法は、インターフェイス ビルドを介してビュー コントローラーに新しいビューを追加し、新しく追加されたビューにカスタム クラスを設定することです。次に、そのカスタム ビュー クラスを作成し、layoutSubviewsコードを実装します。

于 2015-12-17T01:15:28.437 に答える
3

AVPlayer を再生するには、独自のコンテキスト ビューが必要であることがわかりました。

このコードを追加すると、ビデオが再生されます。残念ながら、AVPlayer には MPMoviePlayerController とは異なり、コントロールが組み込まれていません。標準化されていないビデオ再生オプションを備えたツールを Apple が廃止する理由は不明です。

UIView *containerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0, 320.0f, 200.0f)];
layer.frame = self.view.frame;
[containerView.layer addSublayer:layer];
[self.view addSubview:containerView];
layer.backgroundColor = [UIColor greenColor].CGColor;
[layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];
[player play];
于 2015-07-14T09:57:46.843 に答える