2013-07-08 3 views
0

나는 항상 약 30 비트의 비디오 데이터가 필요하도록 Desktop/DirectX 출력을 루프로 녹음해야합니다. 필요할 때 저장할 수 있습니다.C++/C에서 directx 출력을 반복하는 루프

지금까지 단순히 파일에 녹화하는 것으로 만 알았지 만 어떤 종류의 순환 MemoryStream에 녹음하여 요청할 때만 재생 가능한 비디오 파일을 생성하고 싶습니다.

누구든지이 분야에서 전문 지식을 가지고 있다면 매우 감사 할 것입니다.

답변

0

맞아요. 30 초의 프레임 데이터를 저장할만큼 큰 순환 버퍼를 사용합니다. 캡처 스레드에서 버퍼의 다음 프레임으로 직접 복사하면됩니다. 일단 버퍼를 채우면 시작 부분으로 돌아가 다시 채우기 시작합니다. 다음 사용 가능한 프레임은 항상 가장 오래된 프레임입니다.

원하는 경우 머리/꼬리 색인을 유지 관리 할 수 ​​있습니다. 그러나 다음 사용 가능한 색인과 버퍼가 가득 찼는지를 나타내는 플래그를 추적하는 것이 더 쉽습니다 (버퍼가 가득 차 있지 않은 경우 다음 사용 가능한 색인은 사용 가능한 프레임의 수이기도합니다).

디스크에 데이터를 쓸 때 캡처를 중지하거나 충분히 빠르게 쓸 수 있어야합니다. 여기서 I/O 최적화가 중요합니다. 디스크 섹터 크기의 배수 인 블록에서 버퍼링되지 않은 쓰기를 사용하십시오. 일부 시스템에서는 프레임 데이터를 섹터 정렬 메모리 주소에 할당하는 경우 전체 최적화를 이용할 수 있습니다.

I/O가 캡처 속도보다 느린 경우 30 초보다 큰 버퍼를 유지해야합니다. 크기를 원하는만큼 크게하십시오. 항상 가장 오래된 프레임을 먼저 작성하십시오. 가장 오래된 프레임을 찾으려면 조금 모듈로 연산을 수행합니다

물론
firstFrameIdx = (bufSize + nextFrameIdx - numberOfSeconds * framesPerSecond) % bufSize 

, 당신은 언제나 새로운 메모리에 버퍼를 복사 한 다음 원하는만큼 천천히 그것을 밖으로 작성할 수 있습니다.

+0

너무 많은 이론으로, 나는 메모리에서 캡처하고 인코딩하기 위해 사용해야하는 API/프레임 워크에 대해 아직 모릅니다. 내가 말했듯이, 내가 찾은 모든 것은 '스크린 샷 찍기'또는 'HDD에 비디오 저장'이었습니다. –

+0

흠, 당신은 자신을 아주 잘 설명하지 않았습니다. 이 일을하기 위해 작성한 코드를 가지고 있고 필요에 따라 프레임 기록을 작성하는 백 버퍼를 유지하는 방법을 알고 싶었던 것처럼 나에게 들렸다. 당신은 당신이 녹음하고있는 것을 말조차하지 않았습니다. 자신의 응용 프로그램의 출력입니까, 아니면 전체 화면을 캡처하려고합니까? – paddy

+0

내가 말했듯이 파일에 기록하는 것은 쉽고 모든 라이브러리가이를 수행 할 수 있습니다. 그러나 어떤 라이브러리도 버퍼에 직접 기록하지 않기 때문에 직접해야합니다. 따라서 질문이 필요합니다. 전체 화면이어야합니다. 압축되지 않은 메모리에 프레임을 저장하면 크기가 너무 커지므로 원형 버퍼에 저장해야합니다. 압축하는 동안 어떻게 든 ... –

관련 문제