Android Präzise Suche nach Video

Ich habe Probleme mit der präzisen Suche mit MediaExtractor'sseekTo(). Während ich versuchen kann, Frames ohne Probleme zu synchronisieren, möchte ich nach einer bestimmten Zeit suchen.Die Frage führte mich zu einigen Ideen, wie dies zu tun ist, aber ich bin nicht sicher, ob sie gültig sind. Grundsätzlich müsste ich nach dem nächsten vorherigen Synchronisationsframe suchen und dannadvance() den Extraktor, bis die Zielzeit erreicht ist. Jeder Frame in dem Prozess würde dem Decoder zugeführt, d. H. Der erste I-Frame und die restlichen P-Frames. Dies ist ein zugehöriges Code-Snippet (basierend auf google / grafika 's 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();
        }
    }
}

Wie Sie sich vorstellen können, stelle ich normalerweise eine große Anzahl von Frames in die Warteschlange, aber im Moment kann ich nicht mit dem Speicherverbrauch oder einer eventuellen Verzögerung rechnen. Das Problem ist, dass dasdequeueInputBuffer() -Methode funktioniert nur für einige Zeit in der Schleife, bleibt eventuell bei der Rückgabe von -1 hängen, was entsprechend der Dokumentation bedeutet, dass der Puffer nicht verfügbar ist. Wenn ich das @ ändern würTIMEOUT_USEC zu-1, Ich bekomme Endlosschleife.

Kann mir jemand sagen, ob dieser Ansatz korrekt ist oder warum ich irgendwann keinen Zugriff mehr auf @ bekomminputBuffer?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage