android MediaCodec编码h.264只能编码一帧
我用这个配置MediaCodecandroid MediaCodec编码h.264只能编码一帧,android,h.264,android-mediacodec,Android,H.264,Android Mediacodec,我用这个配置MediaCodec mediaCodec = MediaCodec.createEncoderByType(MIME_TYPE); MediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE, width, height); mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitrate); // mediaFo
mediaCodec = 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调用(字节[]数据,Camera-Camera)
试试看{
ByteBuffer[]inputBuffers=mediaCodec.getInputBuffers();
ByteBuffer[]outputBuffers=mediaCodec.getOutputBuffers();
int-inputBufferIndex=mediaCodec.dequeueInputBuffer(-1);
如果(inputBufferIndex>=0){
ByteBuffer inputBuffer=inputBuffers[inputBufferIndex];
inputBuffer.clear();
if(inputBuffer.capacity()=0){
ByteBuffer outputBuffer=outputBuffers[outputBufferIndex];
输入(字节[])来自相机预览。我遵循API-DOC中的代码。
但是当我运行这段代码时,我只能获得一帧成功。
这意味着无论运行多长时间,outputBufferIndex get>=0只能运行一次。
问题出在哪里?对于某些编码器,在编码视频帧时,应该添加时间戳 mediaCodec.queueInputBuffer(inputBufferIndex,0,input.length,0,0) 对于某些编码器,此函数应更改为: mediaCodec.queueInputBuffer(inputBufferIndex,0, 输入长度,(长)ptsUsec,0) 注意:“ptsUsec”每次都应该不同。您可以创建如下内容: long ptsUsec=(long)generateIndex*1000000/VideoConfig.VIDEO\u FPS;
(英语很差…你可以在bigflake()和Grafika()中找到一些信息和示例。是的。我在bigflake.com/mediacodec中发现了一些非常有用的东西。谢谢。我也有同样的问题,你能解释一下你在bigflake.com/mediacodec@Denzww中发现了什么吗?
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];