IPhone SDK: как вы воспроизводите видео внутри представления? Вместо полноэкранного
Я пытаюсь воспроизвести видео внутри UIView
, поэтому первым моим шагом было добавить класс для этого представления и начать воспроизведение фильма в нем с помощью этого кода:
- (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];
}
Но это просто сбой приложения при использовании этого метода внутри него собственного класса, но все в порядке. Кто-нибудь знает, как воспроизводить видео в представлении? и избежать его полного экрана?
Ответы
Ответ 1
Как и в SDK 3.2, вы можете получить доступ к свойству вида 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
Ответ 2
Лучше всего использовать слои insted views:
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"
Ответ 3
Глядя на свой код, вам нужно установить кадр просмотра контроллера видеоплеера, а также добавить вид контроллера плеера для просмотра. Кроме того, не забудьте добавить 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 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
Ответ 4
Объединение различных решений в одном месте для воспроизведения видео с помощью iOS 4.2
http://codevelle.wordpress.com/2011/01/07/videoplayer-for-ios-4-2/
Ответ 5
NSString * pathv = [[NSBundle mainBundle] pathForResource:@"vfile" ofType:@"mov"];
playerv = [[MPMoviePlayerViewController alloc] initWithContentURL:[NSURL fileURLWithPath:pathv]];
[self presentMoviePlayerViewControllerAnimated:playerv];
Ответ 6
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;
}
Ответ 7
Быстрая версия:
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()
}
Ответ 8
Используйте следующий метод.
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];
}
Ответ 9
Swift
Это самостоятельный проект, чтобы вы могли видеть все в контексте.
Разметка
Создайте макет, как показано ниже, с помощью UIView
и UIButton
. UIView
будет контейнером, в котором мы будем воспроизводить наше видео.
![введите описание изображения здесь]()
Добавить видео в проект
Если вам нужно примерное видео, на которое вы можете практиковать, вы можете получить его от sample-videos.com. В этом примере я использую видео в формате mp4. Перетащите видеофайл в свой проект. Я также должен был добавить его явно в ресурсы пакета (перейдите в Сборка фаз > Копировать ресурсы Bundle, см. этот ответ).
Код
Вот полный код проекта.
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
. Он поставляется с полным набором элементов управления для паузы, быстрой перемотки вперед, перемотки назад, остановки и т.д. Здесь и здесь - некоторые видеоуроки.
-
MPMoviePlayerController
, который вы, возможно, видели в других ответах, устарел.
Результат
Теперь проект должен выглядеть так.
![введите описание изображения здесь]()
Ответ 10
Вы не можете воспроизводить видео внутри представления. Он должен воспроизводиться в полноэкранном режиме.