2014-02-12 16 views
6

Ich habe eine App, in der ich AVPlayerLayer (innerhalb einer Unterklasse von UIView wie Apples AV Foundation Programming Guide verwendet) verwenden. Ich habe ein paar View-Controller, die im View-Controller gehalten werden, der für das Menü zuständig ist (JASidePanels werden verwendet). Das Problem ist wie folgt:AVPlayerLayer leer nach dem Eingeben von Hintergrund, während in einem versteckten Controller und Eintritt in den Vordergrund und angezeigt

Alles funktioniert in Ordnung, bis der View-Controller mit dem AVPlayer nicht versteckt wird (einige andere Ansicht wird angezeigt) und die App tritt Hintergrund, kommt wieder zurück und kehrt zur Ansicht zurück. Dies bewirkt, dass der AVPlayerLayer leer/transparent angezeigt wird. Der Gegenstand wird geladen, genauso wie ich es ausprobieren kann und tatsächlich wird es gespielt, aber kein Video ist zu sehen.

Was ist die Lösung für dieses Verhalten (und was ist die Ursache dafür)? Danke im Voraus.

+2

Haben Sie das jemals gelöst? PS. Relevantes xkcd: https://xkcd.com/979/ – vrutberg

+0

Ich hatte ein ähnliches Problem, aber das Video wurde nicht fortgesetzt, anstatt transparent zu werden. Versuchen Sie, das Video anzuhalten, wenn die App in den Hintergrund wechselt, und geben Sie dann das Video wieder, wenn die App in den Vordergrund wechselt. – gomezluisj

+0

Fügen Sie den Code hier ein. Dies wird uns helfen, Ihr Problem zu verstehen. – TechBee

Antwort

1

Ich bin mir nicht sicher, was bewirkt, dass es aber eine Lösung, die für mich gearbeitet wurde den Spieler auf dem AVPlayerLayer

avPlayerLayer = AVPlayerLayer(player: currentAvPlayer) 
0

SWIFT 3

Ich hatte das gleiche Problem zu setzen. Jedes Mal, wenn meine App in den Hintergrund und dann wieder in den Vordergrund trat, verschwand mein AVPlayer. Unten ist eine einfachere Version des Codes, der für mich funktioniert ... Ich musste den Player auf UIApplicationWillEnterForeground zurücksetzen. Ich kann mehr Code hinzufügen, wenn Sie es brauchen, lassen Sie es mich wissen. Es scheint für jetzt zu funktionieren. Prost!

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

    var avPlayer: AVPlayer! 
    var avPlayerLayer: AVPlayerLayer! 
    var paused: Bool = false 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // Be sure to add your file to your app (not in the assets folder) and add it to your target 
     let theURL = Bundle.main.url(forResource:"yourVideoFile", withExtension: "mp4") 

     avPlayer = AVPlayer(url: theURL!) 
     avPlayerLayer = AVPlayerLayer(player: avPlayer) 

     avPlayerLayer.frame = view.layer.bounds 
     avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 

     // .none is for looping videos if you uncomment "p: AVPlayerItem" below. 
     // .pause is to pause at the end of the video and hold the last frame 
     avPlayer.actionAtItemEnd = .pause 
     view.layer.insertSublayer(avPlayerLayer, at: 0) 

     NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidReachEnd(notification:)), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime,object: avPlayer.currentItem) 

     NotificationCenter.default.addObserver(self, selector: #selector(appMovingToForeground), name: Notification.Name.UIApplicationWillEnterForeground, object: nil) 

    } 

    override func viewDidAppear(_ animated: Bool) { 
     super.viewDidAppear(animated) 
     avPlayer.play() 
     paused = false 
    } 

    func playerItemDidReachEnd(notification: Notification) { 
     print("THE END") 

     // uncomment the following line for a looping video 
     // let p: AVPlayerItem = notification.object as! AVPlayerItem 
     // p.seek(to: kCMTimeZero) 

    } 

    func appMovingToForeground() { 
     print("App moved to foreground!") 
     avPlayerLayer = AVPlayerLayer(player: avPlayer) 
     view.layer.insertSublayer(avPlayerLayer, at: 0) 

     // If you want your video or video loop to continue playing when app moves to foreground add: 
     // avPlayer.play() 
     // paused = false 

    } 

}