2017-02-01 13 views
1

所以我把這個視頻播放到了視圖的子圖層中,但是視頻一直彈出在UIView下面沒有任何解決方案嗎?iOS swift,視頻輸出不集中在UIView裏面

import UIKit 
import AVKit 
import AVFoundation 
import MediaPlayer 

class ViewController: UIViewController { 

    var player : AVPlayer? = nil 
    var playerLayer : AVPlayerLayer? = nil 
    var asset : AVAsset? = nil 
    var playerItem: AVPlayerItem? = nil 

    @IBOutlet weak var videoView: UIView! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let videoURLWithPath = "http://selevision9890-i.akamaihd.net/hls/live/219323/98906/1.m3u8" 
     let videoURL = NSURL(string: videoURLWithPath) 
     asset = AVAsset(URL: videoURL!) as AVAsset 
     playerItem = AVPlayerItem(asset: asset!) 
     videoView.frame = self.view.frame 
     player = AVPlayer(playerItem: self.playerItem!) 
     playerLayer = AVPlayerLayer(player: self.player) 
     playerLayer!.frame = videoView.frame 
     videoView.layer.addSublayer(self.playerLayer!) 

     player!.play() 
    } 

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

正常視圖:

ScreenShot http://image.prntscr.com/image/c4e7b3cce58241e1893a65dcf8e76a3b.png

(從這裏:http://prnt.sc/e33dhf

旋轉的視圖:

ScreenShot http://image.prntscr.com/image/b00e9e2e15b241478d166d55be644666.png

(從這裏:http://prnt.sc/e33djs

+0

爲什麼你給playerlayer幀兩次 playerLayer!.frame = videoView.frame playerLayer?.frame = self.view .layer.frame –

+0

第二個是採取整個框架的視圖沒有它它的寬度較小 –

+0

我可以知道videoView框架 –

回答

1

我不得不avplayer溝和使用avplayerviewcontroller和它的工作很好,謝謝大家

import UIKit 
import AVFoundation 
import AVKit 

class ViewController: UIViewController { 

    let avPlayerViewController = AVPlayerViewController() 
    var avPlayer:AVPlayer? 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     // Do any additional setup after loading the view, typically from a nib. 
     let movieUrl:NSURL? = NSURL(string :"http://selevision9890-i.akamaihd.net/hls/live/219323/98906/1.m3u8") 

     if let url = movieUrl{ 
      self.avPlayer = AVPlayer(URL : url) 
      self.avPlayerViewController.player = self.avPlayer 
     } 
    } 

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

    @IBAction func play(sender: AnyObject) { 
     self.presentViewController(self.avPlayerViewController, animated: true) { 
      self.avPlayerViewController.player?.play() 
     } 
    } 
} 
+0

請內嵌您的代碼(標記您的代碼並點擊'{}',以便它也包含第一行和最後一行(請參閱代碼更改歷史記錄) – muescha

+0

感謝您的修改,我仍然是新手,並盡力而爲。 –

0

移動這個代碼到viewDidAppearviewWillAppear - 在viewDidLoad框架是不正確的呢。視圖的大小調整爲適合viewDidLoad之後的屏幕大小。

+0

視頻停止工作 –

+0

http://prnt.sc/e3329c這是我的問題的屏幕截圖 –

+0

刪除此行'playerLayer?.frame = self.view.layer.frame'。 –

0

集PlayerLayer videogravity

let videoURLWithPath = "http://selevision9890-i.akamaihd.net/hls/live/219323/98906/1.m3u8" 
let videoURL = NSURL(string: videoURLWithPath) 
playerItem = AVPlayerItem(url: videoURL! as URL) 
player = AVPlayer(playerItem: self.playerItem!) 
playerLayer = AVPlayerLayer(player: self.player) 
playerLayer.frame = videoView.frame 
playerLayer.backgroundColor = UIColor.black.cgColor 
playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
videoView.layer.addSublayer(self.playerLayer!) 
player!.play() 
+0

我使用的是xcode 7.3這段代碼不適用於其他特殊的URL事件 –

+0

和playerlayer videogravity不會改變視頻不顯示在uiview內的事實 –

+0

http: //prnt.sc/e3329c這是我的問題 –

0

我有類似的問題。我去子類的UIView是這樣的:

import UIKit 

class VideoPlayerView: UIView { 
var playerLayer: CALayer? 

override func layoutSublayersOfLayer(layer: CALayer) { 
    super.layoutSublayersOfLayer(layer) 
    playerLayer?.frame = self.bounds 
    } 
} 

,並用它來建立一個視頻是這樣的:

@IBOutlet weak var videoPlayer: VideoPlayerView! 

func setupVideoOnView() { 
    var player = AVPlayer(URL: mediaURL! as NSURL) 
    let playerLayer = AVPlayerLayer(player: player) 

    playerLayer.frame = self.videoPlayer.bounds 
    playerLayer.videoGravity = AVLayerVideoGravityResizeAspectFill 
    self.videoPlayer.layer.addSublayer(playerLayer) 
    self.videoPlayer.playerLayer = playerLayer 

} 

這並與錯誤幀一招。

+0

您正在使用class videoplayerview whats that?! –

+0

我寫了如何這clas看起來像。 –

+0

我粘貼了我所有的代碼,你可以更多地注意我應該做什麼,以防萬一我可以使用avplayerviewcontroller來取得同樣的結果 –