2013-10-14 4 views
6

표면에 비디오를 디코딩 할 때 비트 맵/jpeg 파일로 원하는 프레임을 저장하고 싶습니다. 저는 스크린에 그려 넣고 싶지 않고 SurfaceTexture의 내용을 이미지 파일로 저장하기를 원합니다.SurfaceTexture를 비트 맵으로 저장하는 방법

+0

시도해 보셨습니까? 이 질문을 본 적 있으신가요? http://stackoverflow.com/questions/12600023/how-to-read-pixels-from-a-rendered-texture-in-opengl-es –

+0

저는 GLES에 상당히 익숙합니다. 올바른지 날 제발 내가 틀렸다면 : 실제로 텍스처를 렌더링하지 않고 서피스 색상 형식을 기반으로 SurfaceTexture의 내용을 RGB로 직접 변환하려고합니다. – feisal

답변

7

텍스처를 렌더링해야합니다.

일반 텍스처 였고 GLES 2 이상을 사용 중이라면 FBO에 부착하여 직접 읽을 수 있습니다. SurfaceTexture은 "external texture"으로 백업되며 GL 드라이버가 전체 작업 집합을 지원하지 않는 형식 일 수 있으므로 그렇게 할 수 없습니다. 그것을 렌더링하고 결과를 읽어야합니다.

FWIW를 사용하면 프레임을 저장하는 방식으로 성능에 큰 영향을 줄 수 있습니다. MediaExtractor, MediaCodec, glReadPixels() 및 PNG 파일 생성의 사용을 보여주는 전체 예제가 bigflake (ExtractMpegFramesTest)에 추가되었습니다.

+0

정보 및 사례에 대해 감사드립니다. – feisal

6

저는 최근에 안드로이드 플랫폼에서 이것을보고있었습니다. 다양한 옵션을 요약하고 적용 가능한 이유는 무엇입니까?

  1. glReadPixels()는 유일한 옵션 안드로이드 자바 코더는 현재 정말 있습니다. 천천히. 텍스처가 아닌 프레임 버퍼에서 읽습니다 (화면 자체를 기록하지 않으려면 먼저 텍스처를 내부 프레임 버퍼에 렌더링해야합니다). 괜찮아. 일할 일이있어.

  2. EGL_KHR_image_base() 네이티브 (NJK) 레벨에서는 사용할 수 있지만 Java에서는 사용할 수없는 것 같은 확장 프로그램입니다.

  3. glGetTexImage() 유망하지만 OpenGL 2.0 ES 변형에서 사용할 수 없습니다.

  4. 픽셀 버퍼 객체 아마도 '올바른 방법'일을하고 있지만 OpenGL 3.0 ES (즉, 선택한 Android 4.3 이상 기기)가 필요합니다.

다른 곳에서 사용할 수없는 정보를 추가하는 것은 아닙니다. 그러나 겉으로보기에는 비슷한 많은 옵션을 사용하는 것은 여전히 ​​혼란 스럽습니다. 나는 OpenGL 전문가가 아니므로 위의 실수는 기꺼이 고쳐집니다.

+0

다른 방법으로는 각 토끼 구멍을 조사하고 매핑하는 데 시간을 절약 할 수있는 답변 (구멍의 반이 결실하다는 것을 발견하는 것)은 유용합니다. +1, 우리와 함께 연구/legwork의 초기 비트를 공유하기 위해. – naki

+0

EGL_KHR_image_base()가 NDK에서 제공되지 않는 것 같습니다. 그래서 EGLImage를 사용할 수 있습니다. – lirui

관련 문제