我使用此
配置MediaCodecmediaCodec = MediaCodec.createEncoderByType(MIME_TYPE);
MediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE,
width, height);
mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate); //
mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, framerate); // frame rate
mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,
MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar);
mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, iFramerate);
mediaCodec.configure(mediaFormat, null, null,
MediaCodec.CONFIGURE_FLAG_ENCODE);
mediaCodec.start();
并发送数据 从Camera.onPreviewFrame(byte []数据,相机相机)调用
try {
ByteBuffer[] inputBuffers = mediaCodec.getInputBuffers();
ByteBuffer[] outputBuffers = mediaCodec.getOutputBuffers();
int inputBufferIndex = mediaCodec.dequeueInputBuffer(-1);
if (inputBufferIndex >= 0) {
ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
inputBuffer.clear();
if (inputBuffer.capacity() < input.length) {
byte[] temp = new byte[input.length];
System.arraycopy(input, 0, temp, 0, temp.length);
inputBuffer.put(temp);
} else {
inputBuffer.put(input);
}
mediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length,
0, 0);
}
MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();
int outputBufferIndex = mediaCodec.dequeueOutputBuffer(bufferInfo,
0);
while (outputBufferIndex >= 0) {
ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];
输入(byte [])来自相机预览。我遵循API-DOC中的代码。 但是当我运行这段代码时,我只能获得一帧成功。 这意味着无论运行多长时间,outputBufferIndex只获得一次&gt; = 0。 问题出在哪里?
答案 0 :(得分:3)
对于某些编码器,当您对视频帧进行编码时,应添加时间戳。
mediaCodec.queueInputBuffer(inputBufferIndex,0,input.length,0,0);
对于某些编码器,此func应更改为:
mediaCodec.queueInputBuffer(inputBufferIndex,0, input.length,(long)ptsUsec,0);
注意:“ptsUsec”每次都应该不同。你可以创建如下: long ptsUsec =(long)generateIndex * 1000000 / VideoConfig.VIDEO_FPS; (英语很差......)