Параметры MediaFormat, KEY_ROTATION не работает - PullRequest
0 голосов
/ 28 мая 2018

Текущее изображение закодировано и сохранено в выходном буфере как есть.

Однако, опция KEY_ROTATION Samsung (Galaxy S6 (Nouga), 7 (Nouga), 8 (Nouga)) работает хорошо,

Эта опция не работает на эталонном телефоне Google (Pixel 2 XL -> Oreo, Nexus 5 -> Lollipop).

Другими словами, в то время как опция KEY_ROTATION хорошо работает на устройстве Samsung, значение, выводимое в выходной буфер, поворачивается. Этот параметр не работает на эталонных телефонах Google.

Поверхность, созданная encoderSurface (), служит в качестве входного буфера. Проверьте выходной буфер через onOutputBufferAvailable из MediaCodec.Callback.

Любой, кто знает причину, нуждается в помощи.

Вот код, который я написал.

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

, пожалуйста, помогите мне..

...