Я работаю над приложением tvOS с помощью быстрого доступа. Я использую AVPlayerViewController для воспроизведения видео после демонстрационного приложения Apple (каталог UIKit (tvOS): создание и настройка элементов управления UIKit). Все работает нормально, но приложение вводит фон на передний план во время воспроизведения видео, а вперед и назад не работает, и одна и та же проблема генерируется, если пользователь может перейти в спящий режим. Эта проблема также генерируется в демонстрационном приложении Apple.Вперед и назад не работает, когда приложение вводит фон на передний план во время воспроизведения видео в tvOS
Я не понимаю, почему эта проблема порождает. Пожалуйста, предложите мне, как его решить.
import UIKit
import Foundation
import AVKit
class ViewController: UIViewController ,AVPlayerViewControllerDelegate{
let playerController = AVPlayerViewController()
var playerObj:AVPlayer!
var asset:AVAsset!
var playerItem:AVPlayerItem!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
self.playVideo("http://p.events-delivery.apple.com.edgesuite.net/1509pijnedfvopihbefvpijlkjb/m3u8/hls_vod_mvp.m3u8")
}
override func viewWillAppear(animated: Bool) {
playerController.delegate = self
}
//MARK:- Play Video Method.
func playVideo(videoURL:String) {
print("video URL========\(videoURL)")
self.asset = AVAsset(URL: NSURL(string: videoURL)!) as AVAsset
self.playerItem = AVPlayerItem(asset: self.asset)
self.playerObj = AVPlayer(playerItem: self.playerItem)
self.playerController.player = self.playerObj
playerController.view.frame = CGRectMake(0.0, 0.0, UIScreen.mainScreen().bounds.width, UIScreen.mainScreen().bounds.height)
playerController.delegate = self
self.view.addSubview(playerController.view)
self.playerController.showsPlaybackControls = true
self.playerItem.addObserver(self, forKeyPath: "status", options: NSKeyValueObservingOptions.New, context: nil)
self.playerController.player!.play()
//self.playerController.player!.play()
}
override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>){
if object as? NSObject == playerItem && (keyPath! as NSString).isEqualToString("status") {
if (playerItem?.status == AVPlayerItemStatus.ReadyToPlay) {
print("Player Ready to play")
}
if (playerItem?.status == AVPlayerItemStatus.Failed) || (playerItem?.status == AVPlayerItemStatus.Unknown) {
print("Player getting play error")
}
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
Объем контекста кода, который вы дали, недостаточен, чтобы действительно придумать жизнеспособное решение для вас, потому что я не могу определить полный контекст. Из моего опыта работы с AVPlayer я рекомендую сделать это переменной класса, но кажется, что вместо этого вы делаете эту переменную метода. Если это так, то, вероятно, ваша функция не будет удерживаться на AVPlayer всякий раз, когда метод завершается. Apple даже предполагает, что вы создаете переменную класса для AVPlayer, чтобы «удерживать» ссылку AVPlayer для жизненного цикла вашего приложения. – user1171911
Я пробовал с переменной класса, но проблема такая же. – vipulk617
Я все же рискну сказать, что ваш класс освобождает делегата для приема сообщений в прямом и обратном направлении. Это может означать, что ваш класс нераспределяется, когда приложение входит в фоновый режим. Обычно для решения этой проблемы я создаю одноэлементный класс для управления воспроизведением аудио/видео, чтобы я мог гарантировать, что мое приложение сильно привязается к моему AVPlayer на протяжении всего жизненного цикла приложения. – user1171911