Microsoft MVP성태의 닷넷 이야기
directShow RenderFile 관련 재질문드립니다 [링크 복사], [링크+제목 복사]
조회: 2588
글쓴 사람
정도현 (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의 참조 횟수를 감소시킨다." 라고 설명이 되어 있는데 메모리를 뜻 하는건지 아니면 다른 뭔가 있는건지 궁금합니다..
[손님]
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분
[정도현] 그렇군요! 상세한 설명 감사합니다~
[손님]

1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5519리얼킴6/19/20212056.net framwork 4.0 에서 4.8로 꼭 가야할까요?? [1]
5518한예지6/18/20212495ArrayList, IList에 대해 질문 있습니다. [3]
5517wu...6/18/20212856winform에서 Button 활성화, 비활성화 [4]
5516ocm6/15/20212292mips 어셈블리 연산 다시 질문드려요 (첨부파일 갱신됨) [2]파일 다운로드1
5515ocm6/14/20212614mips 어셈블리 연산 [6]파일 다운로드1
5514jo...6/11/20212699GethashCode와 String대한 질문 [2]
5513la...6/11/20212653C# Winform 에서 Label에 동일한 Color를 넣었을 때 처리방법이 궁금합니다. [2]
55126/11/20213126xlwings 가 실행조차 되지 않습니다. ㅠㅠ [7]
5511Sy...6/9/20212820User Control에 string array 속성 추가하는 방법 [4]
5510jay6/8/20212416string 문자열에 쌍따옴표(")를 넣고 싶습니다. [1]파일 다운로드1
5509한예지6/3/20212305ExeccuteNonQuery 질문있습니다! [2]
5508최재남6/3/20212712마우스 이벤트 관련 질문 좀 드리겠습니다. [6]
5507한예6/2/20212293static과 스택오버플로우 질문있습니다. [5]파일 다운로드1
5506이창석6/1/20213447센서의 값을 받아서 PC를 통해 모니터링 하는 것을 만들고 있습니다. [1]
5505kss5/31/20212304.net5에서 소멸자가 어떻게 바뀐건가요? [1]
5503xi...5/24/20212399xingapinet 에 수정 요청 부탁 드립니다. [1]
5501한예지5/23/20212402IProgress 사용법이 궁금합니다. [2]
5500한예ㅈ5/23/20212912비동기 코드 흐름 질문있습니다. [3]
5498곰장어5/21/20212249List에 static 변수를 추가했을때의 궁금증 [3]파일 다운로드1
5497지평선5/20/20212816윈도우 배율을 알 수 있을까요? [1]
5496cs...5/20/20212161C# 8.0 질문입니다. [2]파일 다운로드6
5495Na...5/13/20212043객체를 생성과 동시에 초기화 하는 방법 [1]
5494지예...5/13/20212155비동기 코드 흐름이 궁금합니다! [2]
5493xi...5/6/20212254xing api XQCSPAT00600 질문입니다 [4]파일 다운로드1
5492한예지5/5/20212337FromCurrentSynchronizationContext 관련 코드 질문있습니다! [2]
5491조우성5/4/20215292WinForm과 WPF의 성능차이 비교한 자료가 있을까요? [4]
1  2  3  4  5  6  7  8  9  10  11  [12]  13  14  15  ...