Вопрос

I'm using MediaCodec to decode audio tracks. My decoding class works fine for playing the audio. I'm trying to show the progress of the track in a SeekBar, using the total track duration and the total played time. I have two longs, one which records the total duration of the track in microseconds, and another which records the total played time of the track in microseconds.

The problem I am having is the played duration quickly becomes larger than the total duration of the track. I don't understand where I'm going wrong.

long declarations in decoding class:

private long durationUs; //track duration in us
private volatile long currentTimeUs; //total played duration thus far

Determining the total duration in ctor:

extractor = new MediaExtractor();
extractor.setDataSource(fullPath);

format = extractor.getTrackFormat(0);
String mime = format.getString(MediaFormat.KEY_MIME);
durationUs = format.getLong(MediaFormat.KEY_DURATION);

Method where I add the time of the input sample to currentTimeUs:

private void advanceInput()
{
    boolean sawInputEOS = false;

    int inputBufIndex = codec.dequeueInputBuffer(TIMEOUT_US);
    if (inputBufIndex >= 0)
    {
        ByteBuffer dstBuf = codecInputBuffers[inputBufIndex];

        int sampleSize = extractor.readSampleData(dstBuf, 0);
        long presentationTimeUs = 0;

        if (sampleSize < 0)
        {
            sawInputEOS = true;
            sampleSize = 0;
        }
        else
        {
            presentationTimeUs = extractor.getSampleTime();
            currentTimeUs += presentationTimeUs;
        }

        codec.queueInputBuffer(inputBufIndex,
                0,
                sampleSize,
                presentationTimeUs,
                sawInputEOS ? MediaCodec.BUFFER_FLAG_END_OF_STREAM : 0);
        if (!sawInputEOS)
        {
            extractor.advance();
        }
    }
}
Это было полезно?

Решение

The time returned from getSampleTime() is a timestamp, so we must subtract this time from the previous time.

presentationTimeUs = extractor.getSampleTime();
currentTimeUs += presentationTimeUs - lastPresentationTime;
lastPresentationTime = presentationTimeUs;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top