2012-03-30 6 views
0

webcam 비디오를 수신하고 directshowlib-2005.dll을 사용하여 C# 응용 프로그램에 표시하는 프로그램이 있습니다.InvalidCastException 도움이 필요하십니까

내 응용 프로그램에서는 GMFBridge를 사용하여 필요할 때마다 비디오를 스트리밍하고 녹화 할 수 있습니다.

이 프로그램에서 내 응용 프로그램 컨트롤은 주 루프에 있고 비디오 스트리밍은 별도 스레드에서 수행됩니다. 나는 버튼을 눌러 사용하여 메인 스레드에서 현재 스트리밍 동영상을 녹화하거나 옵션이 다음

play.filesink = (IFileSinkFilter)play.file; 
play.filesink.SetFileName(GetDateTimeString("Video") + ".avi", null); 
IMediaControl Second_Graph = play.s_mediaCtrl; 
Second_Graph.Run(); 
play.bridge.BridgeGraphs(play.BridgeSink, play.sourceFilter); 

는 플레이 클래스는 RGB로 YUV에서 들어오는 비디오를 변환하는 클래스입니다 및 설정 모두 스트리밍 및 레코딩 그래프

파일은 필터 파일 작성자입니다. 두 번째 줄에서 볼 수 있듯이 파일 쓰기를 IFileSinkFilter로 변환하여 이름을 붙일 수 있습니다. 그런 다음 미디어 컨트롤러를 만들고 그래프를 실행하고 스트리밍 및 레코딩 그래프를 연결합니다.

입력 한대로 나중의 날짜와 시간에 향후 녹음을 설정할 수있는 옵션도 있습니다. 이후 녹음은 입력되어 녹음이 발생할 때를 기반으로 정렬 된 정적 목록에 저장됩니다. 녹음에 대한 시간이 시작하는 경우가 나는 위와 같은 코드를 실행하는 경우 스트리밍 실 내부, 내가 볼 수있는 목록을 폴링 :

play.filesink = (IFileSinkFilter)play.file; 
play.filesink.SetFileName(GetDateTimeString("Video") + ".avi", null); 
IMediaControl Second_Graph = play.s_mediaCtrl; 
Second_Graph.Run(); 
play.bridge.BridgeGraphs(play.BridgeSink, play.sourceFilter); 

이 스레드 내부에서 발생하여 녹화가있을 때, 응용 프로그램이 첫 번째 및/또는 두 번째 줄에서 충돌합니다. 오류는 동일하고 첫 번째 줄과 두 번째 줄에있는 두 호출 모두에서 IFileSinkFilter가 무엇인지 모릅니다. 충돌합니다. 오류를 수신

은 다음과 같습니다

Unable to cast COM object of type 'System.__ComObject' to interface type 'DirectShowLib.IFileSinkFilter'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{A2104830-7C70-11CF-8BCE-00AA00A3F1A6}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)). 

나는 확실하지 않다 실패하거나 수정하는 방법을 이유. 이 코드 블록이 주 스레드의 단추의 일부일 때 문제가 없었지만 스레드가 별도로 실패 할 때 문제가 발생하지 않았습니다.

이 문제를 해결하는 방법에 대한 도움을 주시면 감사하겠습니다.

+0

일부 COM 개체는 스레드 선호도를가집니다. 어쩌면 그 문서가 그것에 대해 뭔가를 말하고 있을지도 모른다. – usr

+0

문제는'play.filesink = (IFileSinkFilter) play.file;'줄에 있습니다.'.file'에 의해 참조 된 객체는 intefrace를 구현하지 않습니다. 오류 메시지는 정확하게 이것을 알려줍니다. –

답변

1

한 스레드에서 그래프를 만들고 COM 스레드 유사성 문제로 인해 다른 스레드에서이 그래프를 제어하는 ​​데 문제가 있습니다.

단추 처리기에서 코드 블록을 사용하면 모든 스레드가 동일한 스레드에서 실행 되었기 때문에 코드 처리기가 작동했습니다.

문제를 처리하는 대신 처리 스레드에서 그래프를 재생하는 대신 사용자 정의 된 Windows 메시지를 보내고 실제로 그래프를 재생하는 주 스레드에서 메시지를 처리하십시오.

이렇게하면 재생을 그래프를 만든 동일한 스레드에서 수행 할 수 있습니다.