-->

MPMoviePlayer in iOS 9

2019-01-27 11:28发布

问题:

i have made a function in iOS 8 to play a movie in the background and now when i want to use it in iOS 9 it gives me a warning and says that it best not to use MPMoviePlayer and instead use AVPlayer. but i don't know anything about AVPlayer. how can i convert this to a proper function without warning that uses AVPlayer instead of MPMoviePlayer? heres the func :

func playVideo() ->Bool {




    let path = NSBundle.mainBundle().pathForResource("video", ofType:"mov")
    //take path of video

    let url = NSURL.fileURLWithPath(path!)

    moviePlayer = MPMoviePlayerController(contentURL: url)
    //asigning video to moviePlayer

    if let player = moviePlayer {
        player.view.frame = self.view.bounds
        //setting the video size to the view size

        player.controlStyle = MPMovieControlStyle.None
        //Hiding the Player controls


        player.prepareToPlay()
        //Playing the video


        player.repeatMode = .One
        //Repeating the video

        player.scalingMode = .AspectFill
        //setting the aspect ratio of the player

        self.view.addSubview(player.view)
        self.view.addSubview(blurView)
        self.view.sendSubviewToBack(blurView)
        self.view.sendSubviewToBack(player.view)

        //adding the player view to viewcontroller
        return true

    }
    return false
}

回答1:

AVPlayerViewController is a subclass of UIViewController. So instead of using a regular view controller create your custom movie player controller as follow:

Do not subclass AVPlayerViewController. Overriding this class’s methods is unsupported and results in undefined behavior.

Try like this:

import UIKit
import AVKit
import AVFoundation
class MoviePlayerViewController: AVPlayerViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        player = AVPlayer(URL: url)
        videoGravity = AVLayerVideoGravityResizeAspect
        showsPlaybackControls = true
        //  player?.play() // uncomment this line to autoplay
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "didPlayToEndTime", name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
    }
    func didPlayToEndTime(){
        print("didPlayToEndTime")
    }
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

To use it as a background you can do as follow:

import UIKit
import AVKit
import AVFoundation

class ViewController: UIViewController {
    let moviePlayerController = AVPlayerViewController()
    var aPlayer = AVPlayer()
    func playBackgroundMovie(){
        if let url = NSBundle.mainBundle().URLForResource("video", withExtension: "mov") {
            aPlayer = AVPlayer(URL: url)
        }
        moviePlayerController.player = aPlayer
        moviePlayerController.view.frame = view.frame
        moviePlayerController.view.sizeToFit()
        moviePlayerController.videoGravity = AVLayerVideoGravityResizeAspect
        moviePlayerController.showsPlaybackControls = false
        aPlayer.play()
        view.insertSubview(moviePlayerController.view, atIndex: 0)
    }

    func didPlayToEndTime(){
        aPlayer.seekToTime(CMTimeMakeWithSeconds(0, 1))
        aPlayer.play()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        playBackgroundMovie()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "didPlayToEndTime", name: AVPlayerItemDidPlayToEndTimeNotification, object: nil)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}


回答2:

works in ios 9

import AVFoundation

let path = NSBundle.mainBundle().pathForResource("videoName", ofType:"mp4")

let url = NSURL(fileURLWithPath: path!)
let playerItem = AVPlayerItem(URL: url)
let player = AVPlayer(playerItem: playerItem)
let playerLayer = AVPlayerLayer(player: player)

playerLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.height)
videoView.layer.addSublayer(playerLayer)

player.actionAtItemEnd = AVPlayerActionAtItemEnd.None

NSNotificationCenter.defaultCenter().addObserver(self,
        selector: "playerItemDidReachEnd",
        name: AVPlayerItemDidPlayToEndTimeNotification,
        object: player.currentItem)

player.play()

func playAction()
{
    playerItem.seekToTime(kCMTimeZero)

    player.play()
    playButton.removeFromSuperview()
    playButton = nil
}

func playerItemDidReachEnd()
{
    let buttonImage = UIImage(named: "playButton.png")
    playButton = UIButton(frame: CGRectMake((self.view.frame.width - 168) / 2, (self.view.frame.height - 110) / 2, 168, 110))
    playButton.setImage(buttonImage, forState: .Normal)
    playButton.alpha = 0.6
    playButton.addTarget(self, action: "playAction", forControlEvents: .TouchUpInside)
    self.view.addSubview(playButton)
}


回答3:

import UIKit import MediaPlayer class videoView:UIViewController {

var videoPlayer:MPMoviePlayerController!
override func viewDidLoad() {
     super.viewDidLoad()

let videoString:String = Bundle.main.path(forResource: "here you can place your video name", ofType:".mp4")!
        let videoURL = NSURL.init(fileURLWithPath: videoString)
        videoPlayer = MPMoviePlayerController(contentURL: videoURL as URL!)
        videoPlayer.view.frame = CGRect(x: 0, y: 0, width: videoView.frame.size.width, height: videoView.frame.size.height)
        videoView.addSubview(videoPlayer.view)
        videoPlayer.prepareToPlay()
        videoPlayer.shouldAutoplay = false
        videoPlayer.isFullscreen = false
        videoPlayer.controlStyle = MPMovieControlStyle.embedded
       }
       }