MediaExtractor.advance() - 比预期更早发出流结束信号
MediaExtractor.advance() - End of stream signalled earlier than expected
我遇到问题,通过 MediaExtractor
class 的 advance()
方法比预期更早(在文件结束之前)发出流结束信号。根据 Google 参考,使用本地文件时 advance() 方法可能会出错(这是我的情况 - filePath
指向本地文件):
When extracting a local file, the behaviors of advance() and
readSampleData(ByteBuffer, int) are undefined in presence of
concurrent writes to the same local file:
不幸的是,没有关于使用 MediaExtractor
没有 advance()
方法的单字。如何移动到下一个样本?如果没有办法做到这一点,那么我想知道如何在不使用 MediaExtractor
.
的情况下喂养 inputBuffer
我的代码片段如下:
if(Build.VERSION.SDK_INT >= 21 ) {
try {
codec = MediaCodec.createByCodecName("OMX.google.mp3.decoder");
} catch (IOException e) {
e.printStackTrace();
}
final MediaExtractor extractor = new MediaExtractor();
try {
extractor.setDataSource(filePath); //local file
Log.i("filePath", String.valueOf(filePath));
extractor.selectTrack(0);
} catch (IOException e) {
e.printStackTrace();
}
codec.setCallback(new MediaCodec.Callback() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);
// fill inputBuffer with valid data
int sampleSize = extractor.readSampleData(inputBuffer,0);
if(extractor.advance) {
codec.queueInputBuffer(inputBufferId, 0, sampleSize, 0, 0);
} else {
// EOS
codec.queueInputBuffer(inputBufferId, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
codec.stop();
codec.release();
}
}
// more callbacks
};
}
在我的示例中,当我使用另一种语句构造时,MediaExtractor 工作正常。我没有像你一样用 extractor.advance() 检查 EOS 。试试其他样品的报价:
int chunkSize = extractor.readSampleData(inputBuffer, 0);
if (chunkSize < 0) {
// End of stream -- send empty frame with EOS flag set.
codec.queueInputBuffer(inputBufferId, 0, 0, 0L,
MediaCodec.BUFFER_FLAG_END_OF_STREAM);
} else {
// No EOS -- continue
long presentationTimeUs = extractor.getSampleTime();
codec.queueInputBuffer(inputBufferId, 0, chunkSize,
presentationTimeUs, 0 /*flags*/);
extractor.advance();
}
顺便说一句,MediaExtractor 的指南讲述了这种用法。
Fadden 在 Grafika 中拥有带有 MediaExtractor 的 MoviePlayer。但它在没有 MediaCodec.Callback.
的情况下提供解码器
我遇到问题,通过 MediaExtractor
class 的 advance()
方法比预期更早(在文件结束之前)发出流结束信号。根据 Google 参考,使用本地文件时 advance() 方法可能会出错(这是我的情况 - filePath
指向本地文件):
When extracting a local file, the behaviors of advance() and readSampleData(ByteBuffer, int) are undefined in presence of concurrent writes to the same local file:
不幸的是,没有关于使用 MediaExtractor
没有 advance()
方法的单字。如何移动到下一个样本?如果没有办法做到这一点,那么我想知道如何在不使用 MediaExtractor
.
inputBuffer
我的代码片段如下:
if(Build.VERSION.SDK_INT >= 21 ) {
try {
codec = MediaCodec.createByCodecName("OMX.google.mp3.decoder");
} catch (IOException e) {
e.printStackTrace();
}
final MediaExtractor extractor = new MediaExtractor();
try {
extractor.setDataSource(filePath); //local file
Log.i("filePath", String.valueOf(filePath));
extractor.selectTrack(0);
} catch (IOException e) {
e.printStackTrace();
}
codec.setCallback(new MediaCodec.Callback() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);
// fill inputBuffer with valid data
int sampleSize = extractor.readSampleData(inputBuffer,0);
if(extractor.advance) {
codec.queueInputBuffer(inputBufferId, 0, sampleSize, 0, 0);
} else {
// EOS
codec.queueInputBuffer(inputBufferId, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
codec.stop();
codec.release();
}
}
// more callbacks
};
}
在我的示例中,当我使用另一种语句构造时,MediaExtractor 工作正常。我没有像你一样用 extractor.advance() 检查 EOS 。试试其他样品的报价:
int chunkSize = extractor.readSampleData(inputBuffer, 0);
if (chunkSize < 0) {
// End of stream -- send empty frame with EOS flag set.
codec.queueInputBuffer(inputBufferId, 0, 0, 0L,
MediaCodec.BUFFER_FLAG_END_OF_STREAM);
} else {
// No EOS -- continue
long presentationTimeUs = extractor.getSampleTime();
codec.queueInputBuffer(inputBufferId, 0, chunkSize,
presentationTimeUs, 0 /*flags*/);
extractor.advance();
}
顺便说一句,MediaExtractor 的指南讲述了这种用法。 Fadden 在 Grafika 中拥有带有 MediaExtractor 的 MoviePlayer。但它在没有 MediaCodec.Callback.
的情况下提供解码器