Android Procura precisa de vídeo

Estou lutando com uma busca precisa usando o MediaExtractorseekTo(). Embora eu possa procurar sincronizar quadros sem problemas, gostaria de procurar um horário específico.este A pergunta me levou a algumas idéias de como fazer isso, mas não tenho certeza se elas são válidas. Basicamente, eu teria que procurar o quadro de sincronização anterior mais próximo e, em seguida,advance() o extrator até que o tempo alvo seja atingido. Cada quadro no processo seria alimentado ao decodificador, isto é, o primeiro quadro I e os demais quadros P. Este é um trecho de código relacionado (com base emgoogle / grafikado MoviePlayer):

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 você pode imaginar, normalmente estou enfileirando uma grande quantidade de quadros, mas por enquanto estou bem com o consumo de memória ou eventual atraso. O problema é que odequeueInputBuffer() O método funciona apenas por algum tempo no loop, eventualmente retém -1, o que, de acordo com a documentação, significa que o buffer não está disponível. Se eu mudasse oTIMEOUT_USEC para-1, Recebo loop infinito.

Alguém pode me dizer se essa abordagem está correta ou por que, em algum momento, não consigo acessarinputBuffer?

questionAnswers(1)

yourAnswerToTheQuestion