我在构建Android应用程序方面经验不足,我正在尝试使用ExoPlayer创建一个小应用程序。所以希望你们能赦免我的无知。我基本上试图看看是否有办法访问缓冲文件。我四处搜寻,但似乎没有答案。我看到有人在谈论cacheDataSource,但后来我想,是不是数据已经因缓存而缓存?例如,当视频开始时,它开始缓冲。即使按下暂停,我也会继续这样做。如果我正确理解这一点,视频实际上是从缓冲数据中播放的。我假设这些数据必须存储在某个地方。在这种情况下,这是缓存数据吗?如果没有,那么什么是缓存数据?这有什么区别?最后,我怎样才能真正获得这个是什么?我一直在试图查看它被存储的位置和(因为某种文件可能是什么),并且我到达了DefaultAllocator类,它似乎有这一行
availableAllocations[i] = new Allocation(initialAllocationBlock,allocationOffset);//is this it??
这是在DefaultAllocator.java文件中。不确定我是否正在寻找合适的地方...
我无法弄清楚缓冲区是什么以及它是如何存储的。 Youtube存储.exo文件。我可以通过打印data/data/myAppName/cache
在getCacheDir()
中看到缓存文件夹,但这似乎是在发布一些java.io.fileAndSomeRandomChars
。当播放器最小化或打开另一个应用程序时,缓冲区也会被删除。
ExoPlayer是否也以块的形式存储文件?
任何有关这方面的见解都会非常有用!我已经被困在这几天了。 Super duper很欣赏它!
答案 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;
}
}