2017-04-12 3 views
0

Ich bin nicht sehr erfahren beim Erstellen von Android-Apps und ich versuche, eine kleine App mit ExoPlayer zu machen. Hoffentlich könnt ihr meine Unwissenheit verzeihen. Ich versuche im Wesentlichen zu sehen, ob es einen Weg gibt, Zugang zu den gepufferten Dateien zu bekommen. Ich suchte herum, aber es scheint keine Antwort dafür zu geben. Ich habe Leute gesehen, die über cacheDataSource gesprochen haben, aber dann dachte ich, werden die Daten nicht bereits durch Pufferung zwischengespeichert? Zum Beispiel, wenn ein Video startet, fängt es an zu puffern. Ich tue das auch dann weiter, wenn eine Pause gedrückt wird. Wenn ich das richtig verstehe, spielt das Video tatsächlich von den gepufferten Daten ab. Ich gehe davon aus, dass diese Daten irgendwo gespeichert werden müssen. Sind diese Cache-Daten in diesem Fall? wenn nicht, was sind dann Cachedaten? Was ist der Unterschied hier? und schließlich, wie kann ich tatsächlich Zugang zu dem bekommen, was das ist? I'v versucht, um zu sehen, wo sein wie und wie gespeichert werden, was (eine Art von Datei Bedeutung sein kann), und ich die DefaultAllocator Klasse erreicht, die diese Liniegepufferte Daten erhalten exoplayer

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

dies im DefaultAllocator ist zu haben scheint .java-Datei. Nicht sicher, ob ich an der richtigen Stelle bin ...

Ich bin nicht in der Lage zu verstehen, was der Puffer ist und wie es gespeichert ist. Youtube speichert .exo-Dateien. Ich kann einen Cache-Ordner in data/data/myAppName/cache durch Drucken der getCacheDir() sehen, aber das scheint zu geben einige java.io.fileAndSomeRandomChars. Der Puffer wird auch gelöscht, wenn der Player minimiert oder eine andere App geöffnet wird.

Kann der ExoPlayer auch Dateien in Blöcken speichern?

Jeder Einblick darauf wäre wirklich super hilfreich !. Ich bin jetzt seit ein paar Tagen darauf festgefahren. Super Duper schätzen es!

Antwort

1

Puffer sind keine Dateien, Puffer werden im Anwendungsspeicher gespeichert und in diesem Beispiel sind sie Instanzen der ByteBuffer Klasse. ExoPlayer-Puffer werden mithilfe der processOutputBuffer() -Methode durch Instanzen von MediaCodecRenderer geleitet.

Puffer sind in der Regel Arrays von Bytes oder andere Arten von Daten, während die ByteBuffer-Klasse einige hilfreiche Methoden um die Größe des Puffers seiner zuletzt zugegriffenen Position mit Hilfe von Marker und so weiter hinzuzufügen.

Die Art und Weise, wie I-Puffer Zugriff wird durch die Umsetzung der Renderer erstreckt, die ich verwende, und dann processOutputBuffer() außer Kraft setzen, wie dies:

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

es sich möglich, Videopixeldaten aus dem Puffer zu extrahieren? –