2016-10-04 94 views
0

你好我试图在后台播放视频,但它给出了一个错误和错误是“意外地发现零,同时展开一个可选值”,我已经设置在视频捆绑和选择复制,如果需要在后台播放视频swift 3

这个我的代码

import UIKit 
import AVFoundation 

class ViewController: UIViewController { 

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

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let url = Bundle.main.url(forResource: "Grad_Cap_Toss", withExtension: "mp4") 


     avPlayer = AVPlayer(url: url!) 
     avPlayerLayer = AVPlayerLayer(player: avPlayer) 
     avPlayerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
     avPlayer.volume = 0 
     avPlayer.actionAtItemEnd = AVPlayerActionAtItemEnd.none 

     avPlayerLayer.frame = view.layer.bounds 
     view.backgroundColor = UIColor.clear; 
     view.layer.insertSublayer(avPlayerLayer, at: 0) 

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

    } 

请任何机构拥有该出主意,谢谢

+1

在'AVPlayer(url:url!)''url' nil? –

+0

没有它不是n! –

+1

然后,你在哪条线上坠毁? –

回答

0

如果urlnil和视频已被成功复制到捆绑,可能的问题为c敏感度。确保文件名使用正确的大小写。 iOS设备文件系统区分大小写,因为iPhone模拟器不是。

+0

我设置每个东西都会像名称一样在捆绑但仍然不工作:( –

+0

'Bundle.main.url(forResource:withExtension:)'只会返回'nil',如果它找不到具有匹配名称的文件并且如果以下任何一种情况属实,则可能发生这种情况:a)文件未包含在“复制包资源”构建阶段中,b)提供的名称不匹配(区分大小写)或c)提供的扩展名不匹配(区分大小写)。 – Rick

1

我有一个类似的问题,并按照里克答案的指示来解决它。 我的问题是我没有捆绑资源中的视频文件。 检查您的视频文件是否在项目中的“构建阶段”下的“复制包资源”中列出。如果没有,请使用+按钮在其中添加文件。 此外,您可能会遗漏代码中的avPlayer.play()语句。

2

sup,我试图在我的登录页面的视图控制器中实现相同类型的视频背景。

我认为问题是您使用的语法有点不赞成。

乌尔工作的代码可能看起来像沿着下面的内容:

import UIKit 
import AVKit 
import AVFoundation 

class ViewController: UIViewController { 

@IBOutlet var blackOverlay: UIView! 

// init video background and its path 
var player: AVPlayer? 
let videoURL: NSURL = Bundle.main.url(forResource: "videoName", withExtension: "mp4")! as NSURL 

override func viewDidLoad() { 
    super.viewDidLoad() 

    // Adds a black overlay to the looped video in question 

    blackOverlay.alpha = 0.75; 
    blackOverlay.layer.zPosition = 0; 

    // begin implementing the avplayer 

    player = AVPlayer(url: videoURL as URL) 
    player?.actionAtItemEnd = .none 
    player?.isMuted = true 

    let playerLayer = AVPlayerLayer(player: player) 
    playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
    playerLayer.zPosition = -1 

    playerLayer.frame = view.frame 

    view.layer.addSublayer(playerLayer) 

    player?.play() 

    // add observer to watch for video end in order to loop video 

    NotificationCenter.default.addObserver(self, selector: #selector(ViewController.loopVideo), name: NSNotification.Name.AVPlayerItemDidPlayToEndTime, object: self.player) 

    // if video ends, will restart 

    func playerItemDidReachEnd() { 
     player!.seek(to: kCMTimeZero) 
    } 

} 
    // maybe add this loop at the end, after viewDidLoad 
    // func loopVideo() { player?.seek(to: kCMTimeZero) player?.play()}} 

让我知道是否有帮助,:)

0

我有同样的问题,当我试图播放视频背景。我认为这是视频资源的问题。

我解决了这样的问题。

当您拖动视频时,您应该选中'如果需要复制项目'和'添加到目标'。 或者您可以右键点击项目导航器,点击'添加'添加资源。

2
  1. 首先,在您的项目中拖放视频文件。
    1. 然后导入AVFundation。
    2. 添加例子:var player:AVPlayer?
    3. @IBOutlet weak var videoView:UIView! - 将故事板的视图连接到VC类。
    4. 之后,将此代码粘贴到您的ViewController中。
    5. 呼叫 “playBackgoundVideo()” 在您的viewDidLoad中()
private func playBackgoundVideo() { 
    if let filePath = Bundle.main.path(forResource: "your_video_here", ofType:"mp4") { 
     let filePathUrl = NSURL.fileURL(withPath: filePath) 
     player = AVPlayer(url: filePathUrl) 
     let playerLayer = AVPlayerLayer(player: player) 
     playerLayer.frame = self.videoView.bounds 
     playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
     NotificationCenter.default.addObserver(forName: .AVPlayerItemDidPlayToEndTime, object: self.player?.currentItem, queue: nil) { (_) in 
      self.player?.seek(to: kCMTimeZero) 
      self.player?.play() 
     } 
     self.videoView.layer.addSublayer(playerLayer) 
     player?.play() 
    } 
} 

我认为这将有助于。 ^^