2016-07-15 79 views

回答

6

據我所知,我同意你的看法,有從調用play()函數到視頻實際播放(換句話說,視頻的第一幀被渲染的時間)之間有輕微的延遲。延遲取決於一些標準,例如視頻類型(視頻點播或直播),網絡狀況......但幸運的是,無論何時呈現視頻的第一幀,我的意思是視頻實際播放的時間。

通過觀察當前AVPlayerItemstatus,並且每當它是AVPlayerItemStatusReadyToPlay時,應該是第一幀已經被渲染。

[self.playerItem addObserver:self forKeyPath:@"status" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:NULL]; 

-(void)observeValueForKeyPath:(NSString*)path ofObject:(id)object change:(NSDictionary*)change context:(void*) context { 

    if([self.playerItem status] == AVPlayerStatusReadyToPlay){ 
     NSLog(@"The video actually plays") 
    } 
} 

順便提一下,還有另一種解決方案,我們觀察到的AVPlayerLayerreadyForDisplay狀態,這也表明,每當視頻呈現。然而,這種解決方案具有蘋果文件

/*! 
    @property  readyForDisplay 
    @abstract  Boolean indicating that the first video frame has been made ready for display for the current item of the associated AVPlayer. 
    @discusssion Use this property as an indicator of when best to show or animate-in an AVPlayerLayer into view. 
        An AVPlayerLayer may be displayed, or made visible, while this propoerty is NO, however the layer will not have any 
        user-visible content until the value becomes YES. 
        This property remains NO for an AVPlayer currentItem whose AVAsset contains no enabled video tracks. 
*/ 
@property(nonatomic, readonly, getter=isReadyForDisplay) BOOL readyForDisplay; 

這裏提到一個缺點是示例代碼

self.playerLayer = [AVPlayerLayer playerLayerWithPlayer:self.player]; 
[self.playerLayer addObserver:self forKeyPath:@"readyForDisplay" options:NSKeyValueObservingOptionInitial | NSKeyValueObservingOptionNew context:NULL]; 

-(void)observeValueForKeyPath:(NSString*)path ofObject:(id)object change:(NSDictionary*)change context:(void*) context { 
    if([self.playerLayer isReadyForDisplay]){ 
     NSLog(@"Ready to display"); 
    } 
} 

Thereotically,[self.playerLayer isReadyForDisplay]然而,應該返回YES,作爲文檔,它不guaranted。

我希望這會有所幫助。

+0

我覺得它非常有幫助。我目前正在使用「self.player!.addBoundaryTimeObserverForTimes([NSValue(CMTime:CMTimeMake(1,20))],隊列:nil,usingBlock:{()」並且它不是100%的時間發射,我是目前正在尋找你的解決方案,給我一個小時,我會更新如果它的工作,謝謝! –

+2

我不得不添加更多的東西,這是測試,如果狀態是AVPlayerStatusReadyToPlay AND player.rate> 0.我需要確保播放器正在播放,但除此之外,完美答案 –

+0

@ JoshO'Connor很高興聽到這個消息,謝謝。 – HDT

5

對於視頻

AVPlayer有一個名爲rate (Float)的說法,如果rate大於0.0,那裏正在播放的視頻。

您可以檢查是否rate!=0:(速度可以爲負,如果玩家會倒流)

if vidPlayer != nil && vidPlayer.rate != 0 { 
    println("playing") 
} 

AVPlayer class reference

+0

AVPlayer可以播放視頻。我不是在談論AVAudioPlayer –

+0

是的。我在12小時前編輯了答案,並刪除了這部分,至於@SohilR的建議。認爲它可以對其他用戶有所幫助。發佈的代碼是AVPlayer,而不是AVAudioPlayer。 – Idan

+0

編輯答案澄清。 – Idan