Frage

Ich versuche, das Video in einem UIView zu spielen, so mein erster Schritt war eine Klasse für diese Ansicht hinzuzufügen und startet einen Film darin spielen, um diesen Code verwenden:

- (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];
}

Aber das stürzt nur die App, wenn Sie diese Methode in seiner eigenen Klasse verwendet, ist aber an anderer Stelle in Ordnung. Wer weiß, wie das Video in einer Ansicht zu spielen? und vermeiden Sie es Vollbild zu sein?

War es hilfreich?

Lösung

Ab dem 3.2 SDK können Sie die Ansicht Eigenschaft MPMoviePlayerController zuzugreifen, ändern ihren Rahmen und fügen Sie es Ihrer Ansicht Hierarchie.

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

Es gibt hier ein Beispiel: http://www.devx.com/wireless/Article / 44642/1954

Andere Tipps

Der beste Weg ist, Schichten zu verwenden insted die Ansichten:

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];

Vergessen Sie nicht Rahmen hinzuzufügen:

#import <QuartzCore/QuartzCore.h>
#import "AVFoundation/AVFoundation.h"

in Ihrem Code sucht, müssen Sie den Rahmen der Video-Player-Controller Ansicht einzustellen und auch die Video-Player-Controller Ansicht zu Ihrer Ansicht hinzuzufügen. Vergessen Sie auch nicht hinzuzufügen MediaPlayer.framework , um Ihr Ziel.

Hier ist ein Beispielcode:

#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

Swift

Dies ist ein eigenständiges Projekt, so dass Sie alles in Zusammenhang sehen.

Layout

Erstellen Sie ein Layout wie die folgenden mit einem UIView und einem UIButton. Die UIView wird der Behälter, in dem wir unser Video abgespielt werden.

 image description hier

Füge ein Video zu dem Projekt

Wenn Sie ein Beispielvideo müssen mit üben, können Sie erhalten von sample-videos.com . Ich bin mit einem MP4-Format Video in diesem Beispiel. Ziehen Sie und die Videodatei in Ihr Projekt fallen. Ich hatte auch sie (gehen Sie zu Build Phasen> Copy Bundle Ressourcen explizit in die Bündel Ressourcen hinzuzufügen, finden Sie unter beantworten für weitere Informationen).

Code

Hier ist der vollständige Code für das Projekt.

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()
    }
}

Notizen

  • Wenn Sie in und aus verschiedenen Videos zu gehen wechseln, können Sie verwenden, AVPlayerItem .
  • Wenn Sie mit nur AVFoundation und AVPlayer , dann müssen Sie alle bauen Ihre eigenen Kontrollen. Wenn Sie Vollbild-Video-Wiedergabe möchten, können Sie AVPlayerViewController . Sie werden AVKit dafür importieren müssen. Es kommt mit einem vollständigen Satz von Kontrollen für Pause, Vorspulen, Zurückspulen, Stop etc. hier und hier sind einige Video-Tutorials.
  • MPMoviePlayerController, die Sie in anderen Antworten gesehen haben ist veraltet.

Ergebnis

Das Projekt sollte nun wie folgt aussehen.

 image description hier

NSString * pathv = [[NSBundle mainBundle] pathForResource:@"vfile" ofType:@"mov"];
playerv = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:pathv]];

[self presentMoviePlayerViewControllerAnimated:playerv];
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;
  }

Swift-Version:

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()
}

Verwenden Sie das folgende Verfahren.

self.imageView_VedioContainer ist der Container Ansicht Ihrer 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];
}

Sie können nicht ein Video in einer Ansicht spielen. Es hat in dem Vollbild abgespielt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top