내 onOutputBufferAvailable()
콜백 메소드 내에 outputBuffer
에 문제가 있습니다. 이 콜백 메소드가 호출 될 때마다 outputBuffer.hasRemaining
메소드를 사용하여 outputBuffer
을 확인합니다. 항상 false
을 반환합니다.MediaCodec outputBuffer는 항상 비어 있습니다.
codec.setCallback(new MediaCodec.Callback() {
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onInputBufferAvailable(MediaCodec mc, int inputBufferId) {
ByteBuffer inputBuffer = codec.getInputBuffer(inputBufferId);
int rounds = extractor.readSampleData(inputBuffer,0);
if(rounds > 0) {
long currentT = extractor.getSampleTime();
Log.i("CurrentT", String.valueOf(currentT/(1000*1000)));
codec.queueInputBuffer(inputBufferId, 0, rounds, 0, 0);
extractor.advance();
} else {
// EOS
codec.queueInputBuffer(inputBufferId, 0, 0, 0, MediaCodec.BUFFER_FLAG_END_OF_STREAM);
Log.i("EOS","=-1");
}
}
@Override
public void onError(@NonNull MediaCodec mediaCodec, @NonNull MediaCodec.CodecException e) {
Log.i("error", "e");
}
@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
@Override
public void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, MediaCodec.BufferInfo info) {
ByteBuffer outputBuffer = codec.getOutputBuffer(outputBufferId);
Log.i("has", String.valueOf(outputBuffer.hasRemaining()));
if (outputBuffer.hasRemaining()) {
b = outputBuffer.get();
Log.i("i", String.valueOf(b));
BAOS.write(b);
outputBuffer.clear();
} else {
array= BAOS.toByteArray();
codec.stop();
codec.release();
}
codec.releaseOutputBuffer(outputBufferId, false);
}
@Override
public void onOutputFormatChanged(MediaCodec mc, MediaFormat format) {
// Subsequent data will conform to new format.
// Can ignore if using getOutputFormat(outputBufferId)
// mOutputFormat = format; // option B
}
});
실제 위치를 얻으려고 'presentationTimeUs()'를 사용합니까? – Kristopher
아니요, MediaCodec.BufferInfo의 'offset' 및'size' 필드를 읽는 것을 의미합니다. 그러나,'getOutputBuffer()'의 문서는 이미 자동적으로 설정되었다는 것을 증명하는 것처럼 보입니다 : "반환 된 버퍼의 위치와 한계는 유효한 출력 데이터" – mstorsjo
Do not know my info. offset '은 항상 0입니다.'info.size'는 4608입니다. – Kristopher