我有类的advance()
方法提前发送信号的流结束的问题(文件结束之前的方式)。据谷歌引用advance()方法可以使用本地文件时,工作错误(这是我的情况 - filePath
ponits到本地文件):MediaExtractor.advance() - 流结束的信号早于预期
在提取本地文件,事先的行为()和 readSampleData(字节缓冲区,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
};
}
This Works。那么你能告诉我这是什么意思'当提取本地文件时,advance()和readSampleData(ByteBuffer,int)的行为在并发写入同一本地文件时未定义。根据这个参考,你的代码不应该工作,但它确实有效。 – Kristopher
在开发人员指南中阅读时,我也感到困惑。但我试过样品,他们的行为是确定的。所以我只是跳过这个信息:) – Sheikh