2014-07-23 2 views
3

MediaPlayer 렌더링 비디오가 TextureView입니다. 이것은 작동 중입니다.이미지 렌더링 후 MediaPlayer가 TextureView로 렌더링 할 수 없습니다.

이제 주어진 시간 동안이 TextureView에 정지 이미지를 표시하고 MediaPlayer에 비디오를 동일하게 TextureView으로 렌더링하고 싶습니다. 이 후

Canvas canvas = mTextureView.lockCanvas(); 
canvas.drawBitmap(sourceBitmap, matrix, new Paint()); 
mTextureView.unlockCanvasAndPost(canvas); 

, 비디오 ERROR_INVALID_OPERATION에서 (-38) 비디오 플레이어에서 트리거되는 결과를 재생하려는 시도 :

다음은 비트 맵을 렌더링하는 내 코드입니다.

drawBitmap에 대한 호출을 주석 처리하려고 시도했지만 오류가 여전히 발생했습니다. lockCanvas 다음에 unlockCanvasAndPost이 이어지는 간단한 작업으로 을 사용하는 경우에는 TextureView이 적합하지 않은 것으로 보입니다.

에서 사용할 수있는 상태로 TextureView을 다시 설정할 수있는 방법이 있습니까?

나는 안드로이드 4.2.2에서 일하고있다.

답변

8

Android 앱 프레임 워크의 제한 사항 (Android 4.4 이상)으로 인해이 작업을 수행 할 수 없습니다.

TextureView의 기초가되는 SurfaceTexture는 버퍼 소비자입니다. MediaPlayer는 버퍼 생성자의 한 예이고 Canvas는 또 다른 예입니다. 제작자를 연결 한 후에는 두 번째 제작자를 연결하기 전에 분리해야합니다.

문제는 소프트웨어 기반 (Canvas) 버퍼 제작자를 분리 할 방법이 없다는 것입니다. 있을 수도 있지만 그렇지 않습니다. 그래서 캔버스로 그릴 때, 당신은 붙어 있습니다. (해당 효과에 대한 참고 사항은 here입니다.)

GLES 제작자를 분리하십시오. 예를 들어, Grafika의 비디오 플레이어 클래스 중 하나에서 GLES를 사용하여 표면을 검정색으로 지우는 clearSurface() 메서드를 찾을 수 있습니다. EGL 컨텍스트와 창은 메소드의 범위 내에서 작성되어 명시 적으로 릴리스됩니다. 대신 방법을 확장하여 이미지를 표시 할 수 있습니다.

+0

내가 버퍼 생성자로 MediaPlayer를 가지고 있다면 가장 쉬운 방법으로 내 표면을 검정색으로 지울 수 있습니까? – Gilbert

+0

@ 길버트 : 아마도 새로운 질문으로 게시해야합니다.그 문제에 대한 해결책은 일반적으로 세 가지 형태가 있습니다 : (1) 아마도 단일 프레임의 검은 색 비디오를 재생하여 MediaPlayer가 그것을 얻도록하십시오; (2) MediaPlayer 연결을 해제하고 GLES로 지우고 MediaPlayer를 다시 연결합니다. (3) 앞면에 동일한 치수의 불투명 한 검정색보기를 배치하십시오. 세 번째는 SurfaceView와는 달리 TextureView에서 매우 쉽습니다. SurfaceView와 달리 다른 뷰와도 잘 어울립니다. – fadden

+0

@fadden 우리는 SurfaceView에 비트 맵을 그리는 2 가지 방법을 사용할 수 있습니다. 단지 Canvas.drawBitmap() API를 사용하고 수동으로 OpenGL을 사용하여 그립니다. 두 가지 모두 하드웨어 가속이지만 어느 것이 더 빠릅니까? OpenGL을 사용하여 수동으로 그리는 작업은 메모리 복사가 필요하다고 생각합니다. 우선 texImage2D API를 사용하여 비트 맵을 GPU의 텍스처로 업로드해야합니다. – dragonfly

0

최근에 비슷한 문제가 발생했습니다. 제 의도는 TextureView에 비디오 미리보기 이미지를 직접 표시 한 다음 다른 ImageView을 사용하여 비디오 미리보기 이미지를 표시하지 않고도 동일한 비디오 TextureView을 사용하여 비디오를 재생하는 것이 었습니다.

@ fadden의 주석에서 두 번째 방법을 구현했습니다. EGL을 사용하여 비디오 섬네일을 동일한 TextureView에 그립니다.

또한 동일한 목표를 달성하기 위해 GLSurfaceView에 두 개의 텍스처를 사용할 수도 있습니다. 연속적인 비디오를 재생하기위한 하나의 외부 OES 텍스처와 비디오 축소판을 표시하는 또 다른 2D 텍스처.

전체 데모는이 github 프로젝트 EGLPoster에서 찾을 수 있습니다.

여기 오는 사람에게 도움이되기를 바랍니다.

관련 문제