2008-09-30 10 views
11

사용자에게 내 OpenGL 응용 프로그램의 기본 창에서 비디오 클립을 캡처하는 아주 간단한 방법을 제공해야합니다. 캡처를 시작하고 중지하기 위해 단추 및/또는 키보드 바로 가기를 추가 할 생각입니다. 시작할 때 파일 이름과 다른 옵션이 있으면 요청할 수 있습니다. Windows (XP/Vista)에서 실행되어야하지만, 지금까지 열어 두었던 Linux 문을 닫지는 않을 것입니다.Windows의 OpenGL 창에서 비디오 캡처하기

이 응용 프로그램은 OpenGL 프래그먼트 및 쉐이더 프로그램을 사용하므로 최종 비디오에 반드시 있어야 할 필요가있는 영향입니다.

그것은이 잠재적으로 내 요구 사항을 충족 할 수도 여러 가지 방법이 될 수있다 (하지만 시작해야하는 위치 난 정말 모르겠다)처럼 내게 보이는

:

  • startRecording 같은 기능을 가진 인코딩 라이브러리를 (filename), stopRecording 및 captureFrame을 사용하십시오. 렌더링 된 모든 프레임 (또는 모든 초/세 번째/뭐든) 후에 captureFrame()을 호출 할 수 있습니다. 그렇게하면 프로그램이 느리게 실행되므로 문제가되지 않습니다.

  • 내 응용 프로그램에서 프로그래밍 방식으로 제어 할 수있는 독립형 외부 프로그램입니다. 결국, 이 아닌을 제어 할 수있는 독립 실행 형 프로그램은 내가 필요한 것을 거의 수행합니다 ...하지만 사용자가 작동하는 것은 매우 간단해야하며, 또한 원활함을 고맙게 생각합니다. 내 응용 프로그램은 일반적으로 전체 화면으로 실행됩니다. 또한 NSIS를 사용하여 현재 준비하고있는 응용 프로그램의 설치 패키지의 일부로 배포 할 수 있어야합니다.

  • Windows API를 사용하여 스크린 샷을 프레임 단위로 캡처 한 다음 libraries mentioned here 중 하나를 사용합니다 (예 :). Windows에서 스크린 샷을 캡처하는 방법의 예제를 찾는 것은 쉽지 않은 것 같습니다. 그러나, 나는 정말로 WinAPI 레벨에서 내 손을 더럽힐 수없는 해결책을 원합니다.

  • OpenGL을 사용하여 오프 스크린 대상에 렌더링 한 다음 라이브러리를 사용하여 비디오를 생성합니다. 나는 이것이 가능한지 모르겠다. 그리고 어쨌든 그것이 가장 고통스런 길은 아닐지 모른다. 특히, 비디오 캡처 여부에 따라 다른 실행 경로를 취하는 실제 렌더링이 마음에 들지 않습니다. 또한 정상적인 비 캡처 모드에서 프레임 속도를 저하시킬 수있는 사항은 피할 수 있습니다.

해결책이 단어의 의미에서 자유 롭다면 그럴 것입니다. 그러나 실제로는 절대적인 요구 사항은 아닙니다. 일반적으로 덜 부 풀릴수록 좋습니다. 반면에,이 질문을 넘어서는 이유로 불행히도 GPL 전용 코드는 링크 할 수 없습니다.

파일 형식과 관련하여 사용자가 코덱을 검색하기를 기대할 수는 없지만 이 표시되면으로 표시됩니다. 기본 수준의 Windows 사용자가 동영상을보기에는 쉽지만 실제로는 형식입니다. 그러나 출력의 압축 품질을 제어 할 수 있다면 좋을 것입니다.

명확히하기 : 은 캠코더와 같은 외부 장치에서 비디오를 캡쳐해야하며 마우스 움직임에 관심이 없습니다. 오디오 관련 요구 사항은 없습니다. 응용 프로그램은 전혀 잡음을 발생시키지 않습니다.

Visual Studio 2008을 사용하여 C++로 작성합니다. GLUT 및 GLUI의 이점을 활용하는 바로 그 응용 프로그램입니다.저는 C++과 라이브러리와 그 종류의 물건들에 대한 견고한 이해를 가지고 있습니다. 그러나 다른 한편으로는 OpenGL은 제게 상당히 새로운 것입니다 : 지금까지, 실제로는 실제로 일을 끝내기 위해 필요한 비트를 배웠습니다.

내가 슈퍼 긴급 솔루션이 필요하므로 서로 다른 두 가지 질문이 여기에 있습니다 :

답변

8

시간을 자유롭게하지 않는다 -는 OpenGL 응용 프로그램에서 프레임을 잡아 방법과로를 설정하는 방법 영화 파일.

