MediaFormat选项,KEY_ROTATION不起作用

时间:2018-05-28 03:27:28

标签: rotation encode mediacodec android-camera2

当前图像被编码并按原样存储在输出缓冲区中。

然而,三星(Galaxy S6(Nouga),7(Nouga),8(Nouga))KEY_ROTATION选项运作良好,

此选项不适用于Google参考手机(Pixel 2 XL - > Oreo,Nexus 5 - > Lollipop)。

换句话说,虽然KEY_ROTATION选项在Samsung设备上运行良好,但输出到输出缓冲区的值会旋转, 此选项不适用于Google参考手机。

encoderSurface()创建的曲面用作输入缓冲区 通过MediaCodec.Callback的onOutputBufferAvailable检查输出缓冲区。

任何知道原因的人都需要帮助。

这是我写的代码。

private final MediaCodec.Callback _mediaCodecCallback = new MediaCodec.Callback() {

    @Override
    public void finalize(){

    }

    @Override
    public void onInputBufferAvailable(@NonNull MediaCodec mediaCodec, int i) {

    }

    @Override
    public void onOutputBufferAvailable(@NonNull MediaCodec mediaCodec, int i, @NonNull MediaCodec.BufferInfo bufferInfo) {
        ByteBuffer buffer = mediaCodec.getOutputBuffer(i);
        byte[] outData = new byte[bufferInfo.size];
        buffer.get(outData);
        mediaCodec.releaseOutputBuffer(i, false);

        switch (bufferInfo.flags) {
            case MediaCodec.BUFFER_FLAG_CODEC_CONFIG:
                if(DEBUG_LOG) {
                    Log.v(TAG, "CONFIG FRAME");
                }
                _configFrame = new byte[bufferInfo.size];
                System.arraycopy(outData, 0, _configFrame, 0, outData.length);
                break;
            case MediaCodec.BUFFER_FLAG_KEY_FRAME:
                // I Frame;

                if(DEBUG_LOG) {
                    Log.v(TAG, "I FRAME" +
                            ", SIZE = " + bufferInfo.size + ", " + currentDateandTime);
                }
                try {
                    _outputFrame.reset();
                    _outputFrame.write(_configFrame);
                    _outputFrame.write(outData);
                } catch (IOException e) {
                    e.printStackTrace();
                }

                break;
            default:
                // P Frame;
                if(DEBUG_LOG) {
                    Log.v(TAG, "P FRAME" +
                            ", SIZE = " + bufferInfo.size);
                }

                break;
        }
    }

//

    public boolean initialize(int width,int height) {
    try {
        _mediaCodec = MediaCodec.createEncoderByType(MIME_TYPE);
    } catch (IOException e) {
        e.printStackTrace();
        return false;
    }
    MediaCodecInfo codec = selectCodec(MIME_TYPE);
    if (codec == null) {
        return false;
    }

    MediaCodecInfo.CodecCapabilities cap = codec.getCapabilitiesForType(MIME_TYPE);

    MediaFormat mediaFormat = MediaFormat.createVideoFormat(MIME_TYPE, width, height);
    mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, 30);
    mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
    mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, bitRateInfo.getInstance().getBitRate()); // 300000
    mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);

    mediaFormat.setInteger(MediaFormat.KEY_ROTATION, 90);
    // in under API 21, not use MediaFormat.KEY_ROTATION, but use "rotation-degrees"
    // This does not work on a Google reference phone.

    _mediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
    _surface = _mediaCodec.createInputSurface();
    _mediaCodec.setCallback(_mediaCodecCallback);
    _mediaCodec.start();

    Log.d(TAG,"Encoder Start SUCCESS");
    return true;
}

public Surface encoderSurface() {
//Return the value of this function and use it as the input surface.
    return _surface;
}

请帮助我..

0 个答案:

没有答案