문제

OpenGL 애플리케이션의 기본 창에서 비디오 클립을 캡처하는 정말 간단한 방법을 사용자에게 제공해야합니다. 캡처를 시작하고 중지하기 위해 버튼 및/또는 키보드 바로 가기를 추가 할 생각입니다. 시작할 때 파일 이름 및 기타 옵션을 요청할 수 있습니다. Windows (XP/Vista)에서 실행해야하지만 지금까지 열려있을 수있는 Linux 도어를 닫고 싶지 않습니다.

응용 프로그램은 OpenGL 조각 및 셰이더 프로그램을 사용합니다. 이는 최종 비디오에서 절대적으로 필요한 효과가 있습니다.

잠재적으로 내 요구 사항을 충족시킬 수있는 몇 가지 다른 접근법이있을 수있는 것처럼 보입니다 (그러나 어디서부터 시작 해야하는지 실제로는 모르겠습니다).

  • Startrecording (filename), STOPRECORDING 및 CAPTUREFRAME과 같은 기능을 갖춘 인코딩 라이브러리. 모든 프레임이 렌더링 된 후 CaptureFrame ()을 호출 할 수 있습니다 (또는 매 초/세 번째/무엇이든). 그렇게하면 내 프로그램이 느려지면 실제로는 문제가되지 않습니다.

  • 내 응용 프로그램에서 프로그래밍 방식으로 제어 할 수있는 독립형 외부 프로그램. 결국, 할 수있는 독립형 프로그램 ~ 아니다 거의 내가 필요한 것을 통제해야하지만, 말한 것처럼, 사용자가 운영하는 것은 정말 간단해야하며, 나는 또한 매끄러운 것에 감사 할 것입니다. 내 응용 프로그램은 일반적으로 전체 화면을 실행합니다. 또한 현재 NSIS를 사용하여 준비하는 응용 프로그램의 설치 패키지의 일부로 배포 할 수 있어야합니다.

  • Windows API를 사용하여 프레임 별 스크린 샷을 캡처 한 다음 (예를 들어) 중 하나를 사용합니다. 여기에 언급 된 라이브러리. Windows에서 스크린 샷을 캡처하는 방법의 예를 찾기가 쉽습니다. 그러나, 나는 실제로 Winapi 수준에서 내 손을 매우 더 좋아하는 솔루션을 좋아할 것입니다.

  • OpenGL을 사용하여 화면 대상으로 렌더링 한 다음 라이브러리를 사용하여 비디오를 제작하십시오. 나는 이것이 가능한지 모르겠다. 그리고 어쨌든 그것이 최소한의 고통의 길이 아닐까 두려워. 특히, 비디오가 캡처되는지 여부에 따라 실제 렌더링이 다른 실행 경로를 취하는 것을 원하지 않습니다. 또한 정상 비 캡처 모드에서 프레임 속도를 줄일 수있는 모든 것을 피할 수 있습니다.

솔루션이 단어의 의미에서 자유 롭다면, 그것은 좋지만 실제로 절대적인 요구 사항은 아닙니다. 일반적으로 부풀어 오르는 것이 적을수록 좋습니다. 반면에,이 질문 이외의 이유로, 나는 불행히도 GPL 전용 코드로 연결할 수 없습니다.

파일 형식과 관련하여 사용자가 코덱에 대한 인터넷 검색을 시작할 것으로 기대할 수는 없지만 표시 비디오는 기본 수준의 Windows 사용자에게는 충분히 쉽습니다. 형식이 무엇인지 실제로 신경 쓰지 않습니다. 그러나 출력의 압축 품질을 제어 할 수 있다면 좋을 것입니다.

명확히하기 위해 : i ~하지 않다 캠코더와 같은 외부 장치에서 비디오를 캡처해야하며 마우스 움직임에 관심이 없지만 해를 끼치 지 않더라도 마우스 움직임에 관심이 없습니다. 오디오에 관한 요구 사항은 없습니다. 응용 프로그램은 전혀 소음이 없습니다.

나는 Visual Studio 2008을 사용하여 C ++를 작성합니다. 나는 C ++에 대한 확실한 이해와 라이브러리와 그와 같은 종류의 것들에 대한 확실한 이해를 가지고 있지만, OpenGL은 나에게 아주 새로운 것입니다. 지금까지, 나는 실제로 내 작업을 완료하는 데 필요한 비트 만 배웠습니다.

나는 매우 격렬하게 해결책이 필요하지 않으므로 시간을 내 주시기 바랍니다. :)

도움이 되었습니까?

해결책

여기에는 OpenGL 애플리케이션에서 프레임을 잡는 방법과 영화 파일로 전환하는 방법이 있습니다.

첫 번째 질문은 충분히 쉽습니다. 성능이 필요한 경우 PBO를 통해 glreadpixels ()로 각 프레임을 잡습니다.

두 번째 질문은 크로스 플랫폼 솔루션 (FFMPEG)이 gpl'd 또는 lgpl'd 경향이 있기 때문에 조금 더 어렵습니다. 프로젝트에 LGPL이 허용됩니까? 이 작업을 수행하는 Windows (Directshow)는 사용하기에 약간의 두통입니다.

편집하다: LGPL은 괜찮고 FFMPEG를 사용할 수 있으므로 여기 비디오를 인코딩하는 방법의 예는

다른 팁

이것 AVI (Andrew가 제안한대로)로 합병하는 데 매우 관련이 있지만 LPBITMAPINFOHEADERS 등을 피하고 싶었습니다.

답변 해주셔서 감사합니다. 어떤 것이있을 경우 :) 성공에 대해보고하겠습니다. :)

그 동안 원시 프레임을 인코딩하기위한 추가 팁 glReadPixels 비디오 클립에 감사드립니다.

편집하다: 지금까지 Mike F가 제안한 FFMPEG는 갈 길인 것 같습니다. 그러나 나는 아직 실제 구현에 들어 가지 않았지만 가까운 시일 내에 변할 수 있기를 바랍니다.

가장 쉬운 옵션은 앱 내에서 각 렌더링 된 프레임을 저장 한 다음 AVI로 병합하는 것입니다. AVI가 있으면 더 최적의 형식으로 변환하거나 AVI 단계를 완전히 건너 뛸 수있는 많은 라이브러리가 있습니다.

각 프레임을 얻는 측면에서 하드웨어가 지원하는 경우 Backbuffer를 소스로 직접 사용하는대로 오프 스크린 텍스처로 렌더링하여이를 달성 할 수 있습니다. 이들 중 하나를 수행하고 각 프레임을 저장하는 것은 프레임 속도에 대한 무거운 형벌 없이는 어려울 것입니다.

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

비디오에 렌더링하는 OpenGL 렌더링을 녹음하는 데모 프로젝트를 만들어야했습니다. 나는 사용했다 glReadPixels 픽셀 데이터를 가져 와서 OpenCV로 비디오를 만들려면 cvWriteFrame. OpenCV를 사용하면 Divx 또는 x264/vp8 (FFMPEG가 컴파일 된)으로 쓸 수 있습니다.

블로그 게시물에 샘플 프로젝트와 함께 더 자세한 글을 썼습니다.http://tommy.chheng.com/2013/09/09/encode-opengl-to-video-with-opencv/

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top