2016-04-25 4 views
0

я использую MediaCodec для декодирования видеоданных, но когда я использую метод dequeueOutputBuffer, получить результат MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED, MediaCodec.INFO_OUTPUT_FORMAT_CHANGED и MediaCodec.INFO_TRY_AGAIN_LATER в течение первых секунд. Я хочу получить нормальный результат, как только я использую этот метод.MediaCodec возвращает -1, -2, -3 в течение первых секунд

String mime = format.getString(MediaFormat.KEY_MIME); 
mMediaCodec = MediaCodec.createDecoderByType(mime); 
mMediaCodec.configure(format, mSurface , null , 0); 
mMediaCodec.start(); 
try{ 
    ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers(); 
    ByteBuffer[] outputBuffers = mMediaCodec.getOutputBuffers(); 
    int inputBufferIndex = mMediaCodec.dequeueInputBuffer(TLMediaCodec.TIMEOUT_USEC); 
    if (inputBufferIndex >= 0) { 
     ByteBuffer inputBuffer = inputBuffers[inputBufferIndex]; 
     inputBuffer.clear(); 
     inputBuffer.put(data); 
     mMediaCodec.queueInputBuffer(inputBufferIndex, 0, data.length, ultimestamp, 0); 
     int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(mBufferInfo, 100); 

     if (outputBufferIndex >= 0) 
     { 
      try 
      { 
       mVideoDecodeDelay = System.currentTimeMillis() - mVideoDecodeDelay; 
       boolean render = mBufferInfo.size > 0; 
       mMediaCodec.releaseOutputBuffer(outputBufferIndex, render); 
      } 
      catch (Exception e) 
      { 
       TLLogger.trace(TAG, "decodeOutput failed -- > " + e.toString()); 
       e.printStackTrace(); 
      } 
     } 
     else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) 
     { 
      outputBuffers = mMediaCodec.getOutputBuffers(); 
     } 
     else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) 
     { 
      MediaFormat format = mMediaCodec.getOutputFormat(); 
     } 
    } 
} catch{ 
    e.printStackTrace(); 
} 

, это мой код, я не нашел ни одного увольнения, чтобы улучшить эту проблему. Спасибо за помощь !!!

ответ

0

Это нормально. Вы не отправляете один кадр в MediaCodec и получаете фрейм; вы передаете серию кадров и вытаскиваете их, когда они становятся доступными. Ожидается некоторое время ожидания от start() и ожидается наличие первого кадра (e.g. this). Если вы предпочитаете получать уведомления от опроса, попробуйте новые асинхронные методы API.

См. Примечания «Основное использование» в верхней части окна bigflake page.