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

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




donaricano-btn



[최초 등록일: ]
[최종 수정일: 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)
5263정환맨11/17/20191525Task관련 질문입니다 [3]
5262닷린이11/14/20191859Dispatcher 와 synchronizationcontext의 관계가 궁금합니다. [6]
5260방문자11/13/20191609안녕하세요 도움받고 싶습니다 [1]
5259ming11/13/20191584string타입 파라메터로 넘길때 메모리 내부가 궁금합니다. [3]
5258C#초보11/13/20191930DCOM COM+ 등록 관련 문의드립니다. [7]
5257C#초보11/9/20191518파일 저장 방법에 대해 조언 부탁드립니다. [3]
5256세퉁11/8/20191427안녕하세요~ 질문은 아닙니다만.. [1]
5255C#초보11/6/20191705중첩 딕셔너리를 어떻게 만들 수 있을까요? [2]
5252김동수11/4/20191422Windows 10 로그인 ( Credential Provider ) 문의드립니다. [1]
5251kss11/1/20191575c#문법질문입니다. [1]
5250이대희10/31/20191741시작하세요 C# 7.3 프로그래밍 책이 절판이네요. [1]
5249황태관10/24/20191875c# 폼안에 특정 프로그램 불러오기.. [1]파일 다운로드1
5248황태관10/23/20192072C언어로 만든 dll 를 참조해서 c#으로 만들려면.. [3]
5245민성10/21/20191587안녕하세요 Ui 스레드 접근에 대해서 질문드리도록 하겠습니다. [1]
5244hbline10/20/20191530두개의 쓰레드에서 하나의 Queue 리스트 사용시 질문드립니다. [2]
5243최선호10/18/20191470Screen Capture 와.. Overlay 질문 좀 드릴게요 ㅠ.ㅠ ( 장문 주의..... ) [2]
5241C#초보10/16/20192296C# USB 통신 구현 관련 질문 드립니다! [1]
5240김동규10/15/20191689런타임 시 Encoding.Default를 UTF-8로 설정할 수 있을까요? [3]
5239밤톨이10/13/20191367시놀리지 DSM에 asp.net core 2 웹서버 구축이 가능한가요? [1]
5238권석헌10/2/20191634C# - C++ 간의 Memorymapped file 관련 Data 질문좀 드립니다 선생님 [1]
5237유호성10/1/20191403사용자 정의 컨트롤 VS IDE에서만 Exception 발생 [2]
5234koko9/25/20192159안녕하세요. 64bit WPF -> 32bit C++ DLL Import사용 문의 드립니다. [3]
5232fox3699/24/20191431C# Memorymappedfile 재 업로드 드립니다.(실행순서 및 질문내용 정리) [7]파일 다운로드1
5231fox3699/24/20191288C# 메모리맵드파일 관련 질문드립니다. 최소한의 재현가능코드 첨부후 재질문 드립니다. [2]파일 다운로드1
5230질문9/23/20191481C++ 로 만든 dll 을 C#에서 사용할 때 질문 [2]
5229fox3699/23/20191956C# 메모리맵드파일 관련 질문드립니다. [2]
1  2  3  4  5  6  7  8  9  [10]  11  12  13  14  15  ...