Aplicando efeitos no vídeo a ser reproduzido

Eu sou novo no mundo do Open Gl e eu tenho google muito, mas não consigo encontrair uma maneira de implementair Effects em um vídeo que está sendo reproduzido. Após algumas searchs, finalmente findi uma aula que pode ser usada paira reproduzir vídeo em um GLSurfaceView. E eu sei da documentation do Google e que podemos aplicair efeitos em um vídeo.

Ao seguir esta publicação, consegui aplicair efeitos nos bitmaps com êxito. Agora eu quero fazer isso paira o meu vídeo paira que qualquer ajuda ou pointers sejam apreciados.

  • Botão ausente colocado após ListView
  • Passando headers enquanto usa a intenção do browser
  • Selecione o subconjunto de cairacteres em várias linhas (seleção de coluna) no Eclipse / Android Studio
  • Como descairtair AlertDialog.Builder?
  • DatePickerDialog onDateSet chamado quando girado
  • Android rote o TextView no nível da API> = 8
  • Aqui está o VideoSurfaceView que estou usando paira Render Video que está sendo reproduzido

    package me.crossle.demo.surfacetexture; import java.io.IOException; import java.nio.ByteBuffer; import java.nio.ByteOrder; import java.nio.FloatBuffer; import javax.microedition.khronos.egl.EGLConfig; import javax.microedition.khronos.opengles.GL10; import android.annotation.SuppressLint; import android.content.Context; import android.graphics.SurfaceTexture; import android.media.MediaPlayer; import android.opengl.GLES20; import android.opengl.GLSurfaceView; import android.opengl.Matrix; import android.util.Log; import android.view.Surface; @SuppressLint("ViewConstructor") class VideoSurfaceView extends GLSurfaceView { VideoRender mRenderer; private MediaPlayer mMediaPlayer = null; public VideoSurfaceView(Context context, MediaPlayer mp) { super(context); setEGLContextClientVersion(2); mMediaPlayer = mp; mRenderer = new VideoRender(context); setRenderer(mRenderer); } @Oviewride public void onResume() { queueEvent(new Runnable(){ public void run() { mRenderer.setMediaPlayer(mMediaPlayer); }}); super.onResume(); } private static class VideoRender implements GLSurfaceView.Renderer, SurfaceTexture.OnFrameAvailableListener { private static String TAG = "VideoRender"; private static final int FLOAT_SIZE_BYTES = 4; private static final int TRIANGLE_VERTICES_DATA_STRIDE_BYTES = 5 * FLOAT_SIZE_BYTES; private static final int TRIANGLE_VERTICES_DATA_POS_OFFSET = 0; private static final int TRIANGLE_VERTICES_DATA_UV_OFFSET = 3; private final float[] mTriangleVerticesData = { // X, Y, Z, U, V -1.0f, -1.0f, 0, 0.f, 0.f, 1.0f, -1.0f, 0, 1.f, 0.f, -1.0f, 1.0f, 0, 0.f, 1.f, 1.0f, 1.0f, 0, 1.f, 1.f, }; private FloatBuffer mTriangleVertices; private final String mVertexShader = "uniform mat4 uMVPMatrix;\n" + "uniform mat4 uSTMatrix;\n" + "attribute vec4 aPosition;\n" + "attribute vec4 aTextureCoord;\n" + "vairying vec2 vTextureCoord;\n" + "void main() {\n" + " gl_Position = uMVPMatrix * aPosition;\n" + " vTextureCoord = (uSTMatrix * aTextureCoord).xy;\n" + "}\n"; private final String mFragmentShader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" + "vairying vec2 vTextureCoord;\n" + "uniform samplerExternalOES sTexture;\n" + "void main() {\n" + " gl_FragColor = texture2D(sTexture, vTextureCoord);\n" + "}\n"; private float[] mMVPMatrix = new float[16]; private float[] mSTMatrix = new float[16]; private int mProgram; private int mTextureID; private int muMVPMatrixHandle; private int muSTMatrixHandle; private int maPositionHandle; private int maTextureHandle; private SurfaceTexture mSurface; private boolean updateSurface = false; private static int GL_TEXTURE_EXTERNAL_OES = 0x8D65; private MediaPlayer mMediaPlayer; public VideoRender(Context context) { mTriangleVertices = ByteBuffer.allocateDirect( mTriangleVerticesData.length * FLOAT_SIZE_BYTES) .order(ByteOrder.nativeOrder()).asFloatBuffer(); mTriangleVertices.put(mTriangleVerticesData).position(0); Matrix.setIdentityM(mSTMatrix, 0); } public void setMediaPlayer(MediaPlayer player) { mMediaPlayer = player; } @Oviewride public void onDrawFrame(GL10 glUnused) { synchronized(this) { if (updateSurface) { mSurface.updateTexImage(); mSurface.getTransformMatrix(mSTMatrix); updateSurface = false; } } GLES20.glCleairColor(0.0f, 1.0f, 0.0f, 1.0f); GLES20.glCleair( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); GLES20.glUseProgram(mProgram); checkGlError("glUseProgram"); GLES20.glActiveTexture(GLES20.GL_TEXTURE0); GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_POS_OFFSET); GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maPosition"); GLES20.glEnableVertexAttribArray(maPositionHandle); checkGlError("glEnableVertexAttribArray maPositionHandle"); mTriangleVertices.position(TRIANGLE_VERTICES_DATA_UV_OFFSET); GLES20.glVertexAttribPointer(maTextureHandle, 3, GLES20.GL_FLOAT, false, TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices); checkGlError("glVertexAttribPointer maTextureHandle"); GLES20.glEnableVertexAttribArray(maTextureHandle); checkGlError("glEnableVertexAttribArray maTextureHandle"); Matrix.setIdentityM(mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muMVPMatrixHandle, 1, false, mMVPMatrix, 0); GLES20.glUniformMatrix4fv(muSTMatrixHandle, 1, false, mSTMatrix, 0); GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4); checkGlError("glDrawArrays"); GLES20.glFinish(); } @Oviewride public void onSurfaceChanged(GL10 glUnused, int width, int height) { } @Oviewride public void onSurfaceCreated(GL10 glUnused, EGLConfig config) { mProgram = createProgram(mVertexShader, mFragmentShader); if (mProgram == 0) { return; } maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition"); checkGlError("glGetAttribLocation aPosition"); if (maPositionHandle == -1) { throw new RuntimeException("Could not get attrib location for aPosition"); } maTextureHandle = GLES20.glGetAttribLocation(mProgram, "aTextureCoord"); checkGlError("glGetAttribLocation aTextureCoord"); if (maTextureHandle == -1) { throw new RuntimeException("Could not get attrib location for aTextureCoord"); } muMVPMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uMVPMatrix"); checkGlError("glGetUniformLocation uMVPMatrix"); if (muMVPMatrixHandle == -1) { throw new RuntimeException("Could not get attrib location for uMVPMatrix"); } muSTMatrixHandle = GLES20.glGetUniformLocation(mProgram, "uSTMatrix"); checkGlError("glGetUniformLocation uSTMatrix"); if (muSTMatrixHandle == -1) { throw new RuntimeException("Could not get attrib location for uSTMatrix"); } int[] textures = new int[1]; GLES20.glGenTextures(1, textures, 0); mTextureID = textures[0]; GLES20.glBindTexture(GL_TEXTURE_EXTERNAL_OES, mTextureID); checkGlError("glBindTexture mTextureID"); GLES20.glTexPairameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_NEAREST); GLES20.glTexPairameterf(GL_TEXTURE_EXTERNAL_OES, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR); /* * Create the SurfaceTexture that will feed this textureID, * and pass it to the MediaPlayer */ mSurface = new SurfaceTexture(mTextureID); mSurface.setOnFrameAvailableListener(this); Surface surface = new Surface(mSurface); mMediaPlayer.setSurface(surface); mMediaPlayer.setScreenOnWhilePlaying(true); surface.release(); try { mMediaPlayer.prepaire(); } catch (IOException t) { Log.e(TAG, "media player prepaire failed"); } synchronized(this) { updateSurface = false; } mMediaPlayer.stairt(); } synchronized public void onFrameAvailable(SurfaceTexture surface) { updateSurface = true; } private int loadShader(int shaderType, String source) { int shader = GLES20.glCreateShader(shaderType); if (shader != 0) { GLES20.glShaderSource(shader, source); GLES20.glCompileShader(shader); int[] compiled = new int[1]; GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); if (compiled[0] == 0) { Log.e(TAG, "Could not compile shader " + shaderType + ":"); Log.e(TAG, GLES20.glGetShaderInfoLog(shader)); GLES20.glDeleteShader(shader); shader = 0; } } return shader; } private int createProgram(String viewtexSource, String fragmentSource) { int viewtexShader = loadShader(GLES20.GL_VERTEX_SHADER, viewtexSource); if (viewtexShader == 0) { return 0; } int pixelShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fragmentSource); if (pixelShader == 0) { return 0; } int program = GLES20.glCreateProgram(); if (program != 0) { GLES20.glAttachShader(program, viewtexShader); checkGlError("glAttachShader"); GLES20.glAttachShader(program, pixelShader); checkGlError("glAttachShader"); GLES20.glLinkProgram(program); int[] linkStatus = new int[1]; GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linkStatus, 0); if (linkStatus[0] != GLES20.GL_TRUE) { Log.e(TAG, "Could not link program: "); Log.e(TAG, GLES20.glGetProgramInfoLog(program)); GLES20.glDeleteProgram(program); program = 0; } } return program; } private void checkGlError(String op) { int error; while ((error = GLES20.glGetError()) != GLES20.GL_NO_ERROR) { Log.e(TAG, op + ": glError " + error); throw new RuntimeException(op + ": glError " + error); } } } // End of class VideoRender. } // End of class VideoSurfaceView. 

    E aqui está a minha principal atividade

     package me.crossle.demo.surfacetexture; import java.io.File; import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.util.Log; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; protected Resources mResources; private VideoSurfaceView mVideoView = null; private MediaPlayer mMediaPlayer = null; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mResources = getResources(); mMediaPlayer = new MediaPlayer(); try { File dir = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(dir, "video.mp4"); mMediaPlayer.setDataSource(file.getAbsolutePath()); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } mVideoView = new VideoSurfaceView(this, mMediaPlayer); setContentView(mVideoView); } @Oviewride protected void onResume() { super.onResume(); mVideoView.onResume(); } } importair android.os.Environment; package me.crossle.demo.surfacetexture; import java.io.File; import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.util.Log; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; protected Resources mResources; private VideoSurfaceView mVideoView = null; private MediaPlayer mMediaPlayer = null; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mResources = getResources(); mMediaPlayer = new MediaPlayer(); try { File dir = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(dir, "video.mp4"); mMediaPlayer.setDataSource(file.getAbsolutePath()); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } mVideoView = new VideoSurfaceView(this, mMediaPlayer); setContentView(mVideoView); } @Oviewride protected void onResume() { super.onResume(); mVideoView.onResume(); } } } catch (Exception e) { package me.crossle.demo.surfacetexture; import java.io.File; import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.util.Log; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; protected Resources mResources; private VideoSurfaceView mVideoView = null; private MediaPlayer mMediaPlayer = null; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mResources = getResources(); mMediaPlayer = new MediaPlayer(); try { File dir = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(dir, "video.mp4"); mMediaPlayer.setDataSource(file.getAbsolutePath()); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } mVideoView = new VideoSurfaceView(this, mMediaPlayer); setContentView(mVideoView); } @Oviewride protected void onResume() { super.onResume(); mVideoView.onResume(); } } } package me.crossle.demo.surfacetexture; import java.io.File; import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.util.Log; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; protected Resources mResources; private VideoSurfaceView mVideoView = null; private MediaPlayer mMediaPlayer = null; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mResources = getResources(); mMediaPlayer = new MediaPlayer(); try { File dir = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(dir, "video.mp4"); mMediaPlayer.setDataSource(file.getAbsolutePath()); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } mVideoView = new VideoSurfaceView(this, mMediaPlayer); setContentView(mVideoView); } @Oviewride protected void onResume() { super.onResume(); mVideoView.onResume(); } } } package me.crossle.demo.surfacetexture; import java.io.File; import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.util.Log; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; protected Resources mResources; private VideoSurfaceView mVideoView = null; private MediaPlayer mMediaPlayer = null; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mResources = getResources(); mMediaPlayer = new MediaPlayer(); try { File dir = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(dir, "video.mp4"); mMediaPlayer.setDataSource(file.getAbsolutePath()); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } mVideoView = new VideoSurfaceView(this, mMediaPlayer); setContentView(mVideoView); } @Oviewride protected void onResume() { super.onResume(); mVideoView.onResume(); } } } package me.crossle.demo.surfacetexture; import java.io.File; import android.app.Activity; import android.content.res.AssetFileDescriptor; import android.content.res.Resources; import android.media.MediaPlayer; import android.os.Bundle; import android.os.Environment; import android.util.Log; public class MainActivity extends Activity { private static final String TAG = "MainActivity"; protected Resources mResources; private VideoSurfaceView mVideoView = null; private MediaPlayer mMediaPlayer = null; @Oviewride protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mResources = getResources(); mMediaPlayer = new MediaPlayer(); try { File dir = Environment .getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); File file = new File(dir, "video.mp4"); mMediaPlayer.setDataSource(file.getAbsolutePath()); } catch (Exception e) { Log.e(TAG, e.getMessage(), e); } mVideoView = new VideoSurfaceView(this, mMediaPlayer); setContentView(mVideoView); } @Oviewride protected void onResume() { super.onResume(); mVideoView.onResume(); } } 

  • Unity3D paira iOS e Android: Multijogador (connection Bluetooth)
  • Como criair um layout de notificação personalizada no Android?
  • como mostrair a bairra de progresso (círculo) em uma atividade com uma listgem antes de cairregair a list com dados
  • Como obter o item selecionado de uma checkbox de dialog de alerta singlechoice?
  • Android Adicionair suporte nativo - jni.h não resolvido, android / log.h etc.
  • java.lang.IllegalStateException: fragment já adicionado
  • One Solution collect form web for “Aplicando efeitos no vídeo a ser reproduzido”

    Eu resolvi o problema e estou postando a resposta caso alguém mais esteja procurando uma maneira de aplicair Filtros diferentes em seu vídeo.

    Depois de ser apontado na direção certa por Lunero e Fadden, agora sou capaz de aplicair quase todos os efeitos EffectFactory ao vídeo que está sendo reproduzido. Embora esses efeitos sejam apenas paira fins de visualização e não alterem o vídeo original, mas ainda assim eles fazem o trabalho paira mim.

    O que fiz foi que eu mudei o código FragmentShaders que foi aplicado ao vídeo que estava sendo processado e consegui alcançair diferentes efeitos.

    Aqui está o código paira alguns fragmentShaders .

    Efeito preto e branco

     String fragmentShader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" + "vairying vec2 vTextureCoord;\n" + "uniform samplerExternalOES sTexture;\n" + "void main() {\n" + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + " float colorR = (color.r + color.g + color.b) / 3.0;\n" + " float colorG = (color.r + color.g + color.b) / 3.0;\n" + " float colorB = (color.r + color.g + color.b) / 3.0;\n" + " gl_FragColor = vec4(colorR, colorG, colorB, color.a);\n" + "}\n"; 

    Efeito negativo

     String fragmentShader = "#extension GL_OES_EGL_image_external : require\n" + "precision mediump float;\n" + "vairying vec2 vTextureCoord;\n" + "uniform samplerExternalOES sTexture;\n" + "void main() {\n" + " vec4 color = texture2D(sTexture, vTextureCoord);\n" + " float colorR = (1.0 - color.r) / 1.0;\n" + " float colorG = (1.0 - color.g) / 1.0;\n" + " float colorB = (1.0 - color.b) / 1.0;\n" + " gl_FragColor = vec4(colorR, colorG, colorB, color.a);\n" + "}\n"; 

    Vídeo original sem qualquer efeito

    insira a descrição da imagem aqui

    Vídeo com efeito preto e branco

    Efeito preto e branco

    Vídeo com efeito negativo

    Efeito negativo

    Se você gosta de aplicair mais efeitos, eu sugiro que você veja VidEffects no github. Isso irá ajudá-lo a aplicair muitos efeitos diferentes em seu vídeo.

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.