Microsoft MVP성태의 닷넷 이야기
directShow RenderFile 관련 재질문드립니다 [링크 복사], [링크+제목 복사],
조회: 11536
글쓴 사람
정도현 (7hvrches at naver.com)
홈페이지
첨부 파일

//새로운 필터그래프 대응
            pGraphBuilder = (IGraphBuilder)new FilterGraph();
            //필터그래프에 콘트롤 붙이기
            pMediaControl = (IMediaControl)pGraphBuilder;
            
            //윈도우 붙이기
            pVideoWindow = (IVideoWindow)pGraphBuilder;

            //콘트롤에 동영상 읽어오기
            pMediaControl.RenderFile(filename);

            //판넬에서 재생하기
            pVideoWindow.put_Owner(hWin.Handle);
            pVideoWindow.put_WindowStyle(WindowStyle.Child | WindowStyle.ClipSiblings);
            Rectangle rect = panel1.ClientRectangle;
            pVideoWindow.SetWindowPosition(0, 0, rect.Right, rect.Bottom);

위 내용을 클릭 이벤트에 붙여서 프로젝트를 생성해 최초 버튼 한번 클릭시엔 패널에 영상이 정상 출력 되지만 버튼을 두번(연속으로 누르든 시간 텀 줘서 누르든) 누르면 그때부턴 프로그램을 다시 실행해도 버튼을 두번 클릭해야 합니다 다른 사람들의 예제들도 시도를 해봤으나 동일한 결과입니다.








[최초 등록일: ]
[최종 수정일: 1/8/2021]


비밀번호

댓글 작성자
 



2021-01-08 08시08분
처음엔 이게 무슨 말장난같은 질문인가 싶었는데, ^^; 실제로 버튼 2번 눌러 재생하고 나서는 이후로 계속 그런 현상이 발생하는군요. x64로 빌드했다가 그런 현상이 발생해서 x86으로 빌드해봤는데 한 번에 영상이 재생되었고, 그 상태에서도 2번 눌러 재생하면 이후로 다시 2번 눌러야 재생(즉, RenderFile을 두 번 호출)하는 현상이 나옵니다.

그런데, C++로 해당 코드를 작성해도 동일하게 문제가 발생하는 걸로 봐서 닷넷 및 DirectShowLib 문제는 아닌 듯합니다. 게다가 더욱 당황스러운 것은, 재부팅하고 나서도 여전히 ^^; 그 현상이 나옵니다. 따라서 저도 이에 대한 해법을 어떻게 찾을 수가 없군요. ^^;

단지, Graph Editor(graphedt.exe)로 재생한 경우에는 정상적으로 한 번에 재생이 됩니다. 그래서 한 번 시도해 볼만한 것은, 자동으로 Input/Output 필터를 설정하는 방식 말고 직접 수작업으로 Filter graph를 구성해 재생하면 그런 현상이 없어질 듯합니다. 혹시나 그렇게 해보시면 결과 좀 알려주세요.
정성태
2021-01-09 09시42분
좀 더 테스트를 해보면, Hyper-V VPC에서는 정상적으로 작동하고, 제가 가진 Surface Pro 6에서도 정상 동작합니다. (모두 Windows 10에서 테스트한 것입니다.)

뭔가, DirectShow의 문제라기보다는 어떤 환경적인 면에서 오는 것 같은데 그 공통점을 먼저 발견하는 것이 좋겠습니다. 문제가 정말 애매하네요. ^^;
정성태
2021-01-11 10시22분
[정도현] 안녕하세요 작성자입니다
알아보니 메모리 해제 관련 문제가 있었던 것 같습니다
아직 전문 지식이 없는지라 자세히 설명은 못 드리겠으나 Marshal.ReleaseComObject로 해당 그래프나 컨트롤들을 전부 해제 작업을 해주시면 정상작동합니다.

본 사이트 강의에서는 버튼 같은 컨트롤로 입력을 받지 않아 문제는 없으나 버튼 처리를 하면 문제가 생기더군요
 private void play_Click(object sender, EventArgs e)
        {
            OnClosed(); // 그래프 해제
            OnStart(); // 재생
        }

대충 요런 느낌으로 처리를 하면 잘 될겁니다.
근데 따로 궁금한 것이 있는데 위에는 메모리 해제라고 작성을 했지만 컴퓨터를 부팅하면 다 초기화될텐데 그럼 메모리는 아닐려나요??
ReleaseComObject() 메서드는 "지정된 COM 개체와 연결된(지정된) RCW의 참조 횟수를 감소시킨다." 라고 설명이 되어 있는데 메모리를 뜻 하는건지 아니면 다른 뭔가 있는건지 궁금합니다..
[guest]
2021-01-11 11시06분
어쨌든 문제가 사라졌다니 다행입니다. 근데, 제 PC에서는 여전히 그와 상관없이 두 번 클릭해야 재생이 됩니다. 재미있군요. ^^

