Сброс буфера в Media Code c в VIVO 1907 с V / ACode c: [OMX.MTK.VIDEO.ENCODER.AVC] вызывает emptyBuffer - PullRequest
0 голосов
/ 27 марта 2020

Я использую приведенный ниже код, и он возвращает черное видео на VIVO 1907, отлично работает на других устройствах. Я не понимаю, почему mediaCode c использует пустой буфер вместо предоставленного. Нужно ли проверять что-то во время выполнения?

int inputBufIndex = mediaCodec.dequeueInputBuffer(TIMEOUT_USEC);
        long ptsUsec = computePresentationTime(mGenerateIndex, FRAME_RATE);
        Log.d(TAG, "encode: inputBufIndex " + inputBufIndex);
        if (inputBufIndex >= 0) {
            final ByteBuffer inputBuffer = mediaCodec.getInputBuffer(inputBufIndex);
            inputBuffer.clear();
            inputBuffer.put(byteConvertFrame);
            mediaCodec.queueInputBuffer(inputBufIndex, 0, byteConvertFrame.length, ptsUsec, 0);
            mGenerateIndex++;
        }
        final MediaCodec.BufferInfo mBufferInfo = new MediaCodec.BufferInfo();
        final int encoderStatus = mediaCodec.dequeueOutputBuffer(mBufferInfo, TIMEOUT_USEC);
        Log.d(TAG, "encode: encoderStatus " + encoderStatus);
        if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
            // no output available yet
            Log.e(TAG, "No output from encoder available");
            formatChanged = false;
        } else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
            // not expected for an encoder
            MediaFormat newFormat = mediaCodec.getOutputFormat();
            Log.d(TAG, "encode: newFormat " + newFormat + " mTrackIndex " + mTrackIndex);
            mTrackIndex = mediaMuxer.addTrack(newFormat);
            mediaMuxer.start();
            formatChanged = true;
        } else if (encoderStatus < 0) {
            Log.e(TAG, "unexpected result from encoder.dequeueOutputBuffer: " + encoderStatus);
            formatChanged = false;
        } else if (mBufferInfo.size != 0) {
            final ByteBuffer encodedData = mediaCodec.getOutputBuffer(encoderStatus);
            Log.d(TAG, "encode: encodedData " + encodedData + " mTrackIndex " + mTrackIndex);
            if (encodedData == null) {
                Log.e(TAG, "encoderOutputBuffer " + encoderStatus + " was null");
            } else {
                encodedData.position(mBufferInfo.offset);
                encodedData.limit(mBufferInfo.offset + mBufferInfo.size);
                mediaMuxer.writeSampleData(mTrackIndex, encodedData, mBufferInfo);
                mediaCodec.releaseOutputBuffer(encoderStatus, false);
...