2016-08-16 6 views
0

Я пытаюсь декодировать поток h264, используя MediaCodec на Android.memdiacodec-декодер работает на android 5.0, но не на android 4.4

Я использую csd-0, csd-1, чтобы установить sps и pps вот так.

MediaFormat format = MediaFormat.createVideoFormat(MIME, WIDTH, HEIGHT); 
format.setByteBuffer("csd-0", sps); 
format.setByteBuffer("csd-1", pps); 

i сконфигурируйте декодер с выходной поверхностью, чтобы отобразить выходные данные.

decoder.configure(format, surface, null, 0); 

то, я только начинаю поток, чтобы декодировать данные, полученные мной из сети, используя этот цикл.

while (running) { 
    if (!isEOS) { 
     int inIndex = decoder.dequeueInputBuffer(10000); 
     if (inIndex >= 0) { 
      ByteBuffer buffer = inputBuffers[inIndex]; 
      byte[] data = getVideoPacket(); // native method that get data from network 
      buffer.put(data); 

      decoder.queueInputBuffer(inIndex, 0, data.length, 0L, 0); 
     } 
    } 

    int outIndex = decoder.dequeueOutputBuffer(info, 10000); 
    switch (outIndex) { 
     case MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED: 
      Log.d("DecodeActivity", "INFO_OUTPUT_BUFFERS_CHANGED"); 
      outputBuffers = decoder.getOutputBuffers(); 
      break; 
     case MediaCodec.INFO_OUTPUT_FORMAT_CHANGED: 
      Log.d("DecodeActivity", "New format " + decoder.getOutputFormat()); 
      MediaFormat format = decoder.getOutputFormat(); 
      break; 
     case MediaCodec.INFO_TRY_AGAIN_LATER: 
      Log.d("DecodeActivity", "dequeueOutputBuffer timed out!"); 
      break; 
     default: 
      ByteBuffer buffer = outputBuffers[outIndex]; 
      Log.v("DecodeActivity", "We can't use this buffer but render it due to the API limit, " + buffer); 

      decoder.releaseOutputBuffer(outIndex, true); // render 
      break; 
    } 

    if ((info.flags & MediaCodec.BUFFER_FLAG_END_OF_STREAM) != 0) { 
     Log.d("DecodeActivity", "OutputBuffer BUFFER_FLAG_END_OF_STREAM"); 
     break; 
    } 
} 

обратите внимание, что я использую 0 для presentationTimestamp из queueInputBuffer, поскольку данные я получил от сетевой розетки, и я не знаю, как вычислить соответствующую метку времени.

У меня есть то, что я хочу на android 5.0 (и выше), но когда я запускаю этот код на Android 4.4, на поверхности ничего не появляется (на самом деле я иногда вижу один и тот же фрагмент изображения, но большую часть времени поверхность просто черный).

Я попытался заполнить входной буфер данными, извлеченными из файла (используйте MediaExtractor), и он хорошо работает на обоих Android 5.0 и 4.4.

любая помощь была бы оценена.

ответ

0

кажется, что проблема заключается в способе получения данных. я использовал для get данных из родного слоя:

public static native byte[] getVideoPacket(); 

и теперь я push данные родного слоя к слою Java:

env->CallVoidMethod(..., data); 

все просто работать. Я не знаю почему, но этот способ работает для меня.