Я использую приведенный ниже код, и он возвращает черное видео на VIVO 1907, отлично работает на других устройствах. Я не понимаю, почему mediaCode c использует пустой буфер вместо предоставленного. Нужно ли проверять что-то во время выполнения?
int inputBufIndex = mediaCodec.dequeueInputBuffer(TIMEOUT_USEC);
long ptsUsec = computePresentationTime(mGenerateIndex, FRAME_RATE);
Log.d(TAG, "encode: inputBufIndex " + inputBufIndex);
if (inputBufIndex >= 0) {
final ByteBuffer inputBuffer = mediaCodec.getInputBuffer(inputBufIndex);
inputBuffer.clear();
inputBuffer.put(byteConvertFrame);
mediaCodec.queueInputBuffer(inputBufIndex, 0, byteConvertFrame.length, ptsUsec, 0);
mGenerateIndex++;
}
final MediaCodec.BufferInfo mBufferInfo = new MediaCodec.BufferInfo();
final int encoderStatus = mediaCodec.dequeueOutputBuffer(mBufferInfo, TIMEOUT_USEC);
Log.d(TAG, "encode: encoderStatus " + encoderStatus);
if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
// no output available yet
Log.e(TAG, "No output from encoder available");
formatChanged = false;
} else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
// not expected for an encoder
MediaFormat newFormat = mediaCodec.getOutputFormat();
Log.d(TAG, "encode: newFormat " + newFormat + " mTrackIndex " + mTrackIndex);
mTrackIndex = mediaMuxer.addTrack(newFormat);
mediaMuxer.start();
formatChanged = true;
} else if (encoderStatus < 0) {
Log.e(TAG, "unexpected result from encoder.dequeueOutputBuffer: " + encoderStatus);
formatChanged = false;
} else if (mBufferInfo.size != 0) {
final ByteBuffer encodedData = mediaCodec.getOutputBuffer(encoderStatus);
Log.d(TAG, "encode: encodedData " + encodedData + " mTrackIndex " + mTrackIndex);
if (encodedData == null) {
Log.e(TAG, "encoderOutputBuffer " + encoderStatus + " was null");
} else {
encodedData.position(mBufferInfo.offset);
encodedData.limit(mBufferInfo.offset + mBufferInfo.size);
mediaMuxer.writeSampleData(mTrackIndex, encodedData, mBufferInfo);
mediaCodec.releaseOutputBuffer(encoderStatus, false);