2013-12-12 2 views
0

MediaCodec API를 사용하여 비디오 샘플을 디코딩하려고합니다. 나는 렌더링 된 샘플을 보여주기 위해 surfaceView를 사용하고있다. 홈 버튼을 누르면 앱이 일시 중지 상태가되고 표면이 파괴됩니다. 다시 상태로 돌아 오면 새로운 surfaceView 참조가 생성되지만 디코더는 surfaceView에서 샘플을 펌핑 할 수 없습니다. 화면이 검은 색으로 표시됩니다. 비디오 구성 : videoDecoder.configure (format, surface, null, 0); 그래서 위의 명령문에서 videoDecoder를 재구성 할 수 있습니다. 다음 문제와 유사합니다. How to keep decoding alive during screen orientation?비디오 디코더 MediaCodec을 사용하여 구성

답변

1

MediaCodec API는 현재 출력 (Surface)을 대체하는 방법 (API 19)을 제공하지 않습니다.

다른 질문에서와 같이이 문제를 처리하는 방법은보기 계층 구조에 묶이지 않은 Surface으로 디코딩하는 것입니다 (따라서 Activity이 파괴되었습니다).

MediaCodec의 출력을 SurfaceTexture으로 지정하면이 텍스처를 SurfaceView에 렌더링 할 수 있습니다. GLES 코드가 약간 필요합니다. Grafika sources에서 필요한 조각을 찾을 수는 있지만 현재 원하는대로 완벽하게 구현되지는 않습니다 (예 : PlayMovieActivitySurfaceTexture으로 비디오를 디코딩하지만 해당 ST는 분해 될 TextureView의 일부 임).

추가 렌더링 단계를 수행하면 GPU로드가 증가하고 DRM으로 보호 된 비디오에서는 작동하지 않습니다. 대부분의 기기 및 앱의 경우 이는 중요하지 않습니다.

bigflake examples도 참조하십시오.

업데이트 : 나는 이것을 Grafika에 추가했습니다. "이중 디코드"예제를 참조하십시오. 출력은 TextureView과 연결된 SurfaceTexture으로 출력됩니다. 화면이 회전 된 경우 (또는 현재 전원 버튼을 눌러 비워진 경우) 디코딩이 계속됩니다. "뒤로"또는 "집"버튼을 사용하여 활동을 나가면 디코딩이 중지됩니다. SurfaceTexture을 그대로두고 새로운 TextureView에 연결하여 작동합니다.

+0

답장을 보내 주셔서 감사합니다. 몇 가지 예제 코드를 제공 할 수 있습니까? – saa

+0

다음 몇 주 안에 bigflake/grafika를 업데이트하지 않겠습니다. BTW, H.264를 스트리밍하는 대신 MediaExtractor를 사용하여 파일에서 비디오를 가져 오는 경우 활동이 다시 시작된 후 추출기/디코더를 다시 생성하고 중단 한 위치로 검색하면됩니다. 시간 오프셋은 프리젠 테이션 타임 스탬프로부터 결정될 수있다. – fadden

+0

감사합니다. 나는 당신의 제안에 따라 코드를 바꿀 것이다. – saa

관련 문제