참고로, ReleaseComObject로 해결될 문제였다면 애당초 프로세스 종료 시에 자원 해제가 모두 되므로 그다음 실행 시 한 번 클릭으로 재생이 되었어야 합니다. 단지, out-of-process로 무언가 비디오 재생에 관련된 별도 프로세스가 있다면 그렇게 안 될 수도 있는데 그렇다고 해도 일정 시간 연결이 끊겼으면 마찬가지로 자원 해제 등의 절차를 밟는 것이 일반적이기 때문에... 암튼 설명이 안 되는 현상이군요.

ReleaseComObject는 사실 약속에 불과합니다. 일반적으로는 참조 횟수가 0일 때 (inproc이든 out-of-proc이든 상관없이) COM Server 측에서 자원 해제를 하는 것이 정상이지만, 그건 구현하는 측 나름이니까 언제나 100%라고 볼 수는 없습니다. (그렇긴 해도 마이크로소프트가 만든 거라면 (버그가 아니었을 때) 100% 해제될 것입니다.)
정성태
2021-01-11 02시10분
[정도현] 그렇군요! 상세한 설명 감사합니다~
[guest]

... 76  77  78  79  [80]  81  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
493안연준10/25/200613980스마트클라이언트 배포에서 Config 내용이 이해가 안되요
494안연준10/25/200612137    답변글 [답변]: 스마트클라이언트 배포에서 Config 내용이 이해가 안되요 [2]
489안연준10/23/200613310스마트 클라이언트 배포시 문제점
491안연준10/24/200613992    답변글 [답변]: 스마트 클라이언트 배포시 문제점 [2]
492안연준10/24/200612983        답변글 [답변]: [답변]: 스마트 클라이언트 배포시 문제점
488안연준10/23/200612774닷넷 프레임워크 때문에 일어난 어의없는 상황 [2]
484서민균10/20/200612878스마트 클라이언트 인쇄질문 올린 사람입니다.
486정성태10/22/200614119    답변글 [답변]: 스마트 클라이언트 인쇄질문 올린 사람입니다.
483guest10/19/200613145asp.net 에서 Com+ 등록된 dll 의 차이점이 무엇인지요?
485정성태10/22/200613781    답변글 [답변]: asp.net 에서 Com+ 등록된 dll 의 차이점이 무엇인지요?
490deve...10/23/200616959        답변글 [답변]: [답변]: asp.net 에서 Com+ 등록된 dll 의 차이점이 무엇인지요? [1]
478서민균10/17/200614926스마트 클라이언트로 만든 컴포넌트가 인쇄가 안되요.....ㅜㅜ [5]
477sagi...10/15/200614192bho 와 mfc 메시지 전송 관련 질문입니다.
479정성태10/17/200616005    답변글 [답변]: bho 와 mfc 메시지 전송 관련 질문입니다.
480sagi...10/17/200613945        답변글 [답변]: 감사합니다. [1]
481sagi...10/19/200613896            답변글 [답변]: 죄송합니다 .. 한가지 더 여쭤 볼께요
482정성태10/19/200613429                답변글 [답변]: [답변]: 죄송합니다 .. 한가지 더 여쭤 볼께요
496sagi...10/27/200614067                    답변글 [답변]: 감사드립니다.
476문태정10/11/200616422FarPointSpread로 출력 시 시트 암호설정문제 [1]
474임경훈10/9/200616943세션값이 유지가 안되는데요? [1]
470쿠리마9/29/200613213고수님들께 질문 올립니다. (C# COM Server에서 C++ Client에게 string맴버 포함한 구조체 배열 넘기기)파일 다운로드1
473정성태10/5/200615291    답변글 [답변]: 고수님들께 질문 올립니다. (C# COM Server에서 C++ Client에게 string맴버 포함한 구조체 배열 넘기기) [3]파일 다운로드1
469이방은9/29/200612918질문이 있어요.. [2]
466이승기9/25/200612707Attribute를 이용한 COM 구현 시 interface의 상속 [1]
467이승기9/27/200612285    답변글 [답변]: Attribute를 이용한 COM 구현 시 interface의 상속
4659/23/200611814vb.net에서 c에서 보내는 Post메쎄지를 잡아서 처리할수 없을가요? [1]
... 76  77  78  79  [80]  81  82  83  84  85  86  87  88  89  90  ...