получить буферизованные данные exoplayer

У меня нет большого опыта создания приложений для 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 файлы фрагментами?

Любое понимание этого было бы очень полезно! Я застрял на этом уже несколько дней. Супер пупер ценю!


person ooberjoker    schedule 12.04.2017    source источник


Ответы (1)


Буферы не являются файлами, буферы хранятся в памяти приложения, и в этом примере они являются экземплярами ByteBuffer класс. Буферы ExoPlayer передаются через экземпляры MediaCodecRenderer с использованием метода processOutputBuffer().

Буферы обычно представляют собой массивы байтов или, возможно, какой-либо другой тип данных, в то время как класс 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;
    }

}
person Community    schedule 29.05.2017
comment
Можно ли извлечь данные видеопикселя из буфера? - person Oliver Metz; 22.02.2018