advance()
我的问题是通过类的方法早于预期(文件结束之前)发出的流结束信号MediaExtractor
。根据 Google 参考, Advance ()方法在使用本地文件时可能会出错(这是我的情况 -filePath
指向本地文件):
提取本地文件时,Advance() 和 readSampleData(ByteBuffer, int) 的行为在并发写入同一本地文件时未定义:
不幸的是,没有关于使用MediaExtractor
没有advance()
方法的词。如何移动到下一个样本?如果没有办法做到这一点,那么我想知道如何在inputBuffer
不使用MediaExtractor
.
我的代码片段如下:
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
};
}