Question

Je suis en train de lire la vidéo dans un UIView, donc ma première étape a consisté à ajouter une classe pour ce point de vue et commencer à jouer un film en utilisant ce code:

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

Mais ce juste l'application se bloque lorsque vous utilisez cette méthode à l'intérieur de sa propre classe, mais est très bien ailleurs. Est-ce que quelqu'un sait comment lire la vidéo dans une vue? et éviter tout plein écran?

Était-ce utile?

La solution

du SDK 3.2, vous pouvez accéder à la propriété vue de MPMoviePlayerController, modifier son cadre et l'ajouter à votre hiérarchie de la vue.

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

Il y a un exemple: http://www.devx.com/wireless/Article / 44642/1954

Autres conseils

La meilleure façon est d'utiliser des couches insted de vues:

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

Ne pas oublier d'ajouter des cadres:

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

En regardant votre code, vous devez définir le cadre du point de vue du contrôleur de lecteur vidéo et ajouter également le point de vue du contrôleur de lecteur vidéo à votre vue. En outre, ne pas oublier d'ajouter MediaPlayer.framework à votre cible.

Voici quelques exemples de code:

#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

Ceci est un projet autonome afin que vous puissiez voir tout dans le contexte.

Mise en page

Créer une mise en page comme celle-ci avec un UIView et un UIButton. Le UIView sera le conteneur dans lequel nous allons jouer notre vidéo.

 ici

Ajouter une vidéo au projet

Si vous avez besoin d'un exemple de vidéo à la pratique avec, vous pouvez en obtenir un de sample-videos.com . J'utilise un format mp4 vidéo dans cet exemple. Glissez et déposez le fichier vidéo dans votre projet. Je devais aussi l'ajouter explicitement dans les ressources de faisceau (allez à Construire des phases> Ressources Bundle Copier , voir cette répondre plus).

code

Voici le code complet du projet.

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

Remarques

  • Si vous allez passer dans et hors différentes vidéos, vous pouvez utiliser AVPlayerItem .
  • Si vous utilisez uniquement AVFoundation et AVPlayer , alors vous devez construire tous vos propres contrôles. Si vous voulez la lecture vidéo en plein écran, vous pouvez utiliser AVPlayerViewController. Vous devrez importer AVKit pour cela. Il est livré avec un ensemble complet de commandes pour pause, avance rapide, retour rapide, arrêt, etc. ici et sont quelques tutoriels vidéo.
  • MPMoviePlayerController que vous avez peut-être vu dans d'autres réponses est dépréciée.

Résultat

Le projet devrait ressembler à ceci maintenant.

 ici

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

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

A l'aide de la méthode suivante.

self.imageView_VedioContainer est la vue de votre conteneur 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];
}

Vous ne pouvez pas lire une vidéo dans une vue. Il doit être joué en plein écran.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top