So spielen Sie Videos mit AVPlayerViewController (AVKit) in Swift ab


164

Wie können Sie ein Video mit dem AV Kit Player View Controller in Swift abspielen?

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

Informationen zur Verwendung AVPlayer(ohne Steuerelemente) finden Sie in dieser Antwort .
Suragch

Antworten:


531

Swift 3.x - 5.x.

Notwendig: Import AVKit , Import AVFoundation

Das AVFoundation-Framework wird auch dann benötigt, wenn Sie AVPlayer verwenden

Wenn Sie AVPlayerViewController verwenden möchten :

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

oder einfach nur 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()

Es ist besser, diesen Code in die Methode einzufügen : überschreibe func viewDidAppear (_ animiert: Bool) oder irgendwo danach.


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

oder einfach nur 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 Danke für das Codebeispiel. Seltsamerweise haben wir den AVPlayerController wie geschrieben ausprobiert und ein SIGABRT erhalten für: [self presentViewController: playerViewController animiert: JA Vervollständigung: nil];
Praxiteles

@Praxiteles, es funktioniert unter iOS8 oder höher, vielleicht ist es der Grund.
pkis

8
Auch erforderlich Import AVFoundation für mich
Rich Fox

1
@ Nick89, AVPlayer funktioniert korrekt mit direkten Links. Wenn Sie jedoch Dienste wie YouTube, Vimeo usw. (mit indirekten Links) verwenden müssen, sollten Sie eine eigene Bibliothek oder ein eigenes SDK verwenden. (zB für YouTube: Anleitung ).
pkis

2
Die Reihenfolge der Anweisungen ist wichtig, außerdem musste ich AVKit
htafoya

30

Versuchen Sie dies, funktioniert auf jeden Fall für 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
Vielen Dank. Der addChildViewController hat es genau so eingebettet, wie ich es möchte. :)
SDW

1
Das Einbetten funktioniert einwandfrei, aber wie gehen Sie mit Orientierungsänderungen um? Lassen Sie sagen , Spieler die Hälfte der Bildschirm unterstützt nur Controller im Hoch- und Ansicht , Porträt , aber Video kann im Portrait zu sehen , wie die meisten apps tun e .. youtube, vimeo usw.
Abid Hussain

Hinweis: addChildViewController ist erforderlich. Ich habe es ohne versucht und dann funktioniert es fast - es wird einmal abgespielt, es wird auf Vollbild erweitert. Es wird jedoch nicht erneut abgespielt oder der Vollbildmodus wird verlassen. Daher ist eine untergeordnete Ansichtssteuerung erforderlich.
n13

self.addChildViewController(playerController)ist jetzt self.addChild(playerController)fyi
Marquis103

12

Versuche dies

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

Wenn ich diesen Code ausführe, bekomme ich den leeren Ansichts-Controller
Orazz

@ Eine Person, die Sie avPlayerLayer Frame setzen?
Ramesh

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

Code Var Player: AVPlayer! var playerItem: AVPlayerItem!; var avPlayerLayer: AVPlayerLayer = AVPlayerLayer (Spieler: Spieler) avPlayerLayer.frame = CGRectMake (50,50,100,100) self.view.layer .addSublayer (avPlayerLayer) lässt videoURLWithPath = "http: //*****/45.m3u8" var SteamingURL: NSURL = NSURL (Zeichenfolge: VideoURLWithPath) Player = AVPlayer (URL: SteamingURL) Player.play () Code
Orazz

@Oneperson edge.tolkun.tv/45.m3u8 funktioniert nicht. können Sie Ihre vollständige URL geben
Ramesh

11

Swift 3.0 Vollständiger Quellcode:

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


            }
    }

Hallo Ronak, danke, dass du die Beobachter schnell vorgestellt hast, um das Ende des Videos zu bewältigen !! Ich habe es nicht geschafft, es zum Laufen zu bringen, indem ich den AVPlayerViewController mit dem Code erstellt habe, der aus der Antwort oben auf Ihrer (erstes Code-Snippet) stammt. Was ist anders? Was ich verpasst habe oder implementieren sollte, damit der Beobachter in Ihren Methoden funktioniert?
Manu

6

Ziel c

Dies funktioniert nur in Xcode 7

Gehen Sie zur .hDatei und importieren Sie AVKit/AVKit.hund AVFoundation/AVFoundation.h. Gehen Sie dann zur .mDatei und fügen Sie diesen Code hinzu:

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

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

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

Ich habe eine Wiedergabetaste, um das Tippen auf die Taste zu handhaben.

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

Ich habe einen Beobachter hinzugefügt, der auf AVPlayerItemDidPlayToEndTimeNotification wartet.

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

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

Wenn die Video- / Audiowiedergabe beendet ist, setzen Sie das Bild und die Benachrichtigung der Schaltfläche zurück

  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 ist veraltet und wir sollten ihn wahrscheinlich nicht mehr verwenden.
Skywalker

Kannst du bitte ein Beispiel geben, das keine URLs verwendet, zum Beispiel ein lokales Video?
Nyxee

4

ein Fehler (?!) in 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)
}

funktioniert nicht (leer rechts ...)

das funktioniert:

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

Gleiche URL ...


füge diese Zeile hinzu: player.play()nach: self.view.layer.addSublayer(playerLayer)und versuche es erneut
orazz

4

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

}

Wo in Ihrer Antwort haben Sie verwendet AVPlayerViewController?
AnBisw

1

Das hat bei mir in Swift 5 funktioniert

Habe gerade ein Beispielvideo aus Beispielvideos zum Projekt hinzugefügt

Aktionsschaltflächen zum Abspielen von Videos von Website und Local mit dem folgenden schnellen Codebeispiel hinzugefügt

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

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

// hier enthält der Kurs eine Modelldatei, in der ich die URL angegeben habe, also rufe ich die Funktion vom Modell mit der Kursfunktion auf.

// auch IntroductionVideoUrl ist eine URL, die ich im Modell deklariert habe.

 var introductionVideoURL: URL

Alternativ können Sie auch den folgenden Code verwenden, anstatt die Funktion vom Modell aus aufzurufen

Ersetzen Sie diesen Code

  let videoURL = course.introductionVideoURL

mit

  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

Verbessert von @ingconti Antwort. Das hat bei mir funktioniert.

 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+

Zunächst müssen Sie 2 Variablen global in Ihrem View Controller definieren.

var player: AVPlayer!
var playerViewController: AVPlayerViewController!

Hier füge ich einer gewünschten Ansicht einen Player hinzu.

@IBOutlet weak var playerView: UIView!

Fügen Sie dann der viewDidLoad- Methode den folgenden Code hinzu .

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)

Wenn Sie Player und playerViewController nicht global definieren, können Sie Player nicht einbetten.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.