2014-11-11 8 views
0

Я пишу плагин для Unity, который декодирует и берет кадры из видеофайла с помощью Media Extractor и перекодирует в новый видеофайл. Однако кадры декодируются в массив неправильного размера (на андроид 4.2.2), так как кодек считает, высота 736, когда он на самом деле 720.Media Extractor: Декодер дает неправильную ширину на Android 4.2

for (int i = 0; i < numTracks; ++i) 
    { 
     MediaFormat format = extractor.getTrackFormat(i); 

     String mime = format .getString(MediaFormat.KEY_MIME); 

     if(mime.startsWith("video/")) 
     { 
      extractor.selectTrack(i); 
      //Decoder 
      decoder = MediaCodec.createDecoderByType(mime); 
      decoder.configure(format, null, null, 0); 

      break; 
     } 
    } 

Индекс выходного буфера возвращает INFO_OUTPUT_BUFFERS_CHANGED, а затем INFO_OUTPUT_FORMAT_CHANGED , Logging это сообщает мне, что декодер думает, что есть высота 736 вместо правильного 720.

  decoder.queueInputBuffer(inputBufIndex, 0, sampleSize, extractor.getSampleTime(), 0);    
      //Get Outputbuffer Index 
      int outIndex = decoder.dequeueOutputBuffer(info, 10000); 

Это прекрасно работает на устройстве под управлением 4.4, проблема присутствует только на старом 4.2 устройства. У кого-нибудь есть мысли?

+0

Я бы предположил, что что-то заполняет высоту до кратного 32. Можете ли вы показать дамп MediaFormat из logcat? Возможно, можно восстановить фактическую высоту, изучив другие поля. – fadden

ответ

1

Имейте в виду, что вам необходимо также проверить поля обрезки в MediaFormat, поле высоты - это полная высота выходного буфера, включая возможное заполнение. См. функция checkFrame в https://android.googlesource.com/platform/cts/+/jb-mr2-release/tests/tests/media/src/android/media/cts/EncodeDecodeTest.java - вы получите фактическую высоту контента как format.getInteger("crop-bottom") - format.getInteger("crop-top") + 1.