2011-02-03 8 views
2

저는 iPhone 카메라에서 라이브 비디오 프레임을 가져 와서 평면 OpenGL 지오메트리에 텍스처로 적용하여 카메라 입력 처리에 셰이더를 사용했습니다. 누구든지 처리 된 텍스처를 잡고 영화 파일에 저장할 수 있는지 알고 있습니까?OpenGL ES : 일련의 텍스처를 동영상 파일로 저장

처리 능력이 많이 걸리는 것처럼 보입니다. 앞으로 나아갈 수있는 최선의 방법은 무엇인지, 아니면 가능할 지 모르겠습니다. 여기서 동기 부여는 카메라에서 가져온 비디오에 흥미로운 쉐이더 효과를 적용한 다음 결과를 저장하여 다른 사람들과 공유 할 수있게하는 것입니다.

미리 감사드립니다.

답변

5

나는 성능에 대해 언급,하지만 당신이 원하는 것은 없습니다

  • 는이 AVAssetWriter (수신 샘플을 채취하고 H.264에서 그들을 기록 할 수있는 만들고, 다른 파일 형식이 보이지 않는다
  • AVAssetWriterInput을 자산 라이터에 첨부하여 비디오 프레임을 제공하십시오 (자산 작성자가 각각 자산의 다른 측면을 제공하기 위해 하나 이상의 입력을 취함).
  • 자산 라이터 입력에 AVAssetWriterInputPixelBufferAdaptor을 첨부하면 입력에서 픽셀 버퍼를 밀어 넣을 수 있습니다. 실시간으로 미디어 데이터를 예상한다는 것을 저작자 입력에 알리고 자 할 것입니다. 그렇게하면 항상 입력 준비가되어 있습니다. 프레임을 제공 할 때와 프레임 타이밍을 지정하므로 나머지 코드에는 성능 요구 사항이 적용되지 않습니다.

거기에서 CVImageBuffers를 픽셀 버퍼 어댑터로 푸시하면됩니다. OS X에는 편리한 Core Video OpenGL 버퍼 유형이 있지만 iOS에는없는 것으로 보입니다. 대신 과 CVPixelBufferCreate 등이 필요하며 픽셀 버퍼를 잠그고 기본 주소에 직접 쓰는 것이 좋습니다. 그 사이에 바이트를 섞어 놓지 않고도 OpenGL에 직접 전달할 수있는 무언가를 얻을 수 있기를 바랍니다.

iPhone에 전용 H.264 인코더가 있다고 가정하면 주요 성능 병목 현상이 glReadPixels 일 수 있습니다. 프레임 버퍼에있는 모든 요소가 CPU로 전송되고 다시 포맷되어야합니다. 모든 것을 설정하고 결과가 느린 것 같으면 먼저 조사하겠습니다.

+0

'glReadPixels'과'CVPixelBuffer'는 꽤 잘 작동합니다. 내가 가지고있는 유일한 문제는 "꺼짐"인 색입니다. CVPixelBuffer'와 함께 사용되는'glReadPixels'과 BGRA에 전달되는'GL_RGBA' 때문인 것 같습니다. 이 픽셀 형식에 대한 의견이나 해결 방법은 무엇입니까? – MrDatabase

+0

사양을 읽었을 때, Apple의 BGRA 확장은 BGRA 업로드를 추가하는 것으로 보이지만 다운로드하지는 않습니다. GL_BGRA에게'glReadPixels'을 한 장 줄 수는 있지만 낙천적이지는 않습니다. 내가 AV Foundation에 버퍼를 전달하기 전에 채널 스왑을해야한다고 생각하지는 않습니다. 아마도 GPU에서 그렇게하는 것이 가장 저렴 할 것입니다. 아마도 텍스쳐로 렌더링하여 사용자에게 보여주고 r과 b를 뒤집기 위해 도시되지 않은 버퍼로 렌더링하면됩니다. 그것은 복잡하게 들리지만 다른면에서는 iOS 5에서 CoreVideo 이미지를 OpenGL로 쉽게 가져 오는'CVOpenGLESTexture'가 추가되었습니다. – Tommy