我有一個播放HLS視頻流的AVPlayer。我的用戶界面提供了一排按鈕,視頻中每個「章節」都有一個按鈕(按鈕標記爲「1」,「2」,「3」)。該應用程序從包含以秒錶示的章節切入點列表的服務器下載一些元數據。例如,一個視頻長度爲12分鐘 - 章節切入點列表爲0,58,71,230,530等等。AVPlayer seekToTime不能播放正確的位置
當用戶點擊其中一個「章節按鈕」時,按鈕處理程序代碼執行以下操作:
[self.avPlayer pause];
[self.avPlayer seekToTime: CMTimeMakeWithSeconds(seekTime, 600)
toleranceBefore: kCMTimeZero
toleranceAfter: kCMTimeZero
completionHandler: ^(BOOL finished)
{
[self.avPlayer play];
}];
其中「seekTime」是包含切入點的本地變量(如上所述)。
問題是,視頻並不總是從正確的位置開始。有時候確實如此。但有時在請求的seekTime之前,它從十分之一秒到2秒。它永遠不會在請求的seekTime後啓動。
下面是對視頻編碼的一些統計數據:
編碼器:handbrakeCLI 編解碼器:H.264 幀速率:24(實際上,23.976 - 同樣,因爲它是怎麼拍) 視頻比特率:多種比特率( 64/150/300/500/800/1200) 音頻比特率:128K 關鍵幀:23.976(每秒1次)
我使用的是蘋果mediafilesegmenter工具,當然,並生成播放列表中的variantplaylistcreator。
這些文件是從Amazon Cloud/S3存儲桶提供的。
我還不清楚的一個領域是CMTimeMakeWithSeconds - 我根據不同的文章/文檔嘗試了幾個不同的變體。例如,在上面的摘錄我使用:
CMTimeMakeWithSeconds(seekTime,600)
我也曾嘗試:
CMTimeMakeWithSeconds(seekTime,1)
我不能告訴哪個是正確的,雖然兩者似乎產生相同的不一致的結果!
我也曾嘗試:
CMTimeMakeWithSeconds(seekTime,23.967)
有些文章聲稱這就像一個分子/ denomenator,因此n/1應該是正確的,其中 'n' 是的秒數(如在CMTimeMakeWithseconds(n,1)中)。但是,代碼最初是由另一位程序員創建的(他現在已經離開了),他使用600號碼作爲preferredTimeScale(即CMTimeMakeWithseconds(n,600))。
任何人都可以提供任何線索,我做錯了什麼,或者即使我試圖達到的那種準確性甚至是可能的?
如果有人想要提供「替代」解決方案,我們已經在考慮將視頻分成不同的流,每章一個,但我們不相信這會給我們提供相同的性能,由於必須創建和加載新的AVPlayerItem等,所以章節將花費更長的時間等等。因此,如果您認爲這是唯一可行的解決方案(而且我們希望這將實現我們想要的結果 - 即每一章將開始在我們想要的位置)我們可以自由地這麼說。
在此先感謝!
對不起,這是怎麼回答的? – 2013-04-11 08:08:34
錯誤。時間刻度爲1意味着您只能指定整秒尋找。時間刻度是每秒鐘的部分數量。正如Apple推薦的那樣,視頻採用600,因爲它是每秒50,60,25和24幀等常見視頻幀率的產品。 – 2015-10-27 02:41:25