C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[948] DSPack, TDSVideoWindowEx2 영상 출력 다른 폼으로 전환하기(FullScreen과 비슷)
박영목.월천 [gsbsoft] 11121 읽음    2010-01-05 07:04
* 추신:  DSPack은 될 수만 있으면 사용하시지 않기를 바랍니다.  상당히 불안정합니다. 연구용으로 참고만 하시던지...
아래 글은 이전에 적은 것이기 때문에 그대로 놓아둡니다.


DSPack, TDSVideoWindowEx2 영상 출력 다른 폼으로 전환하기(FullScreen과 비슷)

간단히 동영상 Play할 일이 있어서 하얀까마귀에게 물어니 그냥 MSWindowPlayer 사용해라

그래서 MSWindowPlayer ocx로 돌렸습니다. 몇 달 잘 돌아갔습니다.


그런데 시일이 좀 지나고 아래와 같은 이상한 Error 발생한다는 것입니다.

Access violation at address 000000 in module 'wmp.dll'. Read of address 0000000

일어나는 것도 규칙성도 없고 어떤 PC 잘 되고.. 어떤 PC 안되고... Error 한번 나고 잘되고...

그래서 네이버 찾아보니... 의외로 이런 Error 잘 일어난다고 글들이 있더군요...

그래서 Google를 찾아보니... 생각이 안나네... 음... 대충 민감한다. 바이러스로 간주한다.

그러면 시스템 차원에서... Error를 발생시킨다. 약간 이상하거나 수상하면 Error를 낸다는 것...

그래서 민규 동생(Delphi)에게 Error가 난다 하니... 자기는 DirectShow로 바로 사용한다.

헤드는 DSPack 것을 사용한다. 간단히 할 때는 그냥 DSPack 그냥 사용하면 됩니다.

그래서 그냥 사용하기로 했다. CBuilder에 설치하는 과정이 어디에 있던데... 약간 복잡하지요...

여하튼 TVideoWindow에서 잘 돌아갔습니다. ㅋㅋㅋ, 창을 작은 것 큰 것 2개 상용하는 데...

FilterGraph 하나로 VideoWindow 2개를 못사용하더군요... 되면 좋겠더만... 그래서 좀 해봐도...

잘 안되네요... 그래서 FilterGraph와 VideoWindow를 각각 2개씩 사용해서... 돌렸습니다.

잘된다. ㅋㅋㅋ... 그런데 다 마무리한 날... 다른 동영상을 돌렸습니다. 바로 PC 다운... 헉...

갑자기 무서워졌습니다. 뭐야... VideoWindows에 버그가 있는 모양입니다. 그래서...

안되겠다. 시간이 걸리더라도 나도 직접 할까... 저번에 DirectShow할 것 같으면 하려고 책도

사둔 것 있고 한번 보았는데 따라하면 하겠더군요... 그런데 또 보니 TDSVideoWindowEx2가

DSPack에 있더군요... 요놈은 뭐지... 그래서 VideoWindow를 이것으로 바꾸어 돌렸습니다.

어... Error가 안나네... 그러면 이것으로 하자... 그런데... FilterGraph와 TDSVideoWindowEx2를

각각 2개씩 사용하니 영상 하나는 비율이 깨어지더군요... 헉... 왜 그렇지...?

그래서 동영상 파일을 각각 다른 것으로 돌려보았습니다. 정상적으로 돌아가더군요...

한 동영상 파일을 동시에 돌리는(작은 화면, 큰 화면) 문제가 있더군요... 이것도 불안하다.

그래서 FilterGraph와 TDSVideoWindowEx2를 하나만 사용하고 보여주는 화면을 왔다갔다 하자...

그런데 있게 쉽지 않더군요... 그래서... 작은 화면 보여주다가 큰 화면으로 보여줄 때는...

작은 화면의 현재 Position을 구하고 그리고 FilterGraph 닫고 다시 RenderFile로 파일

다시 열고 Position 위치로 이동... 또 Play... 내가 생각해도 참 한심하다. 이게 뭐고...

안되겠다. 화면이 전화되도록 하자... 영상을 2개 돌리는 것도 부하가 크고...

FullScreen 기능도 있는 것 보니... 쉽게 되겠구나... 그래서 소스를 보며 찾아보았습니다.

그래서 이리저리 찾던 중... 아~~~ 요것이군.... 간단함...

void __fastcall TMainForm::BtnChangeClick(TObject *Sender)
{
  if( frmVideoForm->FilterGraph->Active==FALSE ) frmVideoForm->FilterGraph->Active=TRUE;

  if( BtnChange->Tag==0 )
  {
    frmVideoForm->Visible = false;

    frmVideoForm->VideoWindow->Parent = Panel1;

    frmVideoForm->VideoWindow->Left   = 0;
    frmVideoForm->VideoWindow->Top    = 0;
    frmVideoForm->VideoWindow->Width  = 182;
    frmVideoForm->VideoWindow->Height = 129;

    BtnChange->Tag=1;
  }
  else
  {
    frmVideoForm->Visible = true;

    frmVideoForm->VideoWindow->Parent = frmVideoForm->Panel1;
    frmVideoForm->VideoWindow->Left   = 0;
    frmVideoForm->VideoWindow->Top    = 0;
    frmVideoForm->VideoWindow->Width  = frmVideoForm->Panel1->Width;
    frmVideoForm->VideoWindow->Height = frmVideoForm->Panel1->Height;

    BtnChange->Tag=0;
  }

  frmVideoForm->VideoWindow->RefreshVideoWindow();
}



위에 처럼 하고 frmVideoForm->VideoWindow->RefreshVideoWindow(); 아주 잘... ㅋㅋㅋ

전환됩니다. 그런데... DSPack에서 RefreshVideoWindow();은 protected로 선언되어져 있습니다.

상속을 해야 사용할 수 있겠군... 귀찮지요... 그래서 이 놈을 public으로 옮겨 두고 DSPack를 Compile

합니다. 컴파일 하니... DSPack이 빌더에서 사라지는 군요... DSPackDesign_BCB6.bpk 다시 설치...

하면 됩니다. 아.. DSPack.hpp 이놈을 다른 곳에 복사를 해서 그 놈을 사용한다면 그 방에도 복사해야 한니다.

저는 D:\CurProject\CBuilder\Component\DSPACK234\src\DSPack\bcb 이것에 넣어 사용하고

있군요. 이것도 빌더에서 DSPack 사용하는 웹페이지를 보고 따라했는데... 여하튼 저는 이 방에 복사를 해야

합니다. 다른 분들은 자신에 맞게... 다 고수들이니 잘 하실 것이고... ㅋㅋㅋ

그리고 찾다가 보니... 델파이에서 DSPack 헤더만 사용해서 직접구현하는 것도 있더군요... 네이버에서 찾으니

있더군요... 주소는? 그러나... 쉽게 찾을 것입니다. DSPack로 검색하고 블러거에서 몇 페이지 안 가서

있더군요... 그런데... 이 방식이 더 좋다고 해도 검정하고 Test하려면 시간이 필요하니... 간단히 이 기능이

필요하다면.. 저처럼 사용하시기 바랍니다.... 이제 잘까... 아직 잠이 안오는데... 뭘하지....

아참 그리고 TDSVideoWindowEx2를 덩치가 큰 프로그램의 어느 폼에 넣어면 프로그램이 뜨지 못하고...

다운되더군요... 원인은 정확하게 말하기 힘들고... 이럴 경우는 TDSVideoWindowEx2을 메인 위도우에...

두면 아무 이상없이 돌아갑니다. 뭔가 섞여서... 아니면... 초기화에 따른 어떤 버그....

그냥 덩치가 작은 프로그램은 어디에 있어도 잘 돌아가는 군요....


* 비디오카드 하드웨어 가속을 해야 화면에 나타나는 군요... DShow라 그런 모양입니다.


서울은 눈이 많이 와서 크레브님 차도 부서졌다고 하는 데...

부산은 눈 안오나? 아~~ 눈이 보고 싶다.
장성호 [nasilso]   2010-01-05 12:00 X
내용에서 코드부분을  Pre태크로  블럭 처리 했습니다.
박영목.월천 [gsbsoft]   2010-01-05 13:26 X
장성호님 감사요^^  Pre태그라...  이것 어떻게 하는지... 배워야겠군... ^^
장성호 [nasilso]   2010-01-05 14:43 X
입력화면에 보면
제목 바로 밑에 C++,Pas,Java,C#,PHP,Text 버튼이 있습니다.

해당되는 소스 버튼 클릭하시구

테그 사이에 소스나 텍스트 입력하시면 됩니다.
망치 [mangchy]   2010-01-12 16:46 X
ㅎㅎ 이리저리... 노하우(?) 공개해주셔서...감사! 잘보고 갑니다.
Nibble [gameover]   2010-01-26 14:42 X
http://telnet.or.kr/directx/htm/infinitepinteefilter.htm
http://telnet.or.kr/directx/htm/samplegrabberfilter.htm

전자는 출력핀을 늘리는 방식이고, 후자는 아예 필터그래프를 흘러가는 샘플(영상)을 잡아내는 방식입니다.
수십개의 스크린도 간단히 만들 순 있습니다. (CPU는 고생좀 하겠지만)
장성호 [nasilso]   2010-01-28 14:04 X
Nibble님 좋은 자료링크 감사합니다.
시간될때 Directshow공부좀 하려는데.. 영 시간이 안나네요..

+ -

관련 글 리스트
948 DSPack, TDSVideoWindowEx2 영상 출력 다른 폼으로 전환하기(FullScreen과 비슷) 박영목.월천 11121 2010/01/05
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.