2014-01-06 11 views
2

미디어 기초를 사용하여 비디오를 인코딩하려면 SinkWriter를 사용하고 있습니다.SinkWriter 또는 ICodecAPI 또는 IMFTransform에서 인코더 이름 가져 오기

SinkWriter를 초기화 한 후에는 사용하는 기본 인코더를 얻고 이름을 인쇄하여 인코더가 사용하는 것을 볼 수 있습니다. (필자의 경우 인코더는 아마도 MF에 포함 된 H.264 Video Encoder 일 것입니다.)

(pSinkWriter->GetServiceForStream을 사용하여) 인코더의 ICodecAPI 및 IMFTransform 인터페이스에 대한 참조를 얻을 수 있지만 이러한 인터페이스를 사용하여 인코더의 이름을 얻는 방법을 모르겠습니다.

누구든지 싱크 라이저에서 인코더의 이름을 얻는 방법을 알고 있습니까? 또는 ICodecAPI 또는 IMFTransform 인터페이스에서?

+0

아무도 아직 이에 대한 응답을 찾지 못했습니까? 이것은 매우 기본적인 것으로 보이지만 적어도 GUID는 도움이 될 것입니다. –

답변

0

IMFTransform이 있으면 인코더의 이름이 없습니다.

변환 출력 유형을 확인하고 잘 알려진 GUID와 비교하여 부호기를 식별하는 옵션 중 하나는 특히 H264 인코더 MFT가있는 MFVideoFormat_H264의 하위 유형이 있어야합니다.

또 다른 옵션은 인코더의 CLSID에 도달하는 것입니다 (당신이 그것을 얻을하지 않습니다 IMFTransform,하지만 당신은 그렇지 않으면 같은 IMFActivate를 통해 또는 MFT_TRANSFORM_CLSID_Attribute 특성 또는 IPersist* 인터페이스를 통해 쿼리로있을 수 있습니다). 그런 다음 레지스트리를 친숙한 이름으로 보거나 변환을 열거하고 CLSID를 비교하여 해당 목록에서 원하는 것을 찾을 수 있습니다.

+1

MS H.264 비디오 인코더는 IPersist를 구현하지 않으며 속성을 지원하지 않습니다 (-> GetAttributes()는 E_NOTIMPL을 반환합니다). 또한 SinkWriter는 인코더를 열거하고 생성하므로 IMFActivate 개체에 액세스 할 수 없습니다. 인코더가 구현하는 유일한 두 인터페이스는'ICodecAPI'와'IMFTransform'이며, 둘 중 하나에서 이름을 가져올 수없는 것처럼 보입니다. – Ove

+0

사실입니다. 이 정보는'IMFTransform'에서 거꾸로 접근 할 수 있도록 설계되지 않았습니다. 왜 'IPersist'에 대한 지원을 추가하는 것이 쉽고 효율적인지는 알기가 어렵습니다. 변환을 할 필요가있을 때마다 나는 그것을 분명히 가지고있을 것이다. 그러나 주식 필터는 그대로 ... 개발자가 그리 친절하지는 않다. –

1

이 훨씬 효과적인 솔루션입니다 그리고 난 100 % 작동,하지만 할 수있는 것은 확실하지 않다 :

1)에서 시작은 (내가 이해로 사용할 수있는 모든 코덱을 열거 이 경우 H264 인코더)과에서 변경 이벤트를 설정에 가입

MFT_REGISTER_TYPE_INFO TransformationOutput = { MFMediaType_Video, MFVideoFormat_H264 }; 
DWORD nFlags = MFT_ENUM_FLAG_ALL; 
UINT32 nCount = 0; 
CLSID* pClsids; 
MFTEnum(MFT_CATEGORY_VIDEO_ENCODER, nFlags, NULL, &TransformationOutput, NULL, &pClsids, &nCount); 
// Ok here we assume nCount is 1 and we got the MS encoder 
ICodecAPI *pMsEncoder; 
hr = CoCreateInstance(pClsids[0], NULL, CLSCTX_INPROC_SERVER, __uuidof(ICodecAPI), (void**)&pMsEncoder); 
// nCodecIds is supposed to be an array of identifiers to distinguish the sender 
hr = pMsEncoder->RegisterForEvent(CODECAPI_AVEncVideoOutputFrameRate, (LONG_PTR)&nCodecIds[0]); 

2) 100 % 프레임 레이트 설정이 또한 스트림을위한 입력 미디어 타입이 설정 될 때 설정되어 있지만 어쨌든 당신이 시도 할 수 있는지 확인 동일한 속성을 SinkWriter에서 검색 한 ICodecAPI에 설정하십시오. 그런 다음 이벤트를 가져온 후 lParam1을 전달 된 값과 비교하여 코덱을 식별 할 수 있어야합니다. 그러나 스트림 구성시 생성되는 이벤트에 대한 가설이 잘못된 경우 모든 인코더가 이벤트 알림을 지원하고 불필요한 매개 변수 변경이 필요하다는 사실에 의존하기 때문에 여전히 매우 가난합니다.