Як відтворювати відео з AVPlayerViewController (AVKit) у Swift


164

Як ви відтворюєте відео з контролером AV Kit Player View у Swift?

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

Про використання AVPlayer(не має елементів керування) дивіться цю відповідь .
Сурагч

Відповіді:


532

Швидкий 3.x - 5.x

Необхідні: імпорт AVKit , імпорт AVFoundation

Рамка AVFoundation потрібна, навіть якщо ви використовуєте AVPlayer

Якщо ви хочете використовувати AVPlayerViewController :

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

або просто 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()

Краще ввести цей код у метод: переопределити функцію viewDidAppear (_ анімований: Bool) або десь після.


Ціль-С

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

або просто 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 Дякую за приклад коду. Дивно, що ми спробували AVPlayerController як написано і отримаємо SIGABRT на: [self presentViewController: playerViewController анімований: YES завершення: nil];
Praxiteles

@Praxiteles, він працює на iOS8 або пізнішої версії, можливо, це і є причиною.
pkis

8
Також потрібен імпорт AVFoundation для мене
Rich Fox

1
@ Nick89, AVPlayer працює правильно з прямими посиланнями, але якщо вам потрібно використовувати такі сервіси, як YouTube, Vimeo тощо (які мають непрямі посилання), вам слід скористатися власною бібліотекою або SDK. (наприклад, для YouTube: посібник ).
pkis

2
Порядок інструкцій важливий, також мені потрібно було імпортувати AVKit
htafoya

30

Спробуйте це, безумовно, працює для 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
Дякую. AddChildViewController зробив це вбудованим саме тим, що я хочу. :)
SDW

1
Вбудовування працює бездоганно, але як ви впораєтесь із змінами орієнтації? Скажімо, гравець займає половину екрана в портретному режимі і контролер перегляду підтримує лише портрет, але відео можна побачити в портреті, як і більшість додатків, наприклад, youtube, vimeo тощо.
Абід Хуссейн

Примітка: addChildViewController необхідний. Я спробував без цього, і тоді це майже працює - він грає один раз, він розгортається на весь екран. Але воно не відтворюється знову або не виходить із повноекранного режиму. Тож необхідний контролер перегляду дітей.
n13,

self.addChildViewController(playerController)зараз self.addChild(playerController)fyi
Маркіз103

12

Спробуйте це

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

Коли я запускаю цей код, я отримую порожній контролер перегляду
orazz

@Oneperson ви встановили кадр avPlayerLayer?
Рамеш

1
@Oneperson ок встановив цей avPlayerLayer.frame = CGRectMake (50,50,100,100)
Рамеш

плеєр коду: AVPlayer! var playerItem: AVPlayerItem !; var avPlayerLayer: AVPlayerLayer = AVPlayerLayer (гравець: гравець) avPlayerLayer.frame = CGRectMake (50,50,100,100) self.view.layer .addSublayer (avPlayerLayer) нехай videoURLWithPath = "http: //*****/45.m3u8" steamingURL: NSURL = NSURL (рядок: videoURLWithPath) player = AVPlayer (URL: steamingURL) player.play () код
orazz

@Oneperson edge.tolkun.tv/45.m3u8 не працює. чи можете ви дати повну URL-адресу
Рамеш,

11

Swift 3.0 Повний вихідний код:

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


            }
    }

Здрастуйте, ronak, дякую за те, що ви ознайомили спостерігачів з швидкою обробкою кінця відео !! Мені не вдалося змусити його працювати, створивши AVPlayerViewController з кодом, наданим з відповіді на верхній частині (перший фрагмент коду), чим відрізняється? Що я пропустив чи повинен здійснити для того, щоб спостерігач за вашими методами працював?
Ману

6

Мета c

Це працює лише в Xcode 7

Перейдіть до .hфайлу та імпортуйте AVKit/AVKit.hі AVFoundation/AVFoundation.h. Потім перейдіть до .mфайлу та додайте цей код:

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:

 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:

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

У мене є кнопка відтворення для обробки кнопки.

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.

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

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

Коли відтворення відео / аудіо закінчено, скиньте зображення кнопки та сповіщення

  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 застарілий, і ми, ймовірно, більше не повинні його використовувати.
Скайуокер

Ви можете, будь ласка, навести приклад, не використовуючи URL-адреси, для іспиту з використанням місцевого відео.
nyxee

4

помилка (?!) в iOS10 / Swift3 / Xcode 8?

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

не працює (порожня відповідь ...)

це працює:

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

Однакова URL-адреса ...


додайте цей рядок: player.play()after: self.view.layer.addSublayer(playerLayer)та спробуйте ще раз
orazz

4

Швидкий 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()
    }

}

Де у своїй відповіді ви використовували AVPlayerViewController?
AnBisw

1

Це працювало для мене у Swift 5

Щойно доданий зразок відео до проекту із Sample Videos

Додано кнопки дій для відтворення відео з веб-сайту та місцевих із наступним швидким прикладом коду

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

Швидкий 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()
    })

// тут курс включає файл моделі, всередині нього я дав URL-адресу, тому я викликаю функцію з моделі за допомогою функції курсу.

// також IntroductionVideoUrl - це URL-адреса, яку я оголосив всередині моделі.

 var introductionVideoURL: URL

Крім того, ви можете використовувати наведений нижче код замість виклику функції з моделі

Замініть цей код

  let videoURL = course.introductionVideoURL

з

  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

Швидкий 5.0

Поліпшено за допомогою відповіді @ingconti. Це працювало для мене.

 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

Швидкий 5+

Перш за все, ви повинні визначити дві змінні в глобальному масштабі всередині вашого контролера перегляду.

var player: AVPlayer!
var playerViewController: AVPlayerViewController!

Тут я додаю гравця до потрібного вигляду.

@IBOutlet weak var playerView: UIView!

Потім додайте наступний код до методу viewDidLoad .

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)

Якщо ви не визначаєте гравця та playerViewController у всьому світі, ви не зможете вставити програвач.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.