61

内でビデオを再生しようとしているUIViewので、最初のステップは、そのビューのクラスを追加し、次のコードを使用してそのビューで映画の再生を開始することでした。

- (IBAction)movie:(id)sender{
    NSBundle *bundle = [NSBundle mainBundle];
        NSString *moviePath = [bundle pathForResource:@"Movie" ofType:@"m4v"];
    NSURL *movieURL = [[NSURL fileURLWithPath:moviePath] retain];
    MPMoviePlayerController *theMovie = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    theMovie.scalingMode = MPMovieScalingModeAspectFill;
    [theMovie play];
}

ただし、これは、独自のクラス内でこのメソッドを使用するとアプリをクラッシュさせるだけですが、他の場所では問題ありません。ビュー内でビデオを再生する方法を知っている人はいますか?フルスクリーンになるのを避けますか?

4

9 に答える 9

83

3.2 SDK以降、のviewプロパティにアクセスし、MPMoviePlayerControllerそのフレームを変更して、ビュー階層に追加できます。

MPMoviePlayerController *player = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileURLWithPath:url]];
player.view.frame = CGRectMake(184, 200, 400, 300);
[self.view addSubview:player.view];
[player play];

ここに例があります:http ://www.devx.com/wireless/Article/44642/1954

于 2010-05-29T08:45:06.963 に答える
35

最良の方法は、ビューの代わりにレイヤーを使用することです。

AVPlayer *player = [AVPlayer playerWithURL:[NSURL url...]]; // 

AVPlayerLayer *layer = [AVPlayerLayer layer];

[layer setPlayer:player];
[layer setFrame:CGRectMake(10, 10, 300, 200)];
[layer setBackgroundColor:[UIColor redColor].CGColor];
[layer setVideoGravity:AVLayerVideoGravityResizeAspectFill];

[self.view.layer addSublayer:layer];

[player play];

フレームワークを追加することを忘れないでください:

#import <QuartzCore/QuartzCore.h>
#import "AVFoundation/AVFoundation.h"
于 2013-05-21T21:32:59.317 に答える
19

迅速

これは自己完結型のプロジェクトであるため、すべてをコンテキストで確認できます。

レイアウト

UIViewとを使用して、次のようなレイアウトを作成しますUIButtonUIViewビデオを再生するコンテナになります。

ここに画像の説明を入力してください

プロジェクトにビデオを追加する

練習用のサンプルビデオが必要な場合は、sample-videos.comから入手できます。この例では、mp4形式のビデオを使用しています。ビデオファイルをプロジェクトにドラッグアンドドロップします。また、バンドルリソースに明示的に追加する必要がありました([ビルドフェーズ]> [バンドルリソースのコピー]に移動します。詳細については、この回答を参照してください)。

コード

これがプロジェクトの完全なコードです。

import UIKit
import AVFoundation

class ViewController: UIViewController {

    var player: AVPlayer?

    @IBOutlet weak var videoViewContainer: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        initializeVideoPlayerWithVideo()
    }

    func initializeVideoPlayerWithVideo() {

        // get the path string for the video from assets
        let videoString:String? = Bundle.main.path(forResource: "SampleVideo_360x240_1mb", ofType: "mp4")
        guard let unwrappedVideoPath = videoString else {return}

        // convert the path string to a url
        let videoUrl = URL(fileURLWithPath: unwrappedVideoPath)

        // initialize the video player with the url
        self.player = AVPlayer(url: videoUrl)

        // create a video layer for the player
        let layer: AVPlayerLayer = AVPlayerLayer(player: player)

        // make the layer the same size as the container view
        layer.frame = videoViewContainer.bounds

        // make the video fill the layer as much as possible while keeping its aspect size
        layer.videoGravity = AVLayerVideoGravity.resizeAspectFill

        // add the layer to the container view
        videoViewContainer.layer.addSublayer(layer)
    }

    @IBAction func playVideoButtonTapped(_ sender: UIButton) {
        // play the video if the player is initialized
        player?.play()
    }
}

ノート

  • 別のビデオを切り替えたり切り替えたりする場合は、を使用できますAVPlayerItem
  • とのみを使用している場合AVFoundationAVPlayer、独自のコントロールをすべて作成する必要があります。フルスクリーンのビデオ再生が必要な場合は、を使用できますAVPlayerViewController。そのためにインポートする必要がありますAVKit。一時停止、早送り、巻き戻し、停止などのコントロールのフルセットが付属しています。ここここにいくつかのビデオチュートリアルがあります。
  • MPMoviePlayerController他の回答で見たことがあるかもしれませんが、非推奨になりました。

