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)).
나는 확실하지 않다 실패하거나 수정하는 방법을 이유. 이 코드 블록이 주 스레드의 단추의 일부일 때 문제가 없었지만 스레드가 별도로 실패 할 때 문제가 발생하지 않았습니다.
이 문제를 해결하는 방법에 대한 도움을 주시면 감사하겠습니다.
일부 COM 개체는 스레드 선호도를가집니다. 어쩌면 그 문서가 그것에 대해 뭔가를 말하고 있을지도 모른다. – usr
문제는'play.filesink = (IFileSinkFilter) play.file;'줄에 있습니다.'.file'에 의해 참조 된 객체는 intefrace를 구현하지 않습니다. 오류 메시지는 정확하게 이것을 알려줍니다. –