从表面编码数据时,dequeueOutputBuffer需要很长时间。我对此一无所知。我该怎么办

//日志

E / EncoderWorker:dequeueOutputBuffer:31.257693ms E / EncoderWorker:编码器输出缓冲区:0.014308ms E / ServerService:字节:17703 config0,17703,1541926212476,0 E / EncoderWorker:sendEncodeData:0.870539ms E / EncoderWorker:dequeueOutputBuffer:33.595231ms E / EncoderWorker:encoderOutputBuffers:0.009ms E / ServerService:字节:16208 config0,16208,1541926246210,0 E / EncoderWorker:sendEncodeData:0.357308ms E / EncoderWorker:出队列输出缓冲区:33.247692ms E / EncoderWorker:encoderOutputBuffers:0.01ms E / ServerService:字节:9769 config0,9769,1541926262384,0 E / EncoderWorker:sendEncodeData:0.318231ms E / EncoderWorker:出队输出缓冲区:25.595385ms E / EncoderWorker:encoderOutputBuffers:0.013847ms E / ServerService:字节:8057 config0,8057,1541926312199,0 E / EncoderWorker:sendEncodeData:0.406769ms E / EncoderWorker:dequeueOutputBuffer:37.262077ms

E / EncoderWorker:encoderOutputBuffers:0.009077ms

//some MidiaCodec config
    MediaFormat mMediaFormat = MediaFormat.createVideoFormat(Commonconfig.MIME_TYPE,Commonconfig.WIDTH,Commonconfig.HEIGHT);
    mMediaFormat.setInteger(MediaFormat.KEY_BIT_RATE,(int) (Commonconfig.WIDTH * 
    Commonconfig.HEIGHT * 0.5));
    mMediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE,30);
    mMediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT,MediaCodecInfo.CodecCapabilities.COLOR_FormatSurface);
    mMediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL,1);
    Log.i(TAG,"Starting mEncoder");
    mEncoder = MediaCodec.createByCodecName(Commonconfig.HAERD_CODE_EDCODE);
    mEncoder.configure(mMediaFormat,null,MediaCodec.CONFIGURE_flaG_ENCODE);

//encode Thread
@Override
public void run() {
    ByteBuffer[] encoderOutputBuffers = mEncoder.getOutputBuffers();

    boolean encoderDone = false;
    MediaCodec.BufferInfo info = new MediaCodec.BufferInfo();
    while (!encoderDone) {
        int encoderStatus;
        long start;
        try {
            start = System.nanoTime();
            encoderStatus = mEncoder.dequeueOutputBuffer(info,-1);
            Log.e(TAG,"dequeueOutputBuffer:" + (System.nanoTime() - start) / 1e6 + "ms");
        } catch (IllegalStateException e) {
            e.printStackTrace();
            break;
        }

        if (encoderStatus == MediaCodec.INFO_TRY_AGAIN_LATER) {
            // no output available yet 
            //Log.d(TAG,"no output from mEncoder available");
        } else if (encoderStatus == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
            // not expected for an mEncoder
            encoderOutputBuffers = mEncoder.getOutputBuffers();
            Log.d(TAG,"mEncoder output buffers changed");
        } else if (encoderStatus == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
            // not expected for an mEncoder
            Log.d(TAG,"The output format has changed,subsequent data will follow the new format");
        } else if (encoderStatus < 0) {
            break;
        } else {
            start = System.nanoTime();
            ByteBuffer encodedData = encoderOutputBuffers[encoderStatus];
            Log.e(TAG,"encoderOutputBuffers:" + (System.nanoTime() - start) / 1e6 + "ms");
            if (encodedData == null) {
                Log.d(TAG,"============It's NULL. BREAK!=============");
                return;
            }
            String infoString = info.offset + "," + info.size + "," +
                    info.presentationTimeUs + "," + info.flags;
            // mDataInterface.sendConfig("video",infoString);
            byte[] b = new byte[info.size];
            try {
                if (info.size != 0) {
                    start = System.nanoTime();
                    encodedData.limit(info.offset + info.size);
                    encodedData.position(info.offset);
                    encodedData.get(b,info.offset,info.offset + info.size);
                    mDataInterface.sendEncodeData(b,infoString);
                    //Log.e(TAG,infoString + " " + b.length);
                    Log.e(TAG,"sendEncodeData:" + (System.nanoTime() - start) / 1e6 + "ms");
                }

            } catch (BufferUnderflowException e) {
                e.printStackTrace();
            }

            encoderDone = (info.flags & MediaCodec.BUFFER_flaG_END_OF_STREAM) != 0;

            try {
                if (mEncoder != null) {
                    mEncoder.releaseOutputBuffer(encoderStatus,false);
                }
            } catch (IllegalStateException e) {
                e.printStackTrace();
            }
        }
    }
    Log.e(TAG,"out of enCode!");
}
zm16603148 回答:从表面编码数据时,dequeueOutputBuffer需要很长时间。我对此一无所知。我该怎么办

暂时没有好的解决方案,如果你有好的解决方案,请发邮件至:iooj@foxmail.com
本文链接:https://www.f2er.com/3066971.html

大家都在问