2009-08-12 1 views
57

Ich versuche, das Video in einem UIView zu spielen, so mein erster Schritt eine Klasse für diese Ansicht hinzuzufügen war und starten Sie einen Film in sie spielen, um diesen Code verwenden:iPhone SDK: Wie spielt man Video in einer Ansicht ab? Anstatt Vollbild

- (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 diese stürzt nur die App, wenn Sie diese Methode innerhalb der eigenen Klasse verwenden, aber an anderer Stelle in Ordnung ist. Kann jemand Video in einer Ansicht wiedergeben? und vermeiden, dass es Vollbild ist?

Antwort

83

Ab dem 3.2 SDK können Sie auf die View-Eigenschaft von MPMoviePlayerController zugreifen, seinen Rahmen ändern und ihn zu Ihrer Ansichtshierarchie hinzufügen.

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

+0

Nicht für Youtube-Videos arbeiten. Sehen Sie eine Implementierung hier: http://iosdevelopertips.com/video/display-youtube-videos-without-exiting-your-application.html – cyrilchampier

+1

MPMoviePlayerController ist eine schlechte Bibliothek, wenn Sie bestimmte Kontrolle in der aktuellen Zeit in Video wünschen. Ist nicht genau, und habe Fehler. Der beste Weg ist AVPlayer mit AVPlayerLayer. – jose920405

-5

Sie können ein Video nicht in einer Ansicht wiedergeben. Es muss im Vollbildmodus abgespielt werden.

+0

Ok, gut, das ist eine Schande, aber ich habe andere Anwendungen auf dem Appstore gesehen, wo Video nicht Vollbild gespielt wurde, aber in einem kleineren Blick in den Hauptbildschirm, so dass es einen Weg geben muss. – Sam

+4

Vielleicht sind diese Beispiele für Video-in-Bild sequenzielle Bilder mit einer zusätzlichen Tonspur. – mga

+0

Sie waren wahrscheinlich. Traurig. – Sneakyness

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

[self presentMoviePlayerViewControllerAnimated:playerv]; 
+0

Diese Antwort ist falsch –

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

an Ihrem Code suchen , müssen Sie den Rahmen des Movie Player-Controller v einstellen Sehen Sie sich auch die Ansicht des Movie-Player-Controllers an. Vergessen Sie auch nicht, MediaPlayer.framework zu Ihrem Ziel hinzuzufügen.

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

Ich liebe dich !! Vielen Dank, ich habe jetzt mindestens eine Stunde gesucht und du hattest den einzigen Code, der einfach funktioniert hat! – LinusGeffarth

+1

Xcode 6, iOS 8 und das funktioniert immer noch. Schlüssel für mich war die "Vorbereitung zum Spielen" neben der anderen Antwort. Vielen Dank! –

+0

Beachten Sie auch, dass [moviePlayerController spielen]; is in viewDidAppear ... wenn dies in viewDidLoad ist, siehst du in deinem "movieView" je nach deiner Xcode/iOS Version einen schwarzen Hintergrund. – whyoz

33

Der beste Weg ist Schichten Ansichten insted zu verwenden:

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

Frameworks Vergessen Sie nicht hinzuzufügen:

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

Was ist der queuePlayer in diesem? –

+2

Ich habe den Variablennamen geändert. – mdziadkowiec

+1

Ich habe dies getan und alles, was ich bekomme, ist eine rote Box mit dem Audio-Playing aber kein Video:/ –

0

Verwenden die folgende Methode.

self.imageView_VedioContainer ist die Containeransicht Ihres .

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

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

Was ist der Unterschied zwischen dem Import von AVFoundation und AVKit? – Suragch

+0

Fügen Sie nicht jedes Mal, wenn der Benutzer das Video wiedergibt, eine weitere Ebene hinzu? – Suragch

+0

@Suragh Ich bin mir nicht 100% sicher, aber ich denke AVKit baut auf AVFoundation auf, einem älteren und niedrigeren Kit für die Verwaltung der Kamera. Und ja, es ist nur ein Beispiel, so dass es jedes Mal eine Ebene hinzufügt, aber wenn Sie mehrere Videos zu spielen haben, bearbeiten Sie einfach den Player statt der gesamten Ebene – Beninho85

1

Swift

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

Layout-

ein Layout wie folgt erstellen mit einem UIView und einem UIButton. Die UIView wird der Container sein, in dem wir unser Video abspielen werden.

enter image description here

ein Video zum Projekt hinzufügen

Wenn Sie ein Beispielvideo müssen mit üben, können Sie eine von sample-videos.com bekommen kann. Ich verwende in diesem Beispiel ein Video im mp4-Format. Ziehen Sie die Videodatei in Ihr Projekt und legen Sie sie dort ab. Ich musste es auch explizit in die Bundle-Ressourcen hinzufügen (gehe zu Build-Phasen> Kopiere Bundle-Ressourcen, siehe this answer für mehr).

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

Hinweise

  • Wenn Sie in und aus verschiedenen Videos zu gehen wechseln, können Sie AVPlayerItem verwenden. Wenn Sie nur AVFoundation und AVPlayer verwenden, müssen Sie alle Ihre eigenen Steuerelemente erstellen. Wenn Sie die Videowiedergabe im Vollbildmodus möchten, können Sie AVPlayerViewController verwenden. Sie müssen dazu AVKit importieren. Es kommt mit einem vollständigen Satz von Steuerelementen für Pause, schnellen Vorlauf, Rücklauf, Stopp usw. Here und here sind einige Video-Tutorials.
  • MPMoviePlayerController, die Sie in anderen Antworten gesehen haben, ist veraltet.

Ergebnis

Das Projekt sollte nun wie folgt aussehen.

enter image description here