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
?