Cách phát video với AVPlayerViewControll (AVKit) trong Swift


164

Làm cách nào để phát video với AV Kit Player View Controller trong 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
        }
    }

Để sử dụng AVPlayer(không có điều khiển), hãy xem câu trả lời này .
Suragch

Câu trả lời:


532

Swift 3.x - 5.x

Cần thiết: nhập AVKit , nhập AVFoundation

Khung AVFoundation là cần thiết ngay cả khi bạn sử dụng AVPlayer

Nếu bạn muốn sử dụng AVPlayerViewCont kiểm soát :

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

hoặc chỉ 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()

Tốt hơn là đặt mã này vào phương thức: ghi đè func viewDidAppear (_ hoạt hình: Bool) hoặc ở đâu đó sau.


Mục tiêu-C

AVPlayerViewCont Bộ điều khiển :

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

hoặc chỉ 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 Cảm ơn ví dụ mã. Thật kỳ lạ, chúng tôi đã thử AVPlayerControll như đã viết và nhận SIGABRT trên: [self PresentViewCont điều khiển: playerViewControll hoạt hình: hoàn thành CÓ: nil];
Praxlistes 16/07/2015

@Praxiteles, nó hoạt động trên iOS8 trở lên, có thể đó là lý do.
pkis

8
Cũng yêu cầu nhập AVFoundation cho tôi
Rich Fox

1
@ Nick89, AVPlayer hoạt động chính xác với các liên kết trực tiếp, nhưng nếu bạn cần sử dụng các dịch vụ như YouTube, Vimeo, v.v. (có liên kết gián tiếp), bạn nên sử dụng thư viện hoặc SDK của riêng họ. (ví dụ: đối với YouTube: hướng dẫn ).
pkis

2
Thứ tự của các hướng dẫn rất quan trọng, tôi cũng cần nhập AVKit
htafoya vào

30

Hãy thử điều này, chắc chắn làm việc cho 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
Cảm ơn. AddChildViewControll đã khiến nó được nhúng đúng như những gì tôi muốn. :)
SDW

1
Nhúng không hoạt động hoàn hảo nhưng làm thế nào bạn sẽ xử lý thay đổi định hướng? Giả sử người chơi chiếm một nửa màn hình trong chế độ dọc và trình điều khiển xem chỉ hỗ trợ chân dung nhưng video có thể được nhìn thấy trong chân dung giống như hầu hết các ứng dụng như e .. youtube, vimeo, v.v.
Abid Hussain

Lưu ý: addChildViewControll là cần thiết. Tôi đã thử mà không có nó và nó gần như hoạt động - nó chơi một lần, nó mở rộng ra toàn màn hình. Nhưng nó không phát lại hoặc thoát khỏi chế độ toàn màn hình. Vì vậy, bộ điều khiển xem con là cần thiết.
n13

self.addChildViewController(playerController)bây giờ là self.addChild(playerController)fyi
Hầu tước103

12

Thử cái này

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

Khi tôi chạy mã này, tôi nhận được bộ điều khiển chế độ xem trống
orazz

@Oneperson bạn đặt khung avPlayerLayer?
Ramesh

1
@Oneperson ok đặt avPlayerLayer.frame = CGRectMake (50,50,100,100)
Ramesh

người chơi mã var: AVPlayer! var playerItem: AVPlayerItem!; var avPlayerLayer: AVPlayerLayer = AVPlayerLayer (player: player) avPlayerLayer.frame = CGRectMake (50,50,100,100) self.view.layer .addSublayer (avPlayerLayer) hãy để videoURLWithPath = "http: //" steamingURL: NSURL = NSURL (chuỗi: videoURLWithPath) player = AVPlayer (URL: steamingURL) player.play () code
orazz

@Oneperson edge.tolkun.tv/45.m3u8 không hoạt động. bạn có thể cung cấp url đầy đủ của mình không
Ramesh

11

Swift 3.0 Mã nguồn đầy đủ:

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


            }
    }

Xin chào ronak, cảm ơn bạn đã giới thiệu các nhà quan sát nhanh chóng để xử lý phần cuối của video !! Tôi đã không quản lý để làm cho nó hoạt động bằng cách tạo AVPlayerViewCont kiểm soát với mã được cung cấp từ câu trả lời trên đầu trang của bạn (đoạn mã đầu tiên), có gì khác? Những gì tôi đã bỏ lỡ hoặc nên thực hiện để làm cho người quan sát trong các phương thức của bạn hoạt động?
Manu

6

Mục tiêu c

Điều này chỉ hoạt động trong Xcode 7

Đi đến .htập tin và nhập khẩu AVKit/AVKit.hAVFoundation/AVFoundation.h. Sau đó vào .mtập tin và thêm mã này:

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

Sử dụng MPMoviePlayerCont kiểm soát:

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

Sử dụng 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)
}

Tôi có một nút play để xử lý nút nhấn.

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

Tôi đã thêm một người quan sát nghe 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)
    }

Khi phát xong video / âm thanh, hãy đặt lại hình ảnh nút và thông báo

  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
MPMoviePlayerControll không được dùng nữa và có lẽ chúng ta không nên sử dụng nó nữa.
Skywalker

Bạn có thể vui lòng cho một ví dụ không sử dụng URL để kiểm tra bằng cách sử dụng video cục bộ.
nyxee

4

một lỗi (?!) trong 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)
}

không hoạt động (trống trực tiếp ...)

những công việc này:

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

Cùng một URL ...


thêm dòng này: player.play()sau: self.view.layer.addSublayer(playerLayer)và thử lại
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()
    }

}

Bạn đã sử dụng câu trả lời ở AVPlayerViewControllerđâu?
AnBisw

1

Điều này làm việc cho tôi trong Swift 5

Chỉ cần thêm video mẫu vào dự án từ Video mẫu

Đã thêm nút hành động để phát video từ Trang web và Địa phương với ví dụ mã nhanh chóng sau đây

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

// ở đây khóa học bao gồm một tệp mô hình, bên trong nó tôi đã cho url, vì vậy tôi đang gọi hàm từ mô hình bằng hàm khóa học.

// cũng giới thiệuVideoUrl là một URL mà tôi đã khai báo bên trong mô hình.

 var introductionVideoURL: URL

Ngoài ra, bạn có thể sử dụng mã dưới đây thay vì gọi hàm từ mô hình

Thay thế mã này

  let videoURL = course.introductionVideoURL

với

  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

Cải thiện từ câu trả lời @ingconti. Điều này làm việc cho tôi.

 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+

Trước hết, bạn phải xác định 2 biến trên toàn cầu trong bộ điều khiển xem của bạn.

var player: AVPlayer!
var playerViewController: AVPlayerViewController!

Ở đây tôi đang thêm người chơi vào chế độ xem mong muốn.

@IBOutlet weak var playerView: UIView!

Sau đó thêm mã sau vào phương thức 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)

Nếu bạn không xác định trình phátplayerViewControll trên toàn cầu, bạn sẽ không thể nhúng trình phát.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.