2009-08-12 4 views
57

Я пытаюсь играть видео внутри UIView, поэтому мой первый шаг должен был добавить класс для этой точки зрения и начать играть в кино в нем, используя этот код:iPhone SDK: Как вы воспроизводите видео в представлении? Вместо того, полноэкранный режим

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

Но это только терпит крах при использовании этого метода внутри собственного класса, но в другом месте. Кто-нибудь знает, как воспроизводить видео в представлении? и избегать его полного экрана?

ответ

83

Начиная с 3.2 SDK вы можете получить доступ к свойству вида MPMoviePlayerController, изменить его фрейм и добавить его в свою иерархию представления.

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

Там пример здесь: http://www.devx.com/wireless/Article/44642/1954

+0

Не работайте с видеороликами youtube. См. Реализацию здесь: http://iosdevelopertips.com/video/display-youtube-videos-without-exiting-your-application.html – cyrilchampier

+1

MPMoviePlayerController - плохая библиотека, если вы хотите, чтобы в данный момент в вашем видео было определенное управление. Не совсем, и есть ошибки. Лучший способ - AVPlayer, используя AVPlayerLayer. – jose920405

-5

Вы не можете воспроизводить видеоролик в представлении. Он должен воспроизводиться в полноэкранном режиме.

+0

Хорошо, хорошо, что это позор, но я видел другие приложения на AppStore, где видео воспроизводились не полный экран, но в меньшем зрения внутри основного экрана, так что должен быть способ. – Sam

+4

Возможно, эти примеры видео-в-окне были последовательными изображениями с дополнительным звуком. – mga

+0

Они, вероятно, были. К сожалению. – Sneakyness

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

[self presentMoviePlayerViewControllerAnimated:playerv]; 
+0

этот ответ неправильный –

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

Глядя на ваш код , вам необходимо установить рамку контроллера видеопроигрывателя v iew, а также добавьте представление контроллера видеоплеера к вашему представлению. Кроме того, не забудьте добавить MediaPlayer.framework в вашу цель.

Вот некоторые примеры кода:

#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

Я тебя люблю !! Большое вам спасибо, я искал по крайней мере час, и у вас был единственный код, который просто работал! – LinusGeffarth

+1

Xcode 6, iOS 8, и это все еще работает. Ключом для меня было «подготовить игру» к другому ответу. Благодаря! –

+0

также обратите внимание, что [moviePlayerController play]; находится в viewDidAppear ... если это в viewDidLoad, вы можете просто увидеть черный фон в вашем «movieView» в зависимости от вашей версии Xcode/iOS. – whyoz

33

Лучший способ заключается в использовании слоев InstEd просмотров:

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

Не забудьте добавить рамки:

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

Что такое queuePlayer? –

+2

Я изменил имя переменной. – mdziadkowiec

+1

Я сделал это, и все, что я получаю, это коробка с красным цветом с воспроизведением звука, но нет видео:/ –

0

Используйте следующий метод.

self.imageView_VedioContainer - вид контейнера вашего 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

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

В чем разница между импортом 'AVFoundation' и' AVKit'? – Suragch

+0

Разве вы не добавляете еще один слой каждый раз, когда пользователь воспроизводит видео? – Suragch

+0

@Suragch Я не уверен на 100%, но я думаю, что AVKit построен сверху на AVFoundation, который является более старым и более низким уровнем для управления камерой. И да, это просто пример, поэтому каждый раз добавляем слой, но если у вас есть несколько видео для воспроизведения, просто отредактируйте плеер, а не весь слой. – Beninho85

1

Swift

Это автономный проект, так что вы можете видеть все в контексте.

Layout

Создание макета, как следующее с UIView и UIButton. UIView будет контейнером, в котором мы будем воспроизводить наше видео.

enter image description here

Добавить видео в проект

Если вам нужен образец видео, чтобы практиковать с, вы можете получить один из sample-videos.com. В этом примере я использую видео в формате mp4. Перетащите видеофайл в свой проект. Я также должен был добавить его явно в ресурсы пакета (перейдите к «Сборка фаз»> «Ресурсы копий», см. this answer для получения дополнительной информации).

Код

Вот полный код проекта.

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

Примечание

  • Если вы собираетесь быть переключение в и из различных видео, вы можете использовать AVPlayerItem.
  • Если вы используете только AVFoundation и AVPlayer, вам необходимо создать все свои собственные элементы управления. Если вы хотите полноэкранное воспроизведение видео, вы можете использовать AVPlayerViewController. Вам нужно будет импортировать AVKit. Он поставляется с полным набором элементов управления для паузы, быстрой перемотки вперед, перемотки назад, остановки и т. Д. Here и here - некоторые видеоуроки.
  • MPMoviePlayerController, который вы, возможно, видели в других ответах, устарел.

Результат

проект должен выглядеть, как это сейчас.

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^