Swift'te AVPlayerViewController (AVKit) ile video oynatma


164

Swift'te AV Kit Player View Controller ile nasıl video oynatırsınız?

override func viewDidLoad() {
        super.viewDidLoad()
        let videoURLWithPath = "http://****/5.m3u8"
        let videoURL = NSURL(string: videoURLWithPath)
        playerViewController = AVPlayerViewController()

        dispatch_async(dispatch_get_main_queue()) {
            self.playerViewController?.player = AVPlayer.playerWithURL(videoURL) as AVPlayer
        }
    }

Kullanmak için AVPlayer(kontrolleri yoktur), bu cevaba bakınız .
Suragch

Yanıtlar:


532

Hızlı 3.x - 5.x

Gerekli: AVKit'i içe aktarın , AVFoundation'ı içe aktarın

AVPlayer kullanıyor olsanız bile AVFoundation çerçevesi gereklidir

AVPlayerViewController kullanmak istiyorsanız :

let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerViewController = AVPlayerViewController()
playerViewController.player = player
self.present(playerViewController, animated: true) {
    playerViewController.player!.play()
}

veya sadece AVPlayer :

let videoURL = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4")
let player = AVPlayer(url: videoURL!)
let playerLayer = AVPlayerLayer(player: player)
playerLayer.frame = self.view.bounds
self.view.layer.addSublayer(playerLayer)
player.play()

Bu kodu yönteme koymak daha iyidir: geçersiz kıl func viewDidAppear (_ animated: Bool) veya sonrasında.


Objective-C

AVPlayerViewController :

NSURL *videoURL = [NSURL URLWithString:@"https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"];
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
AVPlayerViewController *playerViewController = [AVPlayerViewController new];
playerViewController.player = player;
[self presentViewController:playerViewController animated:YES completion:^{
  [playerViewController.player play];
}];

veya sadece AVPlayer :

NSURL *videoURL = [NSURL URLWithString:@"https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4"];
AVPlayer *player = [AVPlayer playerWithURL:videoURL];
AVPlayerLayer *playerLayer = [AVPlayerLayer playerLayerWithPlayer:player];
playerLayer.frame = self.view.bounds;
[self.view.layer addSublayer:playerLayer];
[player play];

@pikis Kod örneği için teşekkürler. Tuhaf, AVPlayerController'ı yazılı olarak denedik ve SIGABRT'yi şu şekilde elde ettik: [self presentViewController: playerViewController animated: YES completion: nil];
Praxiteles

@Praxiteles, iOS8 veya sonraki sürümlerde çalışır, belki de nedeni budur.
pkis

8
Ayrıca benim için AVFoundation ithalat gerekli
Rich Fox

1
@ Nick89, AVPlayer doğrudan bağlantılar ile doğru çalışır, ancak YouTube, Vimeo vb. (Dolaylı bağlantıları olan) gibi hizmetleri kullanmanız gerekiyorsa, kendi kitaplığını veya SDK'sını kullanmalısınız. (ör. YouTube için: rehber ).
pkis

2
Talimatların sırası önemlidir, ayrıca AVKit'i ithal etmem gerekiyor
htafoya

30

Bunu deneyin, kesinlikle işe yarıyor Swift 2.0

 let player = AVPlayer(URL: url)
    let playerController = AVPlayerViewController()

    playerController.player = player
    self.addChildViewController(playerController)
    self.view.addSubview(playerController.view)
    playerController.view.frame = self.view.frame

    player.play()  

1
Teşekkürler. AddChildViewController sadece istediğim gömülü yaptı. :)
SDW

1
Gömme kusursuz çalışır, ancak yön değişikliklerini nasıl ele alırsınız? Diyelim oyuncu portre ekranın yarısını alır ve görünüm denetleyicisi sadece portre destekler ancak video gibi birçok uygulamada görülebilir .. youtube, vimeo vb.
Abid Hussain

Not: addChildViewController gereklidir. Onsuz denedim ve sonra neredeyse çalışıyor - bir kez oynuyor, tam ekrana genişliyor. Ancak tekrar oynatılmaz veya tam ekran modundan çıkmaz. Bu yüzden çocuk görüntüleme denetleyicisi gereklidir.
n13

