먼저, 동영상이란 무엇인가? 각 그림이 하나의 프레임을 이루어, 프레임이 모여 동영상을 만드는 것이다.(라고 알고 있다) 그림을 여러장을 빨리, 똑같은 간격으로 보여주는 것만으로도 동영상처럼 보여줄 수 있다는 소리. 그러니까 Phonon을 쓰지 않아도 캡쳐한 그림을 QLabel::setPixmap으로 라벨에 보여주기만 해도 동영상처럼 사용할 수 있다는 뜻. 만약 클라이언트가 있어서 이 그림을 클라이언트에게 전송한다면 마찬가지로 똑같이 동영상처럼 보이게 할 수 있겠지만, 전송 속도나 그런 것에 영향을 심하게 받지 않을까 생각한다. 아무튼, 메인윈도우에 나오는 그림이 위에 쓴 그 상태고, 지금은 캡쳐 영역의 일부분만 나오는데 그건 scaled를 안해줘서 그렇다.
지금 만들고 있는 이거는 계획이 서버-클라이언트라 서버에서 찍은 동영상을 클라이언트들이 볼 수 있어야 하는데, 서버에서 굳이 동영상 인코딩한걸 재생까지 할 필요는 없을것 같다. 어차피 서버에서는 사운드 캡쳐를 안해도 딜레이 없이 똑같이 보이니까 저런 식으로 처리해도 무리는 없을 것 같음.
모든 캡쳐된 그림은 QQueue로 넣어서 사용하기로 하였다. 좀 쌓아놨다가 한번에 인코딩할 수도 있겠고, 생각해 보면 그때그때 생긴 그림을 바로 인코딩하는 것보다 CD플레이어의 안티쇼크 기능처럼 많이 가지고 있으면 뭔가 더 안정적일 것이라 생각하고 있다. 예를 들어 그림 한 장 인코딩을 놓치면 소실이지만 그 프레임은 그냥 소실이지만, 일단 큐에 쥐고만 있으면 어떻게든 할 수 있겠지; 그런데 이렇게 생각하고서는 별 생각없이 Queue의 최대값을 1000으로 잡았더니 나중에 컴퓨터가 거의 멈추어버렸다. 아마도 용량이 커서 그런 것이 아닐까. QPixmap이란게 픽셀 데이터를 담고 있다고 하니 단순하게 생각해서 좌표 x,y 각각 2바이트, RGB값 각각 3바이트 이상... 으로만 계산해서 10바이트가 넘는데 저 영역이 284*184의 영역을 캡쳐하니까 52556 * 10바이트, 그러니까 QPixmap 하나가 500KB정도의 용량을 차지한다고 생각해 볼 수 있겠다. QPixmap이 어떤 식으로 저장하는지는 잘 모르니까... 녹화 영역이 더 커진다면 더 위험하고.
근데 지금은 enqueue만 해놓고 dequeue를 안해놨으니까 쌓이기만 하다 문제가 생기는게 당연한 것 같긴 하다. 빨리 쌓인 이미지를 인코딩할 수 있게 해야 하는데; 그렇게 하면 큐에 그림이 차면서 빠지고 차면서 빠지고 해서 적당량을 유지할 것 같다. 그리고 어쨌든 큐의 최대값을 줄여야 하겠고.
어쨌든 지금까지는 별 문제 없이 모든걸 해결했다. 진정한 문제는 이제부터.
- 사운드 캡쳐 문제
RtAudio 이야기를 했었는데 이게... pulseaudio를 지원 안하는 것 같아 쓰려다 말았다. 우분투에서 pulseaudio를 쓰는데 만약에 이 프로그램을 쓸 사람이 봤더니, 사운드 지원을 위해 alsa나 oss를 설치해야 한다는 소리를 들으면 차라리 안쓰고 말지 않을까. 귀찮기도 하고. 그래서 cross platfom sound library 이런거 검색어로 넣고 마구 검색해봤는데 쓸만한 것이 없는것 같다. 어떻게 해야할지... recordmydesktop 소스코드를 보고 분석해서 집어넣는다고 해도 윈도우는 어떻게 해야 할지; 윈도우 고수들는 주위에도 몇명 있으니 하려면 어떻게든 하겠지만, 사운드가 우선적인 순위는 아니라 이건 급하진 않고.
- 인코딩 문제
당면한 가장 큰 문제가 이건데, 나는 그때 별 무리없이 ffmpeg가 컴파일되는 것을 보고 별 어려움이 없겠지 생각했는데 일단 컴파일이 안된다; 이것저것 헤더 경로 수정하고 해도 안되길래, 아예 apt-get으로 libavcodec-dev 이런거 다 설치해버렸는데 그래도 안된다. 뭐가 문제지; 그래 어쨌든 이건 15분도 투자 안했으니 조금 더 투자하면 문제의 원인을 안다고 쳐도, 인코딩을 어떻게 할 것인가. 그렇게 내가 실력이 뛰어나지 않아서 그런걸까, 조금 확실한 예제와 설명을 볼 수 있으면 좋겠는데 찾아보기도 쉽지가 않다.
- fps문제
전에도 쓴 이야기지만, 내가 캡쳐 간격을 100밀리세컨드로 잡아놨다고 해서 그림이 100밀리세컨드에 정확히 한장씩 찍힌다는 보장이 있을까? 지금 한쪽 쓰레드에서 알람시계처럼 시그널을 계속 던지고, 이걸 메인 쓰레드에서 처리하는데 만약 뭔가 일이 복잡해져서 110밀리세컨드에 그림을 저장했다면? 그리고 이런게 연속된다면 동영상의 길이가 실제 캡쳐시간과 틀려질테니 말이다. 아직 인코딩도 하기 전에 이런 생각을 하는 것이 조금은 이상하기는 하지만... 일단 만들어놓고 테스트를 해봐야 하나?



wordfile_1.txt