結果

プロジェクトは次のようになります。

ここに画像の説明を入力してください

于 2017-11-21T13:12:10.623 に答える
15

コードを見て、ムービープレーヤーコントローラーのビューのフレームを設定し、ムービープレーヤーコントローラーのビューをビューに追加する必要があります。また、 MediaPlayer.frameworkをターゲットに追加することを忘れないでください。

サンプルコードは次のとおりです。

#import <MediaPlayer/MediaPlayer.h>

@interface ViewController () {
    MPMoviePlayerController *moviePlayerController;
}

@property (weak, nonatomic) IBOutlet UIView *movieView; // this should point to a view where the movie will play

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    // Instantiate a movie player controller and add it to your view
    NSString *moviePath = [[NSBundle mainBundle] pathForResource:@"foo" ofType:@"mov"];
    NSURL *movieURL = [NSURL fileURLWithPath:moviePath];    
    moviePlayerController = [[MPMoviePlayerController alloc] initWithContentURL:movieURL];
    [moviePlayerController.view setFrame:self.movieView.bounds];  // player's frame must match parent's
    [self.movieView addSubview:moviePlayerController.view];

    // Configure the movie player controller
    moviePlayerController.controlStyle = MPMovieControlStyleNone;        
    [moviePlayerController prepareToPlay];
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    // Start the movie
    [moviePlayerController play];
}

@end
于 2013-02-21T11:33:17.390 に答える
5
NSString * pathv = [[NSBundle mainBundle] pathForResource:@"vfile" ofType:@"mov"];
playerv = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:pathv]];

[self presentMoviePlayerViewControllerAnimated:playerv];
于 2012-02-10T12:20:11.650 に答える
2
NSURL *url = [NSURL URLWithString:[exreciesDescription objectForKey:@"exercise_url"]];
moviePlayer =[[MPMoviePlayerController alloc] initWithContentURL: url];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doneButtonClicked) name:MPMoviePlayerWillExitFullscreenNotification object:nil];
[[moviePlayer view] setFrame: [self.view bounds]];  // frame must match parent view
[self.view addSubview: [moviePlayer view]];
[moviePlayer play];

-(void)playMediaFinished:(NSNotification*)theNotification 
{
    moviePlayer=[theNotification object];
    [[NSNotificationCenter defaultCenter] removeObserver:self
                                                    name:MPMoviePlayerPlaybackDidFinishNotification
                                                  object:moviePlayer];


    [moviePlayer.view removeFromSuperview];
}

-(void)doneButtonClicked
  {
         [moviePlayer stop];
        [moviePlayer.view removeFromSuperview];
         [self.navigationController popViewControllerAnimated:YES];//no need this if you are      opening the player in same screen;
  }
于 2013-02-07T13:17:37.083 に答える
1

Swiftバージョン:

import AVFoundation

func playVideo(url: URL) {

    let player = AVPlayer(url: url)

    let layer: AVPlayerLayer = AVPlayerLayer(player: player)
    layer.backgroundColor = UIColor.white.cgColor
    layer.frame = CGRect(x: 0, y: 0, width: 300, height: 300)
    layer.videoGravity = .resizeAspectFill
    self.view.layer.addSublayer(layer)

    player.play()
}
于 2016-05-20T19:43:47.457 に答える
0

次の方法を使用します。

self.imageView_VedioContainerのコンテナビューですAVPlayer

- (void)playMedia:(UITapGestureRecognizer *)tapGesture
{
    playerViewController = [[AVPlayerViewController alloc] init];

    playerViewController.player = [AVPlayer playerWithURL:[[NSBundle mainBundle]
                                                 URLForResource:@"VID"
                                                         withExtension:@"3gp"]];
    [playerViewController.player play];
    playerViewController.showsPlaybackControls =YES;
    playerViewController.view.frame=self.imageView_VedioContainer.bounds;
    [playerViewController.view setAutoresizingMask:UIViewAutoresizingNone];// you can comment this line 
    [self.imageView_VedioContainer addSubview: playerViewController.view];
}
于 2016-01-22T11:03:29.053 に答える
-5

ビュー内でビデオを再生することはできません。フルスクリーンで再生する必要があります。

于 2009-08-12T15:06:04.963 に答える