Swift에서 AVPlayerViewController (AVKit)로 비디오를 재생하는 방법


164

Swift에서 AV Kit Player View Controller로 비디오를 어떻게 재생합니까?

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

스위프트 3.x-5.x

필요한 : 수입 AVKit , 수입 AVFoundation

AVPlayer를 사용하더라도 AVFoundation 프레임 워크가 필요합니다

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

이 코드를 메소드에 추가하는 것이 좋습니다 : override func viewDidAppear (_ animated : Bool) 또는 이후에.


목표 -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 animated : YES completion : nil];
Praxiteles

@Praxiteles, iOS8 이상에서 작동합니다. 아마 이유 일 수 있습니다.
pkis

8
또한 필요한 수입 AVFoundation을 나를 위해
리치 폭스

1
@ Nick89, AVPlayer는 직접 링크에서 올바르게 작동하지만 YouTube, Vimeo 등과 같은 서비스 (직접 링크가있는)를 사용해야하는 경우 자체 라이브러리 또는 SDK를 사용해야합니다. (예 : YouTube : guide ).
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 등)에서 세로로 비디오를 볼 수 있습니다.
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

@Oneperson 당신은 avPlayerLayer 프레임을 설정?
Ramesh

1
@Oneperson ok 설정 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) let videoURLWithPath = "http : //*****/45.m3u8"var steamingURL : NSURL = NSURL (string : videoURLWithPath) player = AVPlayer (URL : steamingURL) player.play () 코드
orazz

@Oneperson edge.tolkun.tv/45.m3u8 이 작동하지 않습니다. 당신은 당신의 전체 URL을 줄 수 있습니까
Ramesh

11

스위프트 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를 만들어서 작동시키지 못했습니다. 메소드에서 관찰자를 작동시키기 위해 내가 놓쳤거나 구현해야 할 것은 무엇입니까?
Manu

6

목표 c

이것은에서만 작동합니다 Xcode 7

로 이동하여 .h파일 가져 오기 AVKit/AVKit.hAVFoundation/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 ...)

이것은 작동합니다 :

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

이것은 스위프트 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을 제공 했으므로 코스 함수를 사용하여 모델에서 함수를 호출합니다.

// 또한 tutorialVideoUrl은 model 내부에서 선언 한 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 answer에서 개선되었습니다. 이것은 나를 위해 일했습니다.

 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+

우선 뷰 컨트롤러 내에서 전역 적으로 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.