android MediaCodec编码h.264只能编码一帧

android 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 = 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];