基於偏移量實現seekTo()
的目標是新穎的,但同樣存在多重挑戰。在進入seekTo()
實施之前,有關MediaPlayer
和MediaMetadataRetriever
的一些說明。這兩個類都在內部使用MediaExtractor
對象來檢索metadata
信息。因此MediaPlayer
不包括包括MediaMetadataRetriever
類。
首先,我們來考慮提取比特率。 MediaPlayer
是一個應支持多種文件格式的通用實現。因此,對於你的設計,你需要確保bitrate
參數由般的視聽格式,如MP4
,MPEG-2 TS
,AVI
,Matroska
等,或音頻格式只喜歡WAV
,MP3
等。在您的系統支持所有的文件格式中提取最新的android實現,我發現只有MP3Extractor
是通過kKeyBitrate
鍵暴露比特率。
接下來,來到您的算法,我發現以下挑戰附加到基於大小的查找。
audio
和video
音軌以交錯方式存儲。因此,由於輸入數據的交錯性質,time * bitrate (in bytes)
不會直接有用。
需要考慮起始偏移量。在該文件中,有一些metadata
或boxes
存儲在該文件開始時特定於文件格式的文件中。您將不得不考慮這種偏移,對於不同的格式也會有所不同。
如果輸入有一個像audio
,video
,text
或者說多個audio
軌道的軌道更mnumber作爲一部電影,那麼問題將變得更爲複雜。
視頻幀的大小通常不規則。即使使用恆定比特率模型,視頻幀的大小可能會根據幀的類型顯着變化。通常,與P-frame
或B-frame
相比,I-frame/IDR-Frame in H.264
可消耗大量的位。這將對基於尺寸的seekTo()
實現造成實際困難。人們可以很容易地觀察1:5的比例在外形尺寸方面爲I和P幀
有,你已經承認了可變比特率模型的一定影響。因此,我忽略了這一點。
:在上述點,沒有勸阻你,我覺得size
根據實施看起來是困難的。
謝謝Ganesh,我仍然想知道是否有辦法從mediaplayer本身檢索這些數據。考慮一個在HTTP情況下執行搜索的流式傳輸,我假設一個範圍請求將由mediaplayer執行,並且這個數據應該在那裏。 – Nims 2013-03-24 03:16:43
當通過'http'流數據時,通過'NuCachedSource2'有一個緩存實現。因此,seekTo將首先在本地頁面緩存中被觸發。如果範圍不同,我認爲請求仍然是基於時間而不是大小。 – Ganesh 2013-03-24 03:34:58