Microsoft MVP성태의 닷넷 이야기
directShow RenderFile 관련 재질문드립니다 [링크 복사], [링크+제목 복사]
조회: 5179
글쓴 사람
정도현 (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]

... 16  17  18  19  20  21  22  23  24  25  26  27  28  [29]  30  ...
NoWriterDateCnt.TitleFile(s)
5151이대희5/3/20197347C# 7.3으로 개정판 출간 계획이 있으신가요? [1]
5150김이현5/2/20198733C# 딕셔너리 생성에 대해 질문드립니다. [1]
5149민성5/1/20196974ftp 이미지 업로드중 [1]
5148wpf질문4/30/20197348특정 사이트를 wpf에서 popup을 항상 허용하게 할려면 어떻게 해야할까요? [5]
5147민성4/30/20196345wpf에서 작업관리자를 띠울려면 어떻게 해야 하나요? [1]
5146불파겐4/25/20196426하나의 필드를 여러 스레드에서 읽어갈 때 스레드 동기화를 하지 않으면 문제가 생길까요? [2]
5145e구름4/17/20199387Properties.Setting.Default값에 대해 질문드립니다. [2]
5144성태님 ...4/17/20196581질문하시기 전에 10000 페이지 오류 납니다. [1]
5143헌이4/16/20197513윈도우 작업표시줄에 프로그램 띄우기 [2]파일 다운로드1
5142cab2...4/9/201913075C#으로 만든 DLL 배포하기 [10]
5141하늘사랑4/5/20197965Axinterop 래퍼에 관해서 질문드립니다. [7]
5140게스트4/1/20197602안녕하세요. 초보 개발자입니다. SD리더기에서 SD카드를 꽂으면 발생하는 이벤트 문의 [2]
5139김이현3/28/201910809C#에서 CRON 같은 스케줄러를 사용하려면 어떻게 해야 하나요? [3]
5138김지원3/22/20198459유니티 쉐이더에서 오로지 포워드 애드 패스로만 만들 수 있을까요? [1]
5137세퉁3/22/201910389wpf 쓰레드에 대해 질문 있습니다. [4]
5136KGY3/13/20197039안녕하세요 닷넷코어 콘솔 프로그램 관련 질문입니다. [1]
5135러쎌3/13/20197496ASP.NET 공부 관련해서 문의를 드립니다. [1]
5134이정호3/12/20196902SampleProfiler 예제를 이용한 Class 객체의 접근 문의 [1]파일 다운로드1
5133ㅇㅇ3/12/20197781멀티코어사용 방법에 궁금한것이 있습니다. [3]
5132존기미3/3/20198034Physical Disk Access문의 [1]
5131강용규2/25/20197134c# 개발자입니다. 타이머 질문드립니다. [1]
5130노인코래방2/25/201910651C#에서 가장 좋은 성능을 보이는 파일 읽고 쓰는 방법이 무엇인가요? [2]
5129진우2/23/201910107닷넷 32비트 기반에서 메모리 부족으로 프로그램이 죽는경우 문의 [2]
5128게스트2/23/20197797안녕하세요. 초보개발자입니다. [3]파일 다운로드1
5127c#2/20/20196830책에 예제 문의드립니다. [2]
5125게스트2/19/20196918delegate를 활용한 event 를 적절히 불러오고 싶습니다. [2]
... 16  17  18  19  20  21  22  23  24  25  26  27  28  [29]  30  ...