web-dev-qa-db-fra.com

iPhone SDK: Comment lire une vidéo dans une vue? Plutôt qu'en plein écran

J'essaie de lire une vidéo à l'intérieur d'un UIView, alors ma première étape a été d'ajouter une classe pour cette vue et de commencer à y lire un film en utilisant le code suivant:

- (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 cela ne fait que bloquer l'application lorsque cette méthode est utilisée dans sa propre classe, mais c'est très bien ailleurs. Est-ce que quelqu'un sait lire une vidéo dans une vue? et éviter que ce soit en plein écran?

59
Sam

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

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 ici: http://www.devx.com/wireless/Article/44642/1954

83
tobyc

Le meilleur moyen consiste à utiliser des calques au lieu 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];

N'oubliez pas d'ajouter des frameworks:

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

En regardant votre code, vous devez définir le cadre de la vue du contrôleur de lecteur de film et également ajouter la vue du contrôleur de lecteur de film à votre vue. De plus, n'oubliez pas d'ajouter MediaPlayer.framework à votre cible.

Voici un exemple 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
15
jrc

Swift

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

Disposition

Créez 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.

enter image description here

Ajouter une vidéo au projet

Si vous avez besoin d'un exemple de vidéo pour vous exercer, vous pouvez en obtenir un de sample-videos.com . J'utilise une vidéo au format MP4 dans cet exemple. Glissez et déposez le fichier vidéo dans votre projet. Je devais aussi l'ajouter explicitement aux ressources du paquet (voir Phases de construction> Copier les ressources du paquet , voir cette réponse pour 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()
    }
}

Notes

  • Si vous souhaitez activer et désactiver différentes vidéos, vous pouvez utiliser AVPlayerItem .
  • Si vous utilisez uniquement AVFoundation et AVPlayer , vous devez créer tous vos propres contrôles. Si vous voulez une lecture vidéo en plein écran, vous pouvez utiliser AVPlayerViewController . Vous devrez importer AVKit pour cela. Il est livré avec un ensemble complet de contrôles pour la pause, l'avance rapide, le rembobinage, l'arrêt, etc. ici et ici sont quelques tutoriels vidéo.
  • MPMoviePlayerController que vous avez peut-être vu dans d'autres réponses est obsolète.

Résultat

Le projet devrait ressembler à ça maintenant.

enter image description here

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

[self presentMoviePlayerViewControllerAnimated:playerv];
5
Shailesh
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;
  }
2
Darshan Kunjadiya

Version rapide:

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

Utilisez la méthode suivante.

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