현재 TV 캡처 카드 구성을위한 DirectShow 기반 응용 프로그램에서 작업 중입니다. 이 카드는 대부분의 캡처 카드로 작동하기 때문에 가능한 한 포괄적이어야합니다.핀을 연결할 수 있는지 확인하는 방법은 무엇입니까?
대부분의 캡처 카드 제조업체는 구성 방법이 다르기 때문에 내 응용 프로그램은 관련 필터와 핀을 분석하려고합니다. 하나의 공통점은 특정 핀을 렌더러에 직접 연결할 수 있는지 또는 먼저 인코더/멀티플렉서가 필요한지 여부를 확인하는 것입니다.
참고 : VB.net에서는 DirectShow .NET 라이브러리를 사용하고 있지만 C# 또는 C++로 대답 할 수 있습니다.
는Private Function Check1(filter As IBaseFilter, type As AMMediaType) As Boolean
Dim enumPins As IEnumPins = Nothing
If filter.EnumPins(enumPins) = 0 Then
Dim pin(0) As IPin
While (enumPins.Next(1, pin, Nothing) = 0)
Dim accepted As Boolean = (pin(0).QueryAccept(type) = 0)
Marshal.ReleaseComObject(pin(0))
If accepted Then Return True
End While
End If
Return False
End Function
이 기능은 항상 False
를 반환 출력 핀은 다음과 같은 기능을 특정 AMMediaType
을 받아들이는 경우
QueryAccept
은 항상
-2147467259
을 반환한다는 것을 알게되었습니다.
The documentation에는 이러한 반환 값이 언급되어 있지 않습니다. 좀 더 조사한 후에, 새로운 MediaType을 제안하는 데
QueryAccept
이 사용됨을 알았습니다. 따라서 QueryAccept이 호출 핀이 이미 연결되어있을 때만 작동한다고 가정합니다.
Read more here. 특정
AMMediaType
가 다음 함수를 사용하여 출력 핀 바람직한 경우
내가 확인할 수
Private Function Check2(filter As IBaseFilter, type As AMMediaType) As Boolean
Dim enumPins As IEnumPins = Nothing
If filter.EnumPins(enumPins) = 0 Then
Dim pin(0) As IPin
While (enumPins.Next(1, pin, Nothing) = 0)
Dim enumMediaTypes As IEnumMediaTypes = Nothing
If pin(0).EnumMediaTypes(enumMediaTypes) = 0 Then
Dim mediaType(0) As AMMediaType
While (enumMediaTypes.Next(1, mediaType, Nothing) = 0)
Dim equals As Boolean = (type Is Nothing OrElse
(type.majorType = Nothing OrElse mediaType(0).majorType = type.majorType) AndAlso
(type.subType = Nothing OrElse mediaType(0).subType = type.subType) AndAlso
(type.formatType = Nothing OrElse mediaType(0).formatType = type.formatType))
DsUtils.FreeAMMediaType(mediaType(0))
If equals Then
Return True
End If
End While
End If
End While
End If
Return False
End Function
EnumMediaTypes
을 열거하여, I는 는 바람직한로서 특정 AMMediaType
이 표시되는지를 결정할 수있다. 그러나 이것은 연결이 가능하다는 것을 보장하지 않습니다. 종종이 열거 형에 포함되지 않지만 연결할 수있는 형식이 있습니다. 때때로이 열거 형은 비어 있습니다.
내가 찾고있는 것은 필터를 다른 필터에 직접 연결할 수 있는지 또는 인코더/멀티플렉서에 먼저 연결해야 하는지를 결정하는 방법입니다. 누군가가 이것을 어떻게 달성 할 수 있는지 알고 있습니까?
참고 : 단순히 필터를 연결하고 반환 값을 사용하여 성공했는지 여부를 확인하는 것은 옵션이 아닙니다. 내 경험상 ICaptureGraphBuilder::RenderStream은 연결이없는 경우 종종 S_OK
을 반환합니다. 예를 들어, 아날로그 비디오 핀이없는 동안 MediaType.AnalogVideo
을 사용해보십시오.
핀이 직접 연결될 수 있는지 확인하려면 렌더러에서 소스 필터와 입력 핀의 출력 핀을 가져 와서 [IPin :: Connect] (http://msdn.microsoft .com/de-de/library/windows/desktop/dd390420 (v = vs.85) .aspx). RGB24 또는 YUY2 또는 NV12와 같은 원시 비디오 유형 인 경우 소스는 비디오 렌더에 직접 연결 만 할 수 있습니다. 그러나 종종 그들 사이에 디코더가 필요합니다. TV 카드의 경우 MPEG2 또는 h264 디코더가됩니다. – CPlusSharp
@CPlusSharp : IPin :: Connect를 시도했지만 어떤 경우에는 예상대로 작동하지 않았습니다. 그러나 이것이 IGraphBuilder :: Connect를 사용하게 만들었습니다. 내 대답을 보라. –