self.addChildViewController(playerController)şimdi self.addChild(playerController)Bilginize
Marquis103

12

Bunu dene

var player:AVPlayer!
var avPlayerLayer:AVPlayerLayer = AVPlayerLayer(player: player)
avPlayerLayer.frame = CGRectMake(your frame)
self.view.layer .addSublayer(avPlayerLayer)
var steamingURL:NSURL = NSURL(string:playerURL)
player = AVPlayer(URL: steamingURL)
player.play()

Bu kodu çalıştırdığımda boş görünüm denetleyicisi
alıyorum

@ AvPlayerLayer çerçevesini ayarladığınız kişi mi?
Ramesh

1
@Oneperson ok set avPlayerLayer.frame = CGRectMake (50,50,100,100)
Ramesh

code var player: AVPlayer! var playerItem: AVPlayerItem !; var avPlayerLayer: AVPlayerLayer = AVPlayerLayer (oyuncu: oyuncu) avPlayerLayer.frame = CGRectMake (50,50,100,100) self.view.layer .addSublayer (avPlayerLayer) videoURLWithPath = "http: //*****/45.m3u8" steamingURL: NSURL = NSURL (dize: videoURLWithPath) oynatıcı = AVPlayer (URL: steamingURL) player.play () kodu
orazz

@Oneperson edge.tolkun.tv/45.m3u8 çalışmıyor. tam url'nizi verebilir misiniz
Ramesh

11

Swift 3.0 Tam kaynak kodu:

import UIKit
    import AVKit
    import AVFoundation

    class ViewController: UIViewController,AVPlayerViewControllerDelegate
    {
        var playerController = AVPlayerViewController()


        @IBAction func Play(_ sender: Any)
        {
            let path = Bundle.main.path(forResource: "video", ofType: "mp4")

            let url = NSURL(fileURLWithPath: path!)

            let player = AVPlayer(url:url as URL)

            playerController = AVPlayerViewController()


            NotificationCenter.default.addObserver(self, selector: #selector(ViewController.didfinishplaying(note:)),name:NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: player.currentItem)

            playerController.player = player

            playerController.allowsPictureInPicturePlayback = true

            playerController.delegate = self

            playerController.player?.play()

            self.present(playerController,animated:true,completion:nil)
        }

        func didfinishplaying(note : NSNotification)
        {
            playerController.dismiss(animated: true,completion: nil)
            let alertview = UIAlertController(title:"finished",message:"video finished",preferredStyle: .alert)
            alertview.addAction(UIAlertAction(title:"Ok",style: .default, handler: nil))
            self.present(alertview,animated:true,completion: nil)
        }


        func playerViewController(_ playerViewController: AVPlayerViewController, restoreUserInterfaceForPictureInPictureStopWithCompletionHandler completionHandler: @escaping (Bool) -> Void) {
                let currentviewController =  navigationController?.visibleViewController

                if currentviewController != playerViewController
                {
                    currentviewController?.present(playerViewController,animated: true,completion:nil)
                }


            }
    }

Merhaba ronak, videonun sonunu ele almak için hızlı bir şekilde gözlemcileri tanıttığınız için teşekkür ederiz !! Ben senin üstündeki cevap (ilk kod snippet) verilen kod ile AVPlayerViewController oluşturarak çalışmasını başaramadı, ne farklı? Metodlarınızdaki gözlemcinin çalışması için ne kaçırdım ya da uygulamalıyım?
Manu

6

Hedef c

Bu sadece Xcode 7

.hDosyaya gidin ve içe aktarın AVKit/AVKit.hve AVFoundation/AVFoundation.h. Sonra .mdosyaya gidin ve şu kodu ekleyin:

NSURL *url=[[NSBundle mainBundle]URLForResource:@"arreg" withExtension:@"mp4"];
AVPlayer *video=[AVPlayer playerWithURL:url];
AVPlayerViewController *controller=[[AVPlayerViewController alloc]init];
controller.player=video;
[self.view addSubview:controller.view];
controller.view.frame=self.view.frame;
[self addChildViewController:controller];
[video play];

4

MPMoviePlayerController'ı kullanma:

 import UIKit
 import MediaPlayer

 class ViewController: UIViewController {

     var streamPlayer : MPMoviePlayerController =  MPMoviePlayerController(contentURL: NSURL(string:"video url here"))
     override func viewDidLoad() {
         super.viewDidLoad()
         streamPlayer.view.frame = self.view.bounds
         self.view.addSubview(streamPlayer.view)

         streamPlayer.fullscreen = true
         // Play the movie!
         streamPlayer.play()
}
}

AVPlayer'ı kullanma:

import AVFoundation

var playerItem:AVPlayerItem?
var player:AVPlayer?

override func viewDidLoad() {
        super.viewDidLoad() 
      let url = NSURL(string: "url of the audio or video") 
      playerItem = AVPlayerItem(URL: url!)
      player=AVPlayer(playerItem: playerItem!)
      let playerLayer=AVPlayerLayer(player: player!)
      playerLayer.frame=CGRectMake(0, 0, 300, 50)
      self.view.layer.addSublayer(playerLayer)
}

Düğme dokunuşunu işlemek için bir oynat düğmem var.

playButton.addTarget(self, action: "playButtonTapped:", forControlEvents: .TouchUpInside)

func playButtonTapped(sender: AnyObject) {
        if player?.rate == 0
        {
            player!.play()
            playButton.setImage(UIImage(named: "player_control_pause_50px.png"), forState: UIControlState.Normal)
        } else {
            player!.pause()
            playButton.setImage(UIImage(named: "player_control_play_50px.png"), forState: UIControlState.Normal)
        }
    }

AVPlayerItemDidPlayToEndTimeNotification dinlerken bir gözlemci ekledim.

override func viewWillAppear(animated: Bool) {
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "finishedPlaying:", name: AVPlayerItemDidPlayToEndTimeNotification, object: playerItem)
    }

