[AVPlayer在播放来自UIImagePickerController的视频之前不会播放视频

问题描述 投票:0回答:1

我有一个问题,我在这里没有看到这样的帖子。我有一个AVPlayerViewController,它从我的Firebase数据库(而不是存储)的路径播放基于视频的视频。该视频可以按照我想要的方式完美播放,但是只有在我观看了在应用程序其他位置的UIImagePickerController中单击的视频后,该视频才播放。

例如,AVPlayer将显示黑色背景(应用程序中的所有AVPlayer's都会出现这种情况),但当我观看与UIImagePickerController无关的视频时其他观点。我不知道从哪里开始。感谢您的帮助和建议!

这是我的AVPlayerViewController的示例代码:

import UIKit
import AVFoundation
import AVKit

class VideoView: UIViewController {

private var videoURL: URL
var player: AVPlayer?
var playerController : AVPlayerViewController?

init(videoURL: URL) {
    self.videoURL = videoURL
    super.init(nibName: nil, bundle: nil)
}

required init?(coder aDecoder: NSCoder) {
    fatalError("init(coder:) has not been implemented")
}


override func viewDidLoad() {
    super.viewDidLoad()
    self.view.backgroundColor = UIColor.gray
    player = AVPlayer(url: videoURL)
    playerController = AVPlayerViewController()

    guard player != nil && playerController != nil else {
        return
    }
    playerController!.showsPlaybackControls = false

    playerController!.player = player!
    self.addChild(playerController!)
    self.view.addSubview(playerController!.view)
    playerController!.view.frame = view.frame
    NotificationCenter.default.addObserver(self, selector: #selector(playerItemDidReachEnd), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.player!.currentItem)

    let cancelButton = UIButton(frame: CGRect(x: 10.0, y: 10.0, width: 30.0, height: 30.0))
    cancelButton.setImage(#imageLiteral(resourceName: "cancel"), for: UIControl.State())
    cancelButton.addTarget(self, action: #selector(cancel), for: .touchUpInside)
    view.addSubview(cancelButton)


    // Allow background audio to continue to play
    do {
        try AVAudioSession.sharedInstance().setCategory(AVAudioSession.Category.ambient)
    } catch let error as NSError {
        print(error)
    }

    do {
        try AVAudioSession.sharedInstance().setActive(true)
    } catch let error as NSError {
        print(error)
    }
}

override func viewDidAppear(_ animated: Bool) {
    super.viewDidAppear(animated)
    player?.play()
}

@objc func cancel() {
    dismiss(animated: true, completion: nil)
}

@objc fileprivate func playerItemDidReachEnd(_ notification: Notification) {
    if self.player != nil {
        self.player!.seek(to: CMTime.zero)
        self.player!.play()
    }
}

}
ios swift avplayer avplayerviewcontroller
1个回答
0
投票

您是否检查了子控制器视图的大小?

playerController!.view.frame = view.frame 

放入

override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()

        playerController!.view.frame = view.frame
    }

或使用约束。

© www.soinside.com 2019 - 2024. All rights reserved.