티스토리 뷰

개발자료

[안드로이드] TextrueView, MediaPlayer

임다솜 임다솜 2016.12.16 17:43

TextureView, MediaPlayer

출처 : http://bigstark.tistory.com/13

실제 작성일 : 2016-09-08

 

 

1. TextureView?

TextureView Content StreamDisplay 에 표현할 때 쓰일 수 있다. Content Streamvideo가 될 수 있고, OpenGL이 될 수도 있다. TextureView API 11에서 추가되었으며, 하드웨어 가속이 되는 window에서만 쓰인다. 만약 소프트웨어 렌더링을 한다면, TextureView는 아무것도 그리지 않는다.

 

Window를 따로 생성하는 SurfaceView 와는 달리 TextureView 는 기존 보통의 뷰에서 작동을 한다. 거기에서 오는 큰 차이점은 translate, alpha, animated 가 가능하다는 점이다. 실제로 CurtainListView 라는 것을 만들어보고, 그것에 VideoView를 적용을 했을 때, translate 가 작동하지 않아 불편했던 점이 있다. 또한, YouTube Player API를 쓸 때 가장 불편했던 점 중 하나는, YouTubePlayerView를 옮기려고 할 때, 검은색 잔상이 남는 것이었다. 이는 SurfaceView window를 따로 생성하여 기존의 view만 움직여 생기는 이슈였다. 이를 해결하기 위해서는 translate를 진행한 후 바로 requestLayout 을 호출하여 뷰를 새로 그리는, 말그대로 비효율적인 행동을 했어야만 했다.

TextureView SurfaceTexture 를 이해하는 것이 가장 중요하다. SurfaceTexture는 이미지 스트림에서 프레임을 가져온다. 여기서 이미지 스트림은 보통 카메라, 비디오를 의미한다.

 

 

2. SurfaceTextureListener Interface

TextureView 를 사용하기 위해서는 SurfaceTextureCycle을 잘 알아야 한다.

 

void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height)

TextureView에서 SurfaceTexture 를 사용할 준비가 되었다는 것을 말한다. SurfaceTextureHardwareLayer를 가져오는 메소드 내부에서 생성되며, onSurfaceTextureAvailable SurfaceTexture 가 생성되고 난 후에 호출된다.

 

void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height)

SurfaceTexture Buffer Size가 바뀌었을 때 호출된다.

 

boolean onSurfaceTextureDestroyed(SurfaceTexture surface)

SurfaceTexture Destroy 됐을 때 호출된다. return 값이 있는데, 보통의 경우 true를 쓰며, false를 쓸 경우 무조건 SurfaceTexturerelease 시켜줘야 한다. SurfaceTextureDestroy 하는 경우는 2가지의 경우가 있는데 아래와 같다.

 

boolean onSurfaceTextureUpdated(SurfaceTexture surface)

SurfaceTextureupdateTexImage 를 통해 update 될 때 호출된다. 또한 applyUpdategetBitmap을 할 때마다 호출된다. , Frame 하나하나 마다 호출된다고 봐도 무방하다.

 

4. TextureView + MediaPlayer?

MediaPlayer setSurface 라는 메소드가 있다. 이는 비디오일때만 쓰일 수 있으며, Surface 객체를 받아, MediaPlayer 의 스트림을 그 Surface에 그리는 것을 의미한다. 이 때 SurfaceSurfaceTexture를 이용하여 생성을 할 수 있다.

내부적으로 TextureView 에서 setSurfaceTextureListener 를 해주어, SurfaeTexture cycleMediaPlayer 가 밀접하게 돌아가도록 해야 한다.

 

1. onSurfaceTextureAvailable 에서 MediaPlayer setSurface를 해줘야 한다. onSurfaceTextureAvailable 은 항상 최초에 SurfaceTexture 가 생성될 때 불러와진다. 반대로 말하자면 onSurfaceTextureAvailable 이 호출되었다는 것은 기존에 SurfaceTexture 가 존재하지 않거나 혹은 destroyed 상태임을 의미한다. 그렇기 때문에 MediaPlayer setSurface를 해주어야 한다.

 

2. onSurfaceTextureUpdated Frame 마다 호출된다. 이는 PostionChanged를 추적할 때 굉장히 유용하다. ( * 화면이 살아있을 때)

 

3. onSurfaceDestroyed 에서 MediaPlayer instance를 유지할지, release를 할 지 결정하는 flag를 두면 굉장히 유용하다. 특히 System window 에 영상을 띄우려고 할 때 MediaPlayerEnd State로 가지 않아야 한다. 그래야 position이 유지되며, Intialize - Prepare 의 과정을 거치지 않아 시간적, 리소스적으로 소모가 되지 않는다.

 

댓글
댓글쓰기 폼
공지사항
Total
37,943
Today
34
Yesterday
56
링크
TAG
more
«   2018/05   »
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31    
글 보관함