override func viewWillDisappear(animated: Bool) {
        NSNotificationCenter.defaultCenter().removeObserver(self)
    }

Video / ses oynatma tamamlandığında, düğme resmini ve bildirimi sıfırlayın

  func finishedPlaying(myNotification:NSNotification) {
        playButton.setImage(UIImage(named: "player_control_play_50px.png"), forState: UIControlState.Normal)

        let stopedPlayerItem: AVPlayerItem = myNotification.object as! AVPlayerItem
        stopedPlayerItem.seekToTime(kCMTimeZero)
    }

2
MPMoviePlayerController kullanımdan kaldırıldı ve muhtemelen artık kullanmamalıyız.
Skywalker

Yerel bir video kullanarak incelemek için lütfen URL kullanmayan bir örnek verebilir misiniz?
nyxee

4

/ Swift3 / Xcode 8'de bir hata (?!)?

if let url = URL(string: "http://devstreaming.apple.com/videos/wwdc/2016/102w0bsn0ge83qfv7za/102/hls_vod_mvp.m3u8"){
    let playerItem = AVPlayerItem(url: url)
    let player = AVPlayer(playerItem: playerItem)
    let playerLayer = AVPlayerLayer(player: player)
    playerLayer.frame=CGRect(x: 10, y: 10, width: 300, height: 300)
    self.view.layer.addSublayer(playerLayer)
}

çalışmıyor (boş rect ...)

bu çalışıyor:

if let url = URL(string: "http://devstreaming.apple.com/videos/wwdc/2016/102w0bsn0ge83qfv7za/102/hls_vod_mvp.m3u8"){

            let player = AVPlayer(url: url)
            let controller=AVPlayerViewController()
            controller.player=player
            controller.view.frame = self.view.frame
            self.view.addSubview(controller.view)
            self.addChildViewController(controller)
            player.play()
        }

Aynı URL ...


bu satırı ekleyin: player.play()after: self.view.layer.addSublayer(playerLayer)and try again
orazz

4

Hızlı 3:

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {

    @IBOutlet weak var viewPlay: UIView!
    var player : AVPlayer?

    override func viewDidLoad() {
        super.viewDidLoad()

        let url : URL = URL(string: "http://static.videokart.ir/clip/100/480.mp4")!
        player = AVPlayer(url: url)
        let playerLayer = AVPlayerLayer(player: player)
        playerLayer.frame = self.viewPlay.bounds
        self.viewPlay.layer.addSublayer(playerLayer)

    }

    @IBAction func play(_ sender: Any) {
        player?.play()
    }

    @IBAction func stop(_ sender: Any) {
        player?.pause()
    }

}

