2017-01-31 1 views
0

Ich verwende derzeit Mediacodec für Live-View-Hardware-Decodierung. Code wie folgt aussiehtKann ich auf einer Oberfläche zeichnen, nachdem ich den Mediacodec veröffentlicht habe, der es verwendet

mMediaCodecDecoder = MediaCodec.createDecoderByType(MIME_TYPE); 
format = MediaFormat.createVideoFormat(MIME_TYPE, mLiveViewBuff.frameData.picWidth, mLiveViewBuff.frameData.picHeight); 
if (mSurfaceHolder.getSurface().isValid()) { 
    mMediaCodecDecoder.configure(format, mSurfaceHolder.getSurface(), null, 0); 
} 
mMediaCodecDecoder.start(); 
decoderInputBuffers = mMediaCodecDecoder.getInputBuffers(); 
decoderOutputBuffers = mMediaCodecDecoder.getOutputBuffers(); 
decoderConfigured = true; 

Und irgendwann, entscheide ich, wie diese dann danach

mMediaCodecDecoder.stop(); 
mMediaCodecDecoder.release(); 
mMediaCodecDecoder = null; 

die Mediacodec lösen Ich möchte die Oberflächenansicht löschen, indem Sie diese, bevor ich will Erstellen Sie einen anderen Mediacodec für eine andere Liveview-Hardware-Decodierung.

Canvas canvas = mSurfaceHolder.lockCanvas(); 
canvas.drawColor(getResources().getColor(R.color.WHITE)); 
mSurfaceHolder.unlockCanvasAndPost(canvas); 

aber ich habe einige Fehler connect(P): already connected

eine lange Geschichte im Grunde kurz

Also, ich habe 2 h264 Livefeed mediacodec verwenden Hardwaredekodierung zu tun und auf Surface spielen. zwischen den Spielen möchte ich die Oberflächenansicht löschen, indem ich reines Schwarz auf die Leinwand zeichne.

Bitte geben Sie mir einige Ratschläge Dank

Antwort

0

ich ähnliche Frage hier und Antwort Antwort hier https://stackoverflow.com/a/29243067/849715

private void clearSurface(SurfaceTexture texture) { 
     EGL10 egl = (EGL10) EGLContext.getEGL(); 
     EGLDisplay display = egl.eglGetDisplay(EGL10.EGL_DEFAULT_DISPLAY); 
     egl.eglInitialize(display, null); 

     int[] attribList = { 
       EGL10.EGL_RED_SIZE, 8, 
       EGL10.EGL_GREEN_SIZE, 8, 
       EGL10.EGL_BLUE_SIZE, 8, 
       EGL10.EGL_ALPHA_SIZE, 8, 
       EGL10.EGL_RENDERABLE_TYPE, EGL10.EGL_WINDOW_BIT, 
       EGL10.EGL_NONE, 0,  // placeholder for recordable [@-3] 
       EGL10.EGL_NONE 
     }; 
     EGLConfig[] configs = new EGLConfig[1]; 
     int[] numConfigs = new int[1]; 
     egl.eglChooseConfig(display, attribList, configs, configs.length, numConfigs); 
     EGLConfig config = configs[0]; 
     EGLContext context = egl.eglCreateContext(display, config, EGL10.EGL_NO_CONTEXT, new int[]{ 
       12440, 2, 
       EGL10.EGL_NONE 
     }); 
     EGLSurface eglSurface = egl.eglCreateWindowSurface(display, config, texture, 
       new int[]{ 
         EGL10.EGL_NONE 
       }); 

     egl.eglMakeCurrent(display, eglSurface, eglSurface, context); 
     GLES20.glClearColor(0, 0, 0, 1); 
     GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT); 
     egl.eglSwapBuffers(display, eglSurface); 
     egl.eglDestroySurface(display, eglSurface); 
     egl.eglMakeCurrent(display, EGL10.EGL_NO_SURFACE, EGL10.EGL_NO_SURFACE, 
       EGL10.EGL_NO_CONTEXT); 
     egl.eglDestroyContext(display, context); 
     egl.eglTerminate(display); 
    } 
Verwandte Themen