wake-up-neo.com

iPhone SDK: Wie können Sie Videos in einer Ansicht abspielen? Anstatt im Vollbildmodus

Ich versuche, ein Video in einem UIView abzuspielen. Daher bestand mein erster Schritt darin, eine Klasse für diese Ansicht hinzuzufügen und darin einen Film mit folgendem Code abzuspielen:

- (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 dies bringt die App nur zum Absturz, wenn diese Methode in ihrer eigenen Klasse verwendet wird, ist aber an anderer Stelle in Ordnung. Weiß jemand, wie man ein Video in einer Ansicht abspielt? und vermeiden, dass es im Vollbildmodus angezeigt wird?

59
Sam

Ab dem 3.2 SDK können Sie auf die Ansichtseigenschaft von MPMoviePlayerController zugreifen, ihren Rahmen ändern und sie 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];

Hier ist ein Beispiel: http://www.devx.com/wireless/Article/44642/1954

83
tobyc

Der beste Weg ist, Ebenen anstelle von Ansichten 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];

Vergessen Sie nicht, Frameworks hinzuzufügen:

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

Wenn Sie sich Ihren Code ansehen, müssen Sie den Frame der Ansicht des Movie Player-Controllers festlegen und die Ansicht des Movie Player-Controllers zu Ihrer Ansicht hinzufügen. Vergessen Sie auch nicht, Ihrem Ziel MediaPlayer.framework 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
15
jrc

Swift

Dies ist ein eigenständiges Projekt, sodass Sie alles im Kontext sehen können.

Layout

Erstellen Sie ein Layout wie das folgende mit einem UIView und einem UIButton. Das UIView ist der Container, in dem wir unser Video abspielen.

enter image description here

Fügen Sie dem Projekt ein Video hinzu

Wenn Sie ein Beispielvideo zum Üben benötigen, können Sie eines von sample-videos.com herunterladen. In diesem Beispiel verwende ich ein Video im MP4-Format. Ziehen Sie die Videodatei per Drag & Drop in Ihr Projekt. Ich musste es auch explizit zu den Bundle-Ressourcen hinzufügen (gehe zu Phasen erstellen> Bundle-Ressourcen kopieren , siehe diese Antwort 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()
    }
}

Notizen

  • Wenn Sie verschiedene Videos ein- und ausschalten möchten, können Sie AVPlayerItem verwenden.
  • Wenn Sie nur AVFoundation und AVPlayer verwenden, müssen Sie alle Ihre eigenen Steuerelemente erstellen. Wenn Sie eine Vollbild-Videowiedergabe wünschen, können Sie AVPlayerViewController verwenden. Dazu müssen Sie AVKit importieren. Es kommt mit einem vollständigen Satz von Steuerelementen für Pause, schnellen Vorlauf, Rücklauf, Stopp usw. hier und hier sind einige Video-Tutorials.
  • MPMoviePlayerController, das Sie möglicherweise in anderen Antworten gesehen haben, ist veraltet.

Ergebnis

Das Projekt sollte jetzt so aussehen.

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

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

Verwenden Sie die folgende Methode.

self.imageView_VedioContainer ist die Containeransicht Ihres 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