2016-06-17 4 views
1

Я использую текстуру поверхности, как выход mediacodec, увидеть некоторый журнал ниже, 2 вопроса:mediadecodec к SurfaceTexture: как onDrawFrame знают outputBufferId

  1. mediacodec выпустило много раз, почему onFrameAvailable и onDrawFrame можно назвать только один раз?
  2. Позвонив mSTexture.updateTexImage() в , mSTexture будет обновляться один из многих mediacodec выходных буферов, выпущенных ранее, но я хочу знать, соответствующий outputBufferId из обновленного mSTexture, я могу получить это?

SurfaceTexture имеет функцию getTimestamp и getTransformMatrix, не уверен, что это может помочь, почему getTimestamp всегда возвращает 0?

public void onDrawFrame(GL10 glUnused) { Log.e(TAG, "onDrawFrame"); synchronized (this) { if (mUpdateST) { mUpdateST = false; mSTexture.updateTexImage(); // Here, I want to get the corresponding outputBufferId of the updated mSTexture } }

public void onFrameAvailable(SurfaceTexture surfaceTexture) { Log.e(TAG, "onFrameAvailable"); synchronized(this) { mUpdateST = true; } }

public void onOutputBufferAvailable(MediaCodec mc, int outputBufferId, BufferInfo bufInfo) { Log.e(TAG, "OutputBufferAvailable " + outputBufferId); decoder.releaseOutputBuffer(outputBufferId, true); }

Е/--- MainActivity - (19589): OutputBufferAvailable 15

Е/--- MainActivity - (19589): OutputBufferAvailable 14

E/--- MainActivity - (19589): OutputBufferAvailable 13

Е/--- MainActivity - (19589): OutputBufferAvailable 12

Е/--- MainActivity - (19589): OutputBufferAvailable 11

Е/--- MyGLSurfaceView - (19589): onFrameAvailable

Е/--- MainActivity - (19589): OutputBufferAvailable 10

Е/--- MainActivity - (19589): OutputBufferAvailable 9

Е/--- MainActivit у - (19589): OutputBufferAvailable 8

Е/--- MyGLSurfaceView - (19589): onDrawFrame

ответ

2

SurfaceTexture работает в режиме "асинхронной". Поскольку производитель и потребитель могут быть в одном и том же процессе, это полезно, чтобы избежать взаимоблокировок. Практический эффект от этого заключается в том, что SurfaceTexture будет отбрасывать кадры, если вы слишком быстро его загружаете.

Если вы посмотрите на awaitNewImage() в ExtractMpegFramesTest, вы увидите, как декодер и обработчик SurfaceTexture координируют обработку кадров.

В идеале, временная метка представления исходного материала будет распространяться на временную метку SurfaceTexture. Получает ли BufferInfo от decoder.dequeueOutputBuffer() отличную от нуля временную метку?

+0

будет ждатьNewImage замедляет скорость декодирования? в настоящее время кажется всего 10 кадров в секунду. –

+0

Узкое место производительности в ExtractMpegFramesTest - «bmp.compress (Bitmap.CompressFormat.PNG, ...)». Удалите сжатие и запись на диск, и он должен работать намного быстрее. Конечно, теперь он ничего не делает полезным ... – fadden

+0

Спасибо fadden .. –