2016-12-07 23 views
1
내 응용 프로그램에서 미디어 재단에 DirectShow를 ("DS") ("MF")와 코드를 교체하려고

에 FPS를 변경할 수 없습니다 하나의 문제를 만났다 - 웹캠에서 MF를 사용하여 필요한 FPS를 설정할 수 없습니다 . MF에서는 30fps 만 설정할 수있었습니다. 25fps로 설정하려고하면 SetCurrentMediaType()에서 항상 0xc00d5212 오류가 발생합니다. DS에서 그 매개 변수를 변경할 수 있습니다.미디어 재단 : 웹캠

내 코드 : 어떤 도움

ASSERT(m_pReader); //IMFSourceReader *m_pReader; 
IMFMediaType *pNativeType = NULL; 
IMFMediaType *pType = NULL; 
UINT32 w = 1280; 
UINT32 h = 720; 
UINT32 fps = 25; // or 30 

DWORD dwStreamIndex = MF_SOURCE_READER_FIRST_VIDEO_STREAM; 

// Find the native format of the stream. 
HRESULT hr = m_pReader->GetNativeMediaType(dwStreamIndex, 0, &pNativeType); 
if (FAILED(hr)) 
{ 
    //error 
} 

GUID majorType, subtype; 

// Find the major type. 
hr = pNativeType->GetGUID(MF_MT_MAJOR_TYPE, &majorType); 
if (FAILED(hr)) 
{ 
    //error 
} 
// Define the output type. 
hr = MFCreateMediaType(&pType); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = pType->SetGUID(MF_MT_MAJOR_TYPE, majorType); 
if (FAILED(hr)) 
{ 
    //error 
} 
// Select a subtype. 
if (majorType == MFMediaType_Video) 
{ 
    subtype= MFVideoFormat_RGB24; 
} 
else 
{ 
    //error 
} 
hr = pType->SetGUID(MF_MT_SUBTYPE, subtype); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = MFSetAttributeSize(pType, MF_MT_FRAME_SIZE, w, h); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = MFSetAttributeSize(pType, MF_MT_FRAME_RATE, fps, 1); 
if (FAILED(hr)) 
{ 
    //error 
} 
hr = m_pReader->SetCurrentMediaType(dwStreamIndex, NULL, pType); 
if (FAILED(hr)) 
{// hr = 0xc00d5212 
    //!!!!!error - if fps == 25 
} 
return hr; 

감사합니다.

답변

3

가 너무 카메라 유연한 프레임 레이트 값을 지원하지 않으며, 예를 들면 만 지원 세트 사이에서 작동 할 수 있음을 발생할 수 : 10, 15, 20, 24, 30 프레임을. 지원되는 미디어 유형을 열거하고 사용자에게 적합한 미디어 유형을 선택할 수 있어야합니다. 일반적으로 미디어 유형에는 프레임 속도 옵션이 포함되어 있습니다. 미디어 재단과 DirectShow를 비디오 캡처 결국 같은 백 엔드에서 끝 불구하고

는해도, 행동의 차이가있을 수 있습니다. 특히, 내부적으로 미디어 소스에 인터페이스 미디어 재단 높은 수준의 API로 작업하고 그렇게 프레임 속도 0xC00D5212 MF_E_TOPO_CODEC_NOT_FOUND에 이르게한다는 일이 있습니다 "아니 적절한 인코딩 또는 콘텐츠 디코딩 밝혀졌다 변환"혼란도 기술적으로 운전자가 생각을 각각의 모드에서 캡처 할 수 있습니다.

은 참조 :

+0

안녕 로마, 나는 당신의 MF 유틸리티를 시도하고 다음을 가지고 : 웹캠은 1 초당 30 프레임으로 작업 할 수 있습니다. 그러나 DS는 5, 10, 15, 20, 25 및 30 fps와 같은 또 다른 것을 보여주었습니다. 왜? 또는 웹캠은 30fps 밖에 없지만 DS는 다른 프레임 속도에서 해당 fps를 나눌 수 있습니까? 그것은 사실입니까? –

+0

WDM 드라이버가 여러 프레임 속도를보고하지만 정보가 불완전하고 MF 레이어로 필터링 될 수 있습니다. 그냥 짐작할 수 있습니다 - 확실한 것을 말하기에 충분한 정보가 없습니다. –

+0

안녕하세요, 저는이 제한이 UVC와 관련이 있다고 생각합니다 - USB Video Class - Media Foundation 용 드라이버. 플랫폼 WindowsStore를 대상으로하며 RGB 및 MJPEG 형식뿐만 아니라 하드웨어 인코더의 H264 및 H265 형식으로 비디오를 가져 오는 USB 카메라와 함께 작동하도록 최적화되어있어 기능 제한으로 이어집니다. 더 많은 기능을 사용하려면 DShow를 사용하거나 필요한 프레임 속도로 프레임을 잡는 타이머를 작성해야합니다. –

0

. 그래서 처음에는 30fps를 설정했고, 그 다음 fps 스케일로 내 앱을위한 프레임을 건너 뛰었습니다. 도움 주셔서 감사합니다.