첫 번째 질문은 쉽습니다. glReadPixels()를 사용하여 각 프레임을 잡아라 (성능이 필요한 경우 PBO를 통해).

크로스 플랫폼 솔루션 (ffmpeg)이 GPL 또는 LGPL 인 경향이 있으므로 두 번째 질문은 조금 더 힘듭니다. 귀하의 프로젝트에 LGPL을 사용할 수 있습니까? 이 작업을 수행하는 Windows의 방법 (DirectShow)은 약간의 두통입니다.

편집 : LGPL은 괜찮으므로 ffmpeg를 사용할 수 있으므로 비디오 인코딩 방법에 대한 예제는 here을 참조하십시오.

+0

예 : LGPL은 정상입니다. – Reunanen

+0

glReadPixels() 실제로 첫 번째 질문에 필요한 것, 감사합니다! – Reunanen

+0

@MikeF : 그 링크는 흉상입니다. –

0

가장 쉬운 옵션은 렌더링 된 각 프레임을 앱에서 저장 한 다음 AVI로 병합하는 것입니다. 당신이 AVI를 가지고있을 때, 그것을 더 최적의 형식으로 변환 할 수있는 많은 라이브러리들이 있거나 가능하게 AVI 단계를 건너 뛸 수 있습니다.

각 프레임을 가져 오는 관점에서 제안한대로 화면을 벗어난 텍스처로 렌더링하거나 하드웨어가이를 지원할 경우 소스로 직접 버퍼를 사용하여이 작업을 수행 할 수 있습니다. 이 중 하나를 수행하면 (그리고 각 프레임을 저장하는 경우) 프레임 속도에 큰 불이익을주지 않으면 어려워 질 것입니다.

응용 프로그램을 제공하면 사용자 동작을 일련의 입력으로 "기록"한 다음 AVI를 생성하기 위해 이들을 화면 외 표면으로 순차적으로 렌더링하는 내보내기 모드를 사용할 수 있습니다.

+0

비디오를 실제로 캡처 할 때만 적용되는 한 프레임 속도 패널티는 상당히 수용 가능합니다. 앱은 확률 적이 지 않은 의미에서 결정적이지만 표시되는 것은 사용자 작업 외에 외부 측정 장치의 결과에도 기반합니다. – Reunanen

1

This은 (앤드류에 의해 제안)하지만 난 정말이있는 경우 등 답변

감사합니다, 나는 성공에보고를 LPBITMAPINFOHEADERs을 피하기 위해 기대했다, 아비에 병합 꽤 관련 보입니까 어떤 것으로 될지 :)

한편, 원시 프레임을 비디오 클립으로 인코딩하려면 glReadPixels에서 추가 팁을 보내 주시면 감사하겠습니다.

편집 : 지금까지 ffmpeg가 제안한 방법은 마이크 F가 제안했습니다. 그러나 아직 실제 구현에 들어 가지 못했지만 가까운 장래에 변경 될 것으로 기대됩니다!

+0

VfW와 DirectShow를 사용하면 사용자 컴퓨터에 설치된 코덱 만 사용할 수 있으므로 사용하려는 코덱을 함께 제공하거나 * 보장 할 코덱을 알아야합니다. –

0

OpenGL 렌더링을 비디오로 녹화하는 데모 프로젝트를 만들어야했습니다. glReadPixels을 사용하여 픽셀 데이터를 얻었으며 OpenCV의 cvWriteFrame으로 비디오를 만들었습니다. OpenCV를 사용하면 divx 또는 심지어 x264/vp8 (ffmpeg가 컴파일 된 상태)로 작성할 수 있습니다.

예제 프로젝트와 함께 내 블로그 게시물에 대한 자세한 기록이 있습니다. http://tommy.chheng.com/2013/09/09/encode-opengl-to-video-with-opencv/

+1

답변을 게시 해 주셔서 감사합니다! 이 사이트의 대답의 핵심 부분을이 사이트에 게시하거나 게시물의 위험 요소를 삭제해야합니다. [링크보다 간신히 답을 제시하는 FAQ를 참조하십시오.] (http : // stackoverflow. co.kr/faq # deletion) 원하면 '참조'로만 링크를 포함 할 수 있습니다. 대답은 링크가 필요없이 독자적으로 서 있어야합니다. – Taryn

+1

안녕하세요 bluefeet, 대답의 필수 부분은 현재 : "픽셀 데이터를 얻기 위해 glReadPixels를 사용하여"OpenCV의 "cvWriteFrame"을 사용합니다. 블로그 게시물에 대한 자세한 내용은 있지만 그 대답은 요지입니다. –