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

时间:2014-06-12 15:11:08

标签: android h.264 mediacodec

我使用此

配置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(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。 问题出在哪里?

1 个答案:

答案 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; (英语很差......)