2016-06-28 8 views
0

私はビューコントローラでビデオを使用しようとしていますが、フルスクリーンではなく、上のラベルと下のボタンのための十分なスペースがありますか?ユーザーがビデオをスキップしたり、終了した場合は、特定のviewControllerに移動する方法はありませんか?AVPlayer In表示

- (void)viewDidLoad { 
    [super viewDidLoad]; 

NSURL *videoURL = [[NSBundle mainBundle]URLForResource:@"TTPlaneHits" withExtension:@"mp4"]; 
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:_player]; 


AVPlayer *player = [AVPlayer playerWithURL:videoURL]; 
playerLayer.frame = CGRectMake(0, 21, self.view.frame.size.width, self.view.frame.size.height - 45 - 21); 
[self.view.layer addSublayer:playerLayer]; 
AVPlayerViewController *controller = [[AVPlayerViewController alloc]init]; 
controller.player = player; 
[player play]; 


[self.view addSubview:controller.view]; 
controller.view.frame = self.view.frame; 

答えて

4

あなたはクラスAVPlayerLayerのCoreAnimation層における AVPlayerのインスタンスで再生項目のビジュアルコンテンツを表示することができます。 にリアルタイム再生を他のCoreAnimationレイヤと同期させる場合、 はAVSynchronizedLayerを使用できます。 AVPlayerオブジェクトに AVVideoCompositionCoreAnimationToolのインスタンスを使用することはできません。 オフラインレンダリングの場合は、代わりにAVAssetExportSessionを使用する必要があります。

はこれを試してみてください:

(playerViewは、ストーリーボードに配置されたのUIViewのちょうどIBOutletである)

-(void)viewDidLoad { 
    [super viewDidLoad]; 

    NSURL *videoURL = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:@"test" ofType:@"mp4"]]; 

    AVPlayerItem *item = [AVPlayerItem playerItemWithURL:videoURL]; 
    AVPlayer *player = [AVPlayer playerWithPlayerItem:item]; 

    CALayer *superlayer = self.playerView.layer; 

    AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; 
    [playerLayer setFrame:self.playerView.bounds]; 
    playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
    [superlayer addSublayer:playerLayer]; 

    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(playerDidFinishPlaying:) name:AVPlayerItemDidPlayToEndTimeNotification object:item]; 


    [player seekToTime:kCMTimeZero]; 
    [player play]; 

} 

-(void)playerDidFinishPlaying:(NSNotification *)notification { 

    [self performSegueWithIdentifier:@"YourIdentifier" sender:self]; 
} 
+0

それはうまくいきましたが、ビデオはかなり大きめですが、私はそのviewcontrollerから移動するとバックグラウンドで再生を続け、オーディオで空にすることもできます。 – BARIIIIIIICODE

+1

videoGravityプロパティを 'AVLayerVideoGravityResizeAspectFit'に変更してみてください。プレーヤーを 'prepareForSegue:'メソッドで止めることができます。また、 'AVPlayer'をインスタンス変数にする必要があります – Kaitis

-1

あなただけAVPlayerLayerを使用し、それに応じて(あなたがどんなCALayerの場合と同様)フレームプロパティの設定場合は最も簡単かもしれません。ここでは例です:ビデオの最後に異なるのViewControllerにナビゲートするためとして

AVPlayer *player = [AVPlayer playerWithURL:videoURL]; 
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player]; 

//labelHeight is the height of your top label 
//buttonHeight is the height of your bottom button 
playerLayer.frame = CGRectMake(0, labelHeight, self.view.frame.size.width, self.view.frame.size.height - labelHeight - buttonHeight); 
[self.view.layer addSublayer:playerLayer]; 

、あなたがNSNotificationでコールバックを登録したいとしています。 @randomはそれを行う方法の素敵な説明を持っていますhere

アップルのドキュメントから
+0

編集コード、調整していないようですビューのサイズ変更はまだ画面全体を占めています。 – BARIIIIIIICODE

2

スウィフトバージョン

func addVideoPlayer(videoUrl: URL, to view: UIView) { 
    let player = AVPlayer(url: videoUrl) 
    let layer: AVPlayerLayer = AVPlayerLayer(player: player) 
    layer.backgroundColor = UIColor.white.cgColor 
    layer.frame = view.bounds 
    layer.videoGravity = .resizeAspectFill 
    view.layer.sublayers? 
     .filter { $0 is AVPlayerLayer } 
     .forEach { $0.removeFromSuperlayer() } 
    view.layer.addSublayer(layer) 
} 
関連する問題