2014-10-14 7 views
10

TextureView 하위 ListView를 사용하고 있습니다. TextureView는 MediaPlayer를 사용하여 비디오를 재생합니다. TextureView가 재활용되면, 마지막 프레임은 다음 MediaPlayer가 그것을 사용할 때까지 표면에 남습니다.MediaPlayer에서 SurfaceTexture를 사용한 후이를 지우는 방법은 무엇입니까?

이전 프레임이 나타나지 않도록 TextureView의 표면 (예 : 검정색)을 "지우는"가장 쉬운 방법은 무엇입니까? 잠시 동안 고민 한 후

답변

7

, 나는 가능한 솔루션의 부부와 함께 왔어요 :

A) GLES를 사용하여 표면을 취소합니다. Grafika에서 예제를 볼 수 있습니다 (clearSurface() 메소드 확인). 저는 개인적으로이 부분에 대한 팬이 아닙니다. 왜냐하면 흑인으로의 부끄러운 전환이 특히 좋다고 생각하지 않기 때문이며, GL 코드를 아직 사용하고 있지 않다면 기술 오버 헤드가 상당히 적습니다. 또한 API 17+에서만 작동하는 것으로 보입니다.

b) 필자가 선택한 해결책은 이전 TextureView를 재사용하는 대신 비디오를 재생할 때마다 새로운 TextureView를 만들고이를 적절한 뷰에 추가하는 것이 었습니다. 나는 이것을 좋은 해결책이라고 부르는 것을 망설이지 만, 그것은 내가 발견 할 수있는 최소한의 끔찍한 해결책이다.

c) 동일한 비디오를 다시 재생할 때 할 수있는 한 가지 방법은 재생이 끝나면 비디오의 첫 번째 프레임을 찾는 것입니다. 그런 다음 마지막 프레임이 다음 번 깜박이면 동영상의 시작 부분과 동일한 프레임이므로 보이지 않습니다. 나는 이것으로 약간의 성공을 거두었지만 모든 장치에서 안정적으로 작동 할 수는 없었다. 그것은 또한 꽤 명확하게 해킹입니다.

행운을 비네,이 문제를 해결하기 위해 매우 실망 스러웠다.

+1

또한 (d) TextureView 위에 빈보기를 추가하십시오. 동영상을 재생하는 동안 그것을 감추고, 재생이 멈출 때 그것을 보여라. – fadden

+1

적어도 내가 발견 한 문제는 MediaPlayer onPrepared 호출 후에도 재생이 시작될 때 비디오가 첫 번째 프레임으로 깜박이는 것입니다. 텍스처가 실제로 준비되었을 때를 결정할 방법을 찾지 못했습니다! 그런 일이 있다면 나는 알고 싶다. – gcgrant

+0

나는 이것이 오래되었음을 알고 있지만 b)에 대한 코드를 공유 할 수 있습니까? 불행히도 안정적으로 작동하는 솔루션을 얻을 수 없었습니다. –