得到缓冲数据exoplayer

时间:2017-04-12 04:19:54

标签: android buffer exoplayer

我在构建Android应用程序方面经验不足,我正在尝试使用ExoPlayer创建一个小应用程序。所以希望你们能赦免我的无知。我基本上试图看看是否有办法访问缓冲文件。我四处搜寻,但似乎没有答案。我看到有人在谈论cacheDataSource,但后来我想,是不是数据已经因缓存而缓存?例如,当视频开始时,它开始缓冲。即使按下暂停,我也会继续这样做。如果我正确理解这一点,视频实际上是从缓冲数据中播放的。我假设这些数据必须存储在某个地方。在这种情况下,这是缓存数据吗?如果没有,那么什么是缓存数据?这有什么区别?最后,我怎样才能真正获得这个是什么?我一直在试图查看它被存储的位置和(因为某种文件可能是什么),并且我到达了DefaultAllocator类,它似乎有这一行

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

这是在DefaultAllocator.java文件中。不确定我是否正在寻找合适的地方...

我无法弄清楚缓冲区是什么以及它是如何存储的。 Youtube存储.exo文件。我可以通过打印data/data/myAppName/cachegetCacheDir()中看到缓存文件夹,但这似乎是在发布一些java.io.fileAndSomeRandomChars。当播放器最小化或打开另一个应用程序时,缓冲区也会被删除。

ExoPlayer是否也以块的形式存储文件?

任何有关这方面的见解都会非常有用!我已经被困在这几天了。 Super duper很欣赏它!

1 个答案:

答案 0 :(得分: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;
    }

}