วิธีเล่นวิดีโอด้วย AVPlayerViewController (AVKit) ใน Swift


164

คุณเล่นวิดีโอด้วย AV Kit Player View Controller ใน 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(ไม่มีตัวควบคุม) ให้ดูคำตอบนี้
Suragch

คำตอบ:


532

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

มันจะดีกว่าที่จะใส่รหัสนี้ในวิธีการ: แทนที่ func viewDidAppear (_ animated: Bool)หรือที่อื่นหลังจากนั้น


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

หรือเพียงแค่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 เคลื่อนไหว: เสร็จสิ้นใช่: ไม่มี];
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
การฝังทำงานได้อย่างไร้ที่ติ แต่คุณจะจัดการกับการเปลี่ยนแปลงการวางแนวอย่างไร สมมติว่าผู้เล่นใช้เวลาครึ่งหน้าจอในแนวตั้งและตัวควบคุมมุมมองรองรับเฉพาะแนวตั้ง แต่สามารถดูวิดีโอในแนวตั้งเหมือนแอพส่วนใหญ่เช่น e .. youtube, vimeo เป็นต้น
Abid Hussain

หมายเหตุ: จำเป็นต้องมี addChildViewController โดยไม่ต้องฉันพยายามที่แล้วก็เกือบจะทำงาน - มันเล่นครั้งเดียวก็ขยายให้เต็มหน้าจอ แต่มันไม่เล่นอีกครั้งหรือออกจากโหมดเต็มหน้าจอ ดังนั้นจำเป็นต้องมีตัวควบคุมมุมมองลูก
n13

self.addChildViewController(playerController)ตอนนี้เป็นself.addChild(playerController)fyi
Marquis103

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

@ คนที่คุณตั้งเฟรม avPlayerLayer?
Ramesh

1
@Oneperson ตกลงตั้ง avPlayerLayer.frame นี้ = CGRectMake (50,50,100,100)
Ramesh

รหัส var player: AVPlayer! var playerItem: AVPlayerItem!; var avPlayerLayer: AVPlayerLayer = AVPlayerLayer (ผู้เล่น: ผู้เล่น) avPlayerLayer.frame = CGRectMake (50,50,100,100) Self.view.layer .addSublayer (avPlayerLayer) ปล่อยให้วิดีโอURLWithPath = "http: //*****/45.m3u8" var steamingURL: NSURL = NSURL (สตริง: videoURLWithPath) player = AVPlayer (URL: steamingURL) รหัส player.play ()
orazz

@Oneperson edge.tolkun.tv/45.m3u8ไม่ทำงาน คุณสามารถให้ URL เต็มของคุณได้ไหม
Ramesh

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 เลิกใช้แล้วและเราไม่ควรใช้อีกต่อไป
Skywalker

คุณช่วยยกตัวอย่างที่ไม่ได้ใช้ 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)
}

ไม่ทำงาน (rect rect เปล่า ... )

งานนี้:

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()หลังจาก: 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

เพิ่งเพิ่มวิดีโอตัวอย่างลงในโครงการจากวิดีโอตัวอย่าง

เพิ่มปุ่มการกระทำสำหรับการเล่นวิดีโอจากเว็บไซต์และท้องถิ่นด้วยตัวอย่างรหัสแบบรวดเร็วดังต่อไปนี้

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 แล้วดังนั้นฉันจึงเรียกใช้ฟังก์ชันจาก model โดยใช้ฟังก์ชัน Course

// ยังแนะนำ VideoUrl เป็น 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

Swift 5+

ก่อนอื่นคุณต้องกำหนด 2 ตัวแปรทั่วโลกภายในตัวควบคุมมุมมองของคุณ

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ทั่วโลกคุณจะไม่สามารถฝังโปรแกรมเล่นได้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.