2009-08-12 4 views
57

Sto cercando di riprodurre il video in UIView, quindi il mio primo passo è stato quello di aggiungere una classe per quella vista e avviare la riproduzione di un filmato in esso utilizzando questo codice:iPhone SDK: come si riproduce un video all'interno di una vista? Piuttosto che fullscreen

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

Ma questo solo in crash il app quando si utilizza questo metodo all'interno della propria classe, ma va bene altrove. Qualcuno sa come riprodurre video all'interno di una vista? ed evitare di essere a schermo intero?

risposta

83

A partire dall'SDK 3.2 è possibile accedere alla proprietà vista di MPMoviePlayerController, modificarne la cornice e aggiungerla alla gerarchia della vista.

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

C'è un esempio qui: http://www.devx.com/wireless/Article/44642/1954

+0

Non funziona per i video di YouTube. Vedere un'implementazione qui: http://iosdevelopertips.com/video/display-youtube-videos-without-exiting-your-application.html – cyrilchampier

+1

MPMoviePlayerController è una cattiva libreria se si desidera un controllo specifico nell'ora corrente nel video. Non è esattamente, e ha bug. Il modo migliore è AVPlayer, utilizzando AVPlayerLayer. – jose920405

-5

Non è possibile riprodurre un video in una vista. Deve essere giocato a schermo intero.

+0

Ok, bene che è un peccato, ma ho visto altre applicazioni su AppStore in cui il video è stato giocato schermo non pieno, ma in una visione più piccola all'interno della schermata principale, quindi ci deve essere un modo. – Sam

+4

Forse quegli esempi di video in visione sono immagini sequenziali con una traccia extra di suono. – mga

+0

Probabilmente lo erano. Purtroppo. – Sneakyness

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

[self presentMoviePlayerViewControllerAnimated:playerv]; 
+0

questa risposta è errata –

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

Guardando il codice , è necessario impostare la cornice del v del controller del lettore film isualizza e aggiungi anche la vista del controller del lettore film alla tua vista. Inoltre, non dimenticare di aggiungere MediaPlayer.framework al tuo obiettivo.

Ecco alcuni esempi di codice:

#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 
+2

Ti amo !! Grazie mille, stavo cercando almeno un'ora e tu avevi l'unico codice che funzionava semplicemente! – LinusGeffarth

+1

Xcode 6, iOS 8 e funziona ancora. La chiave per me era il "prepararsi a giocare" oltre all'altra risposta. Grazie! –

+0

prendi nota che [moviePlayerController riproduce]; è in viewDidAppear ... se questo è in viewDidLoad, potresti vedere uno sfondo nero nel tuo "filmView" a seconda della tua versione Xcode/iOS. – whyoz

33

Il modo migliore è quello di utilizzare i livelli invece di visite:

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

Non dimenticate di aggiungere quadri:

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

Che cos'è queuePlayer in questo? –

+2

Ho cambiato il nome della variabile. – mdziadkowiec

+1

Ho fatto questo e tutto quello che ottengo è una scatola di colore rosso con la riproduzione audio ma nessun video:/ –

0

Usa il seguente metodo.

self.imageView_VedioContainer è la vista contenitore del numero 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]; 
} 
1

versione 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() 
} 
+0

Qual è la differenza tra l'importazione di 'AVFoundation' vs' AVKit'? – Suragch

+0

Non stai aggiungendo un altro livello ogni volta che l'utente riproduce il video? – Suragch

+0

@Suragch Non sono sicuro al 100%, ma penso che AVKit sia basato su AVFoundation, che è un kit più vecchio e di livello inferiore per la gestione della videocamera. E sì, è solo un esempio, quindi ogni volta aggiunge un livello, ma se hai diversi video da riprodurre, modifica il player invece dell'intero strato – Beninho85

1

Swift

Questo è un progetto autonomo in modo che si può vedere tutto nel contesto.

layout

creare un layout simile alla seguente con un UIView e UIButton. Il UIView sarà il contenitore in cui riprodurremo il nostro video.

enter image description here

Aggiungi un video per il progetto

Se avete bisogno di un video di esempio di praticare con, è possibile ottenere uno da sample-videos.com. In questo esempio sto usando un video in formato mp4. Trascina e rilascia il file video nel tuo progetto. Ho anche dovuto aggiungerlo esplicitamente alle risorse del bundle (vai a Fasi di compilazione> Copia risorse bundle, vedi this answer per ulteriori informazioni).

Codice

Ecco il codice completo per il progetto.

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

Note

  • Se avete intenzione di essere il passaggio dentro e fuori diversi video, è possibile utilizzare AVPlayerItem.
  • Se si utilizza solo AVFoundation e AVPlayer, è necessario creare tutti i propri controlli. Se si desidera la riproduzione di video a schermo intero, è possibile utilizzare AVPlayerViewController. È necessario importare AVKit per quello. Viene fornito con un set completo di controlli per pausa, avanzamento rapido, riavvolgimento, arresto, ecc. Here e here sono alcuni tutorial video.
  • MPMoviePlayerController che potresti aver visto in altre risposte è deprecato.

Risultato

Il progetto dovrebbe essere simile a questo ora.

enter image description here

Problemi correlati