Cevabınızın neresinde kullandınız AVPlayerViewController?
AnBisw

1

Bu Swift 5'te benim için çalıştı

Sample Videos'dan projeye örnek video ekledim

Aşağıdaki hızlı kod örneğiyle Web Sitesi ve Yerel'den video oynatmak için eylem düğmeleri eklendi

import UIKit
import AVKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        //TODO : Make Sure Add and copy "SampleVideo.mp4" file in project before play
    }

    @IBAction func playWebVideo(_ sender: Any) {

        guard let url = URL(string: "https://clips.vorwaerts-gmbh.de/big_buck_bunny.mp4") else {
            return
        }
        // Create an AVPlayer, passing it the HTTP Live Streaming URL.
        let player = AVPlayer(url: url)
        let controller = AVPlayerViewController()
        controller.player = player
        present(controller, animated: true) {
            player.play()
        }
    }

    @IBAction func playLocalVideo(_ sender: Any) {

        guard let path = Bundle.main.path(forResource: "SampleVideo", ofType: "mp4") else {
            return
        }
        let videoURL = NSURL(fileURLWithPath: path)

        // Create an AVPlayer, passing it the local video url path
        let player = AVPlayer(url: videoURL as URL)
        let controller = AVPlayerViewController()
        controller.player = player
        present(controller, animated: true) {
            player.play()
        }
    }

}

0

Hızlı 5

  @IBAction func buttonPressed(_ sender: Any) {
    let videoURL = course.introductionVideoURL
    let player = AVPlayer(url: videoURL)
    let playerViewController = AVPlayerViewController()
    playerViewController.player = player

    present(playerViewController, animated: true, completion: {

        playerViewController.player!.play()
    })

// burada ders bir model dosyası içeriyor, içinde url verdim, bu yüzden ders fonksiyonunu kullanarak modelden işlevi çağırıyorum.

// ayrıca entryVideoUrl, modelin içinde bildirdiğim bir URL.

 var introductionVideoURL: URL

Ayrıca alternatif olarak işlevi modelden çağırmak yerine aşağıdaki kodu kullanabilirsiniz

Bu kodu değiştir

  let videoURL = course.introductionVideoURL

ile

  guard let videoURL = URL(string: "https://something.mp4) else {
        return

0
let videoUrl = //URL: Your Video URL

//Create player first using your URL
let yourplayer = AVPlayer(url: videoUrl)

//Create player controller and set it’s player
let playerController = AVPlayerViewController()
playerController.player = yourplayer


//Final step To present controller  with player in your view controller
present(playerController, animated: true, completion: {
   playerController.player!.play()
})

0

Swift 5.0

@İngconti yanıtından geliştirildi. Bu benim için çalıştı.

 if let url = URL(string: "urUrlString"){
            let player = AVPlayer(url: url)
            let avController = AVPlayerViewController()
            avController.player = player
            // your desired frame
            avController.view.frame = self.view.frame
            self.view.addSubview(avController.view)
            self.addChild(avController)
            player.play()
        }

0

Swift 5+

Her şeyden önce, görünüm denetleyicinizde global olarak 2 değişken tanımlamanız gerekir.

var player: AVPlayer!
var playerViewController: AVPlayerViewController!

Burada istenilen görünüme oyuncu ekliyorum.

@IBOutlet weak var playerView: UIView!

Sonra viewDidLoad yöntemine aşağıdaki kodu ekleyin .

let videoURL = URL(string: "videoUrl")
self.player = AVPlayer(url: videoURL!)
self.playerViewController = AVPlayerViewController()
playerViewController.player = self.player
playerViewController.view.frame = self.playerView.frame
playerViewController.player?.pause()
self.playerView.addSubview(playerViewController.view)

Player ve playerViewController'ı global olarak tanımlamıyorsanız, oynatıcıyı gömemezsiniz .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.