Обработка видео на Android 3.x / Google TV / SDK: кадр видео в SurfaceTexture / OpenGL / GLSL

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

Вопрос

  • Как визуализировать видеокадр из MediaPlayer или VideoView в SurfaceTexture или текстуру OpenGL, чтобы изменить цвет текстуры / фрагмента через GLSL? (Нам он нужен для необычных процедур обработки видео GLES / GLSL.)

Контекст

а) Google TV (устройство LG G2 2012) - устройство Android 3.2 с поддержкой только SDK (без NDK)

б) Легко выполнить рендеринг с камеры в SurfaceTexture, но как рендерить видео в SurfaceTexture в Android 3.x? Решение для камеры см. Ниже.

c) Я уже визуализирую видеокадры в GLView / GLRenderer, но я не беру кадр, чтобы изменить его через GLSL. Вроде не работает. Но мне нужны доступные GLES / GLSL текстуры с видеоданными для обработки видео:

Класс MainActivity:

public void onCreate(Bundle state) {
    super.onCreate(state);

    m_View = new GLSimpleView(this);
    setContentView(m_View);

    m_Holder = m_View.getHolder();
    m_Holder.addCallback(this);
    m_Holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}

GLSimpleView класс:

public GLSimpleView(Context context) {
    super(context);

    m_Renderer = new GLTextureRenderer(context); 
    this.setRenderer(m_Renderer);
}

GLTextureRender класс:

int[] textures = new int[1];
GLES20.glGenTextures(1, textures, 0);

m_SurfaceTexture = textures[0];
GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID);

GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST);
GLES20.glTexParameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR);

GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_S, GLES20.GL_CLAMP_TO_EDGE);
GLES20.glTexParameteri(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_WRAP_T, GLES20.GL_CLAMP_TO_EDGE);

m_Surface = new SurfaceTexture(m_SurfaceTexture);
m_Surface.setOnFrameAvailableListener(this);

// THIS ONE DOESN'T WORK WITH ANDROID 3.x!
// HOW TO BIND m_Surface TO m_MediaPlayer?

//Surface surface = new Surface(m_Surface);
//m_MediaPlayer.setSurface(surface);
//surface.release();

Также сравните это:

Поэтому главный вопрос по-прежнему: как получить доступ к кадру видео и управлять им с помощью Android 3.x? Возможно другое решение? Я что-то упустил, потратив слишком много времени? Учтите, что в Google TV вообще нет поддержки NDK, что мы очень ограничены, если пытаемся манипулировать видеоданными.


person btxsqdr    schedule 04.08.2012    source источник
comment
Вы видели: stackoverflow.com/questions/8620560/video-processing- в-android? Мне также любопытно, смотрели ли вы на устаревший теперь API Renderscript Graphics для вашего проекта.   -  person Morrison Chang    schedule 05.08.2012


Ответы (1)


Мегха была достаточно любезна, чтобы разобраться в этом для меня. Мы не поддерживаем это в Google TV для ARM. Это невозможно с нашими текущими SOC (система на кристалле).

person Les Vogel - Google DevRel    schedule 16.08.2012