【问题标题】:android MediaCodec encoding h.264 can only encoding one frameandroid MediaCodec编码h.264只能编码一帧
【发布时间】:2015-09-24 16:41:23
【问题描述】:

我用这个配置 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[] data, Camera camera) 调用

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

input(byte[]) 来自相机预览。我遵循 API-DOC 中的代码。 但是当我运行这段代码时,我只能成功获得一帧。 这意味着 outputBufferIndex 无论运行多长时间都只会 >=0 一次。 问题出在哪里?

【问题讨论】:

  • 您可以在 bigflake (bigflake.com/mediacodec) 和 Grafika (github.com/google/grafika) 中找到一些信息和示例。
  • 是的。我在 bigflake.com/mediacodec 中发现了一些非常有用的东西。谢谢
  • 我有同样的问题,你能解释一下你从 bigflake.com/mediacodec @Denzww 找到了什么吗?

标签: android h.264 android-mediacodec


【解决方案1】:

对于某些编码器,当您对视频帧进行编码时,您应该添加时间戳。

mediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length,0, 0);

对于某些编码器,此函数应更改为:

mediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length,(long)ptsUsec, 0);

注意:“ptsUsec”每次都应该不同。你可以创建如下: long ptsUsec = (long) generateIndex * 1000000 / VideoConfig.VIDEO_FPS; (英语很差……)

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 2015-08-21
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    相关资源
    最近更新 更多