فون SDK: كيف تلعب الفيديو داخل المنظر؟ بدلا من ملء الشاشة

StackOverflow https://stackoverflow.com/questions/1266750

سؤال

أحاول تشغيل الفيديو داخل 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];
}

ولكن هذا فقط تعطل التطبيق عند استخدام هذه الطريقة داخل فئة خاصة بها، ولكنه جيد في مكان آخر. هل يعرف أحد كيفية تشغيل الفيديو داخل المنظر؟ وتجنب أن تكون ملء الشاشة؟

هل كانت مفيدة؟

المحلول

اعتبارا من 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.

نصائح أخرى

أفضل طريقة هي استخدام الطبقات المثبتة من المشاهدات:

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"

بالنظر إلى التعليمات البرمجية الخاصة بك، تحتاج إلى تعيين إطار عرض وحدة تحكم لاعب الأفلام، وأضف أيضا عرض وحدة تحكم لاعب الأفلام لعرضك. أيضا، لا تنس أن تضيف 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

سويفت

هذا هو مشروع مكتوبة ذاتيا حتى تتمكن من رؤية كل شيء في السياق.

تخطيط

إنشاء تخطيط مثل ما يلي مع UIView و UIButton. وبعد ال UIView ستكون الحاوية التي سنلعب فيها الفيديو لدينا.

enter image description here

إضافة فيديو إلى المشروع

إذا كنت بحاجة إلى عينة فيديو لممارسة مع، يمكنك الحصول على واحدة من sample-videos.com.. وبعد أنا أستخدم فيديو تنسيق MP4 في هذا المثال. اسحب وإسقاط ملف الفيديو في مشروعك. كان علي أيضا إضافته صراحة في موارد الحزمة (انتقل إلى بناء مراحل> نسخ موارد حزمة, ، يرى هذه الإجابة للمزيد من).

رمز

هنا هو الكود الكامل للمشروع.

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 ربما تكون قد رأيت في إجابات أخرى يتم إهمالها.

نتيجة

يجب أن يبدو المشروع هكذا الآن.

enter image description here

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

[self presentMoviePlayerViewControllerAnimated:playerv];
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;
  }

نسخة سريعة:

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

استخدم الطريقة التالية.

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

لا يمكنك تشغيل مقطع فيديو داخل عرض. يجب أن تلعب ملء الشاشة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top