2012-03-23 40 views
8

我目前正在使用AVPlayer框架開發流媒體內容的視頻播放器。 我偶然發現AVPlayerLayer的VideoGravity String-Property可以讓玩家將Scaling/Resizing Mode設置爲不同的值。設置AVPlayerLayer VideoGravity在模擬器上工作,而不是在iPad上

爲用戶提供從默認的播放器稱爲縮放的功能,我已經設置了將執行以下代碼的方法:

AVPlayerLayer *layer = (AVPlayerLayer *)[self.videoContainer layer]; 

if([layer.videoGravity isEqualToString:AVLayerVideoGravityResizeAspect]) 
    layer.videoGravity = AVLayerVideoGravityResizeAspectFill; 
else 
    layer.videoGravity = AVLayerVideoGravityResizeAspect; 

這工作得很好的模擬器,但不知何故,我的iPad 2沒有安裝iOS 5.0.1。

有沒有人遇到類似的問題?這是一個已知的5.0.0的iOS Bug嗎?用AVPlayerLayer實現縮放/調整大小有更好的方法嗎?

任何想法/提示/幫助和建議是大爲讚賞,

謝謝,

山姆

+0

當你說它不適用於真實的設備時,究竟發生了什麼?沒有什麼或其他意外的行爲? – reddersky 2012-03-23 11:10:32

+0

不幸的是沒有(可見)發生......如果我NSLog(layer.videoGravity)「正確的」VideoGravity字符串返回。它也接受它的變化,但它並沒有真正調整電影內容的大小...... – samsam 2012-03-23 13:27:01

+0

我可能會在這裏叫出錯誤的樹,但爲什麼你將videoGravity設置爲一個常量名稱的字符串,而不僅僅是設置它不斷自我?如上所述, – reddersky 2012-03-23 17:57:03

回答

20

設置邊界將在內部setNeedsLayout。如果你只是改變重力,你必須稱之爲你自己。致電setNeedsDisplay強制重新繪製也不會傷害,但我想AVPlayerLayer會更新圖層內容,以至於無所謂。

編輯:你的名字是我的兩倍!

+1

我無法得到這個解決方案爲我工作,並發現問題是iOS 5.0和5.0.1中的一個錯誤。如果有人在這方面磕磕絆絆,需要解決方案,請查看:http://stackoverflow.com/questions/8918105/animate-avplayerlayer-videogravity-property – 2012-08-09 19:45:00

4

我終於通過交換與以下上面的語句來解決我的問題...

if (self.player.status == AVPlayerStatusReadyToPlay) { 
    if([((AVPlayerLayer *)[self.videoContainer layer]).videoGravity isEqualToString:AVLayerVideoGravityResizeAspect]) 
     ((AVPlayerLayer *)[self.videoContainer layer]).videoGravity = AVLayerVideoGravityResizeAspectFill; 
    else 
     ((AVPlayerLayer *)[self.videoContainer layer]).videoGravity = AVLayerVideoGravityResizeAspect; 

    ((AVPlayerLayer *)[self.videoContainer layer]).bounds = ((AVPlayerLayer *)[self.videoContainer layer]).bounds; 
} 

將AVPlayerLayer的邊界設置爲AVPlayerLayer的邊界似乎有訣竅。雖然我真的不明白爲什麼。但是:歡呼的工作解決方案。

+1

請參閱[Animate AVPlayerLayer videoGravity屬性](http://stackoverflow.com/a/10489823/21698)問題的動畫解決方案iOS 5.0.1上的視頻重力變化。 – 0xced 2012-07-15 20:58:28

相關問題