2014-10-02 59 views
15

我能夠成功創建播放器,但被初始黑屏困擾。我決定覆蓋一個UIImageView並在玩家開始後隱藏它。這工作,但我不想爲所有我的視頻創建和維護圖像的麻煩。如何在啓動AVPlayer時顯示暫停的視頻而不是黑屏

我能夠通過播放並在實例化後立即暫停播放器來獲得我想要的確切結果。唯一的問題是,有時玩家的狀態被錯誤地記錄下來,所以當我再次啓動玩家時,即使玩家已經暫停,狀態也被列爲已經「玩」。

我開始考慮使用AVPlayerItem seekToTime但還沒有找到任何可行的解決方案。有沒有一個「非哈克」的方式來實現這一目標?

+1

@Cris:http://stackoverflow.com/questions/15360721/create-a-thumbnail-or-image-of-an-avplayer-at-current-time? – Larme 2016-06-21 18:39:47

+1

我認爲Larme提到的鏈接會給你一個正確的方向。按需創建縮略圖,並將其疊加在播放器的頂部(也可能是播放按鈕),這樣就不必播放並立即暫停 – Stephenye 2016-06-21 19:33:36

+1

在項目中,我必須構建我需要的新視頻在沒有黑屏或縮略圖的情況下播放。客戶要求我將第一個視頻傳遞給第二個視頻,就好像第二個視頻是下一個視頻一樣,不會中斷 – Cris 2016-06-21 19:57:15

回答

8

如果您使用的是AVPlayerViewController,這是播放器控制器的contentOverlayView屬性的完美使用。這是玩家層和恰好露出用於此目的的控制之間的UIView

首先,創建的屏幕截圖:

let asset = AVAsset(URL: URL(string: "")!) // link to some video 
let imageGenerator = AVAssetImageGenerator(asset: asset) 
let screenshotTime = CMTime(seconds: 1, preferredTimescale: 1) 
if let imageRef = try? imageGenerator.copyCGImageAtTime(screenshotTime, actualTime: nil) { 

    let image = UIImage(CGImage: imageRef) 

    // see part 2 below 
} 

現在,添加該圖像作爲在播放器控制器的contentOverlayView的子視圖:

// in the same try block 

let imageView = UIImageView(image: image) 
let playerVC = AVPlayerViewController() 
let playerItem = AVPlayerItem(asset: asset) 
playerVC.player = AVPlayer(playerItem: playerItem) 

self.presentViewController(playerVC, animated: true) { 
    playerVC.contentOverlayView?.addSubview(imageView) 
    // adjust the frame of your imageView to fit on the player controller's contentOverlayView 
} 

然後,取出imageView子視圖當玩家開始玩的資產,或緩衝完成時。

1

與您的播放器關聯的AVPlayerLayer具有readyForDisplay屬性。

您可以嘗試讓您的主機查看此值的觀察者,並在其設置爲true時立即進行刷新。

當第一幀準備好呈現時,它被設置爲true,因此在播放器有足夠的數據播放並將其狀態設置爲readyToPlay之前。

相關問題