クラスのadvance()
メソッドで予期されたより早く(ファイルの終わりの前に)通知されたストリームの終了に問題があります。 Googleのリファレンスによると、ローカルファイルを使用している場合advance()方法が間違って仕事ができる(これは私の場合です - filePath
ローカルファイルへのponits):MediaExtractor.advance() - ストリームの終わりが予期されたよりも早く到着しました
ローカルファイルを抽出し、事前の行動()と readSampleData(のByteBuffer、int)が同じローカルファイルへ 同時書き込みの存在下で定義されていません:
残念ながらadvance()
方法なしMediaExtractor
の使用についての単一の単語がありません。どのように次のサンプルに移動するには?それを行う方法がない場合は、MediaExtractor
を使用せずに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
};
}
これは機能します。ローカルファイルを抽出するとき、advance()とreadSampleData(ByteBuffer、int)の振る舞いは、同じローカルファイルへの同時書き込みの存在下では定義されていません。このリファレンスによれば、コードは機能しませんが、実際には動作します。 – Kristopher
これを読んだら、私は開発者ガイドでも混乱しました。しかし、私はサンプルを試して、彼らの行動はOKだった。だから私はちょうどこの情報をスキップ:) – Sheikh