Android Búsqueda precisa de video

Estoy luchando con la búsqueda precisa usando MediaExtractor'sseekTo(). Si bien puedo buscar sincronizar cuadros sin problemas, me gustaría buscar un tiempo específico.Esta La pregunta me llevó a algunas ideas sobre cómo hacer esto, pero no estoy seguro de si son válidas. Básicamente, tendría que buscar el marco de sincronización anterior más cercano y luegoadvance() el extractor hasta alcanzar el tiempo objetivo. Cada cuadro en el proceso sería alimentado al decodificador, es decir, el primer cuadro I y los cuadros P restantes. Este es un fragmento de código relacionado (basado engoogle / grafikaMoviePlayer):

extractor.seekTo((long) seekTarget[threadNr], MediaExtractor.SEEK_TO_PREVIOUS_SYNC);

...

while (extractor.getSampleTime() < (long) seekTarget[threadNr]) {
    Log.d(TAG, "Thread " + threadNr + " advanced to timestamp " + extractor.getSampleTime());

    int inputBufIndex = decoder.dequeueInputBuffer(TIMEOUT_USEC);
    if (inputBufIndex >= 0) {
        ByteBuffer inBufer = decoderInputBuffers[inputBufIndex];
        int chunkSize = extractor.readSampleData(inBufer, 0);

        if (chunkSize < 0) {
            // End of stream -- send empty frame with EOS flag set.
            decoder.queueInputBuffer(inputBufIndex, 0, 0, 0L,
                    MediaCodec.BUFFER_FLAG_END_OF_STREAM);
            inputDone = true;
            if (VERBOSE) Log.d(TAG, "sent input EOS");
        } else {
            if (extractor.getSampleTrackIndex() != trackIndex) {
                Log.w(TAG, "WEIRD: got sample from track " +
                        extractor.getSampleTrackIndex() + ", expected " + trackIndex);
            }

            long presentationTimeUs = extractor.getSampleTime();
            decoder.queueInputBuffer(inputBufIndex, 0, chunkSize,
                    presentationTimeUs, 0 /*flags*/);
            if (VERBOSE) {
                Log.d(TAG, "submitted frame " + inputChunk + " to dec, size=" +
                        chunkSize + " inputBufIndex: " + inputBufIndex);
            }
            inputChunk++;
            extractor.advance();
        }
    }
}

Como puede imaginar, generalmente estoy haciendo cola en una gran cantidad de cuadros, pero por ahora estoy bien con el consumo de memoria o el retraso eventual. El problema es que eldequeueInputBuffer() El método funciona solo durante un tiempo en el ciclo, eventualmente se atasca al devolver -1, lo que de acuerdo con la documentación significa que el búfer no está disponible. Si yo cambiara elTIMEOUT_USEC a-1, Me sale un bucle infinito.

¿Puede alguien decirme si este enfoque es correcto o por qué en algún momento no puedo acceder ainputBuffer?

Respuestas a la pregunta(1)

Su respuesta a la pregunta