问题描述
在多路复用器上调用 writeSampleData
时,我找不到解决错误“已经有编解码器特定数据”的方法。
有人知道这个错误的含义以及如何修复它吗?
我的片段
public void encodeVideoFromBuffer() throws Exception {
try {
// creates encoder
EncoderData encoderData = selectCodec(true);
final MediaCodec enc = encoderData.getEncoder();
final Mediamuxer mux = new Mediamuxer(mOutputPath,Mediamuxer.OutputFormat.muxer_OUTPUT_MPEG_4);
final long STEP_PRESENTATION_TIME_US = (long)(1.0 * 1000 * 1000 / mFrameRate);
enc.setCallback(new MediaCodec.Callback() {
private int mIndexFrame = 0;
private int mIndexTrack = -1;
@Override
public void onInputBufferAvailable(@NonNull MediaCodec codec,int index) {
if (mIndexFrame >= mBuffers.length) {
return;
}
int inputoptions = mIndexFrame < mBuffers.length - 1 ? MediaCodec.BUFFER_FLAG_CODEC_CONfig : MediaCodec.BUFFER_FLAG_END_OF_STREAM;
// https://www.programcreek.com/java-api-examples/?class=android.graphics.YuvImage&method=compresstoJpeg
BitmapFactory.Options options = new BitmapFactory.Options();
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
byte[] dataToEncode = mBuffers[mIndexFrame++].array();
Bitmap bitmap = BitmapFactory.decodeByteArray(dataToEncode,dataToEncode.length,options);
Bitmap.createBitmap(bitmap,bitmap.getWidth(),bitmap.getHeight());
final int length = bitmap.getByteCount();
ByteBuffer dst = ByteBuffer.allocate(length);
bitmap.copyPixelsToBuffer(dst);
ByteBuffer inputBuffer = enc.getInputBuffer(index);
inputBuffer.put(dst.array());
enc.queueInputBuffer(index,length,index * STEP_PRESENTATION_TIME_US,0);
}
@Override
public void onOutputBufferAvailable(@NonNull MediaCodec codec,int index,@NonNull MediaCodec.BufferInfo info) {
ByteBuffer encodedBuffer = enc.getoutputBuffer(index);
/*
if ((info.flags & MediaCodec.BUFFER_FLAG_CODEC_CONfig) != 0) {
// The codec config data was pulled out and fed to the muxer when we got
// the INFO_OUTPUT_FORMAT_CHANGED status. Ignore it.
info.size = 0;
}
*/
if (info.size != 0) {
// adjust the ByteBuffer values to match BufferInfo (not needed?)
encodedBuffer.position(info.offset);
encodedBuffer.limit(info.offset + info.size);
mux.writeSampleData(mIndexTrack,encodedBuffer,info);
}
enc.releaSEOutputBuffer(index,false);
if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) {
enc.stop();
enc.release();
mux.stop();
mux.release();
}
}
@Override
public void onError(@NonNull MediaCodec codec,@NonNull MediaCodec.CodecException e) {
}
@Override
public void onOutputFormatChanged(@NonNull MediaCodec codec,@NonNull MediaFormat format) {
// Now that we have the Magic Goodies,start the muxer
MediaFormat test = codec.getoutputFormat();
mIndexTrack = mux.addTrack(format);
mux.start();
}
});
enc.start();
} catch (Exception e) {
e.printstacktrace();
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)