स्विफ्ट में AVPlayerViewController (AVKit) के साथ वीडियो कैसे चलाएं


164

आप स्विफ्ट में एवी किट प्लेयर व्यू कंट्रोलर के साथ वीडियो कैसे खेलते हैं?

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

एवीफ़ाउंडेशन ढांचे की आवश्यकता है भले ही आप एवीप्लेयर का उपयोग करें

यदि आप 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()

इस कोड को विधि में डालना बेहतर है: ओवरड्यूड फंक व्यूडीडऐपियर (_ एनिमेटेड: बूल) या उसके बाद कहीं।


उद्देश्य सी

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, यह iOS8 या बाद में काम करता है, शायद यही कारण है।
pkis

8
मेरे लिए भी आयात AVFoundation आवश्यक है
अमीर फॉक्स

1
@ Nick89, AVPlayer प्रत्यक्ष लिंक के साथ सही काम करता है, लेकिन अगर आपको YouTube, Vimeo, आदि जैसी सेवाओं का उपयोग करने की आवश्यकता है (जिसमें अप्रत्यक्ष लिंक हैं), तो आपको अपने स्वयं के पुस्तकालय या SDK का उपयोग करना चाहिए। (उदाहरण के लिए YouTube: गाइड )।
पकिस

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
एंबेडिंग त्रुटिपूर्ण रूप से काम करती है लेकिन आप अभिविन्यास परिवर्तनों को कैसे संभालेंगे मान लीजिए कि खिलाड़ी चित्र में स्क्रीन का आधा हिस्सा लेता है और व्यू कंट्रोलर केवल पोर्ट्रेट का समर्थन करता है, लेकिन वीडियो को पोर्ट्रेट में देखा जा सकता है, जैसे अधिकांश ऐप्स ई .. यूट्यूब, वीमियो आदि
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 फ्रेम सेट किया है?
रमेश

1
@Oneperson ok ने यह avPlayerLayer.frame = CGRectMake (50,50,100,100) सेट किया
रमेश

कोड वार प्लेयर: AVPlayer! var खिलाड़ी यह: AVPlayerItem !; var avPlayerLayer: AVPlayerLayer = AVPlayerLayer (खिलाड़ी: खिलाड़ी) avPlayerLayer.frame = CGRectMake (50,50,100,100) स्वयं। स्टीमर: NSURL = NSURL (string: videoURLWithPath) खिलाड़ी = AVPlayer (URL: steamingURL) प्लेयर.प्ले () कोड
orazz

@Oneperson edge.tolkun.tv/45.m3u8 काम नहीं कर रहा है। क्या आप अपना पूरा url दे सकते हैं
रमेश

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


            }
    }

हेलो रौनक, वीडियो के अंत को संभालने के लिए स्विफ्ट में पर्यवेक्षकों को पेश करने के लिए धन्यवाद !! मैंने AVPlayerViewController को आपके शीर्ष पर उत्तर (पहले कोड स्निपेट) से प्रदान किए गए कोड के साथ बनाकर काम करने में कामयाब नहीं किया, क्या अलग है? आपके तरीकों में पर्यवेक्षक बनाने के लिए मैंने क्या याद किया या लागू करना चाहिए?
मनु

6

उद्देश्य सी

यह केवल में काम करता है 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()उसके बाद: 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?
अनीबस

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

// यहां पाठ्यक्रम में एक मॉडल फ़ाइल शामिल है, इसके अंदर मैंने यूआरएल दिया है, इसलिए मैं कोर्स फ़ंक्शन का उपयोग करके मॉडल से फ़ंक्शन को कॉल कर रहा हूं।

// भी परिचय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

स्विफ्ट 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)

यदि आप विश्व स्तर पर खिलाड़ी और खिलाड़ी दृश्य नियंत्रक को परिभाषित नहीं कर रहे हैं , तो आप खिलाड़ी को एम्बेड नहीं कर पाएंगे।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.