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
?