【发布时间】:2014-01-25 03:07:37
【问题描述】:
我正在使用 MediaCodec 解码音轨。我的解码类可以很好地播放音频。我正在尝试使用总曲目持续时间和总播放时间在 SeekBar 中显示曲目的进度。我有两个 long,一个以微秒为单位记录曲目的总持续时间,另一个以微秒为单位记录曲目的总播放时间。
我遇到的问题是播放时长很快变得大于曲目的总时长。我不明白我哪里出错了。
解码类中的长声明:
private long durationUs; //track duration in us
private volatile long currentTimeUs; //total played duration thus far
确定 ctor 中的总持续时间:
extractor = new MediaExtractor();
extractor.setDataSource(fullPath);
format = extractor.getTrackFormat(0);
String mime = format.getString(MediaFormat.KEY_MIME);
durationUs = format.getLong(MediaFormat.KEY_DURATION);
我将输入样本的时间添加到 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();
}
}
}
【问题讨论】:
标签: android android-mediacodec mediaextractor