2017-04-12 176 views
0

我不是很有經驗的建設Android應用程序,我正在嘗試使用ExoPlayer製作一個小應用程序。所以希望你們可以原諒我的無知。我基本上試圖看看是否有辦法訪問緩衝文件。我四處搜尋,但似乎沒有答案。我看到有人在討論cacheDataSource,但後來我想,是不是因爲緩衝而已經緩存了數據?例如,當視頻開始時,它開始緩衝。即使按暫停,我也會繼續這樣做。如果我正確理解這一點,視頻實際上是從緩衝數據播放的。我假設這些數據必須存儲在某個地方。這種情況下的緩存數據是?如果沒有,那麼什麼是緩存數據?這裏有什麼區別?最後,我怎樣才能真正獲得這些是什麼?我心中已經在試圖看到它被存儲爲和什麼(指某些類型的文件可能),我到達了DefaultAllocator類,它似乎有這條線得到緩衝數據exoplayer

availableAllocations[i] = new Allocation(initialAllocationBlock,allocationOffset);//is this it?? 

這是在DefaultAllocator .java文件。不知道如果我看在正確的地方...

我無法理解什麼是緩衝區甚至是如何存儲。 Youtube存儲.exo文件。通過打印getCacheDir(),我可以在data/data/myAppName/cache中看到一個緩存文件夾,但似乎是給出了一些java.io.fileAndSomeRandomChars。當玩家最小化或打開另一個應用程序時,緩衝區也會被刪除。

ExoPlayer是否也以塊存儲文件?

任何有關這方面的見解將嚴重超級有用!我現在已經堅持了幾天。超級騙子感激它!

回答

1

緩衝區不是文件,緩衝區存儲在應用程序內存中,在本例中它們是ByteBuffer類的實例。 ExoPlayer緩衝區使用processOutputBuffer()方法傳遞給MediaCodecRenderer的實例。

緩衝區通常是字節數組或者其他類型的數據,而ByteBuffer類在其周圍增加了一些有用的方法,用於跟蹤緩衝區的大小以及使用標記等最後訪問的位置。

我如何訪問緩存的方法是通過擴展,我使用渲染器的執行,然後覆蓋processOutputBuffer()這樣的:

public class CustomMediaCodecAudioRenderer extends MediaCodecAudioRenderer 
{ 
    @Override 
    protected boolean processOutputBuffer(long positionUs, long elapsedRealtimeUs, MediaCodec codec, ByteBuffer buffer, int bufferIndex, int bufferFlags, long bufferPresentationTimeUs, boolean shouldSkip) throws ExoPlaybackException 
    { 

     boolean fullyProcessed; 

     //Here you use the buffer 
     doSomethingWithBuffer(buffer); 


     //Here we allow renderer to do its normal stuff 
     fullyProcessed = super.processOutputBuffer(positionUs, 
      elapsedRealtimeUs, 
      codec, 
      buffer, 
      bufferIndex, 
      bufferFlags, 
      bufferPresentationTimeUs, 
      shouldSkip); 





     return fullyProcessed; 
    } 

} 
+0

它可以從緩存中提取視頻像素數據? –