2017-02-03 13 views
2

MediaFoundation SourceReader 기술을 사용하여 USB 카메라 스트리밍 데스크톱 응용 프로그램을 개발 중입니다. 카메라는 USB3.0을 지원하며 1080p MJPG 비디오 형식 해상도로 60fps를 제공합니다.MediaFoundation에서 Intel Hardware MJPEG 디코더 MFT를 사용하는 방법 Window Desktop 응용 프로그램 용 SourceReader?

소프트웨어 MJPEG 디코더 MFT를 사용하여 MJPG를 YUY2 프레임으로 변환 한 다음 RGB32 프레임으로 변환하여 창에 그립니다. 60fps 대신이 소프트웨어 디코더를 사용할 때 창당 30fps 만 렌더링 할 수 있습니다. 나는이 사이트에 질문을 올렸고 인텔 하드웨어 MJPEG 디코더 MFT를 사용하여 프레임 삭제 문제를 해결할 제안을 받았습니다. IMFTransform :: ProcessInput() 메서드를 호출 할 때을 MF_E_NOTACCEPTING -

나는 오류 0xC00D36B5에 직면했다. 이 오류를 해결하기 위해 MSDN은 IMFTranform 인터페이스를 비동기 적으로 사용하도록 제안했습니다. 그래서, 나는 모든 입/출력 샘플에 대해 GetEvent에 대한 인터페이스 인 IMFMediaEventGenerator 인터페이스를 사용했습니다. 성공적으로 하나의 입력 샘플 만 처리 한 다음 계속 IMFMediaEventGenerator :: GetEvent() 메서드가 MF_E_NO_EVENTS_AVAILABLE 오류 (GetEvent()가 동기식)를 반환합니다.

IMFTransform뿐만 아니라 SourceReader에 대한 비동기 콜백을 구성하려고 시도했지만 MFAsyncCallback :: Invoke 메서드가 호출되지 않아 GetEvent 메서드를 사용할 계획입니다.

누락 되었습니까? 그렇다면 누군가 인텔 ® 하드웨어 디코더를 프로젝트에 사용하도록 안내합니까?

+0

topoedit에서 토폴로지를 먼저 조립하려고 시도 했습니까? – Mgetz

+0

답장을 보내 주셔서 감사합니다. Mgetz. 카메라는 YUY2 및 MJPG 비디오 형식을 모두 지원합니다. 처음에는 카메라가 YUY2 비디오 형식을 재생하고 MJPG 형식을 변경해야합니다. DirectShow에서 그래프를 작성하는 방법을 알고있다. YUY2에서 MJPEG 비디오 형식으로 전환하는 방법을 알지 못했습니다. MJPG 형식의 토폴로지를 어셈블하는 방법을 알려주시겠습니까? 또한이 디코더를 MediaSession 토폴로지에 추가하여 모든 것이 성공하고 이벤트에서 0XC00D5212 (MF_E_TOPO_CODEC_NOT_FOUND)를 받았습니다. – Abi

+0

따라서 SDK와 함께 제공되는 topoedit 유틸리티를 사용하여 토폴로지를 어셈블하고 작동하는지 테스트 할 것을 권장합니다. topoedit에서 토폴로지를 구성 할 수 없다면 아마 불가능할 것입니다. – Mgetz

답변

1

인텔 하드웨어 MJPEG 디코더 MFT는 asynchronous MFT이며 직접 관리하는 경우 비동기 모델을 적용해야합니다. 당신은이 일을하는 것처럼 보이지만 문제를 해결할 수있는 정보는 제공하지 않습니다. 예, 위에 링크 된 기사의 ProcessInput, ProcessOutput 섹션에 설명 된 이벤트 모델을 사용해야합니다. 첫 번째 프레임을 얻으면서 디버깅을 수행하여 원활한 연속 처리가 가능하도록해야합니다.

미디어 세션과 같은 API를 사용하는 경우 원본 독자는 Media Foundation 자체에서 MFT를 처리합니다. 적절한 경우 동기 및 비동기 소비를 수행 할 수 있습니다. 그러나이 경우에는 IMFTransform 전화를 걸지 않으며 모호한 설명에서도 잘못된 방식으로 전화를 걸게됩니다.

+0

내 실수를 고쳐 줘서 고마워, 로마. 비동기 콜백을 등록하고 비동기 이벤트를 가져 오려고했지만 IMFAsyncCallback :: Invoke()에서 이벤트를 가져 오지 않았습니다. SourceReader에 대한 비동기 콜백을 등록하고 Hardware MFT에 액세스하는 방법을 알려주십시오. – Abi

+0

MFT에 IMFAsyncCallback 콜백을 성공적으로 등록했습니다.입력 샘플을 두 번 처리하기 위해 MFTransformNeedInput 이벤트를 수신했지만 MFTransformHaveOutput 이벤트가 전혀 호출되지 않았습니다. 나는 내 프로젝트에서이 코드를 사용하고있다. https://www.dropbox.com/s/t6figfl9b2kyp6y/HwMJPEGDecoderMFT_Code_Query.txt?dl=0 내 코드를 검토하기 위해 보관 용 계정 링크를 PFA로 보내주십시오. 내 코드에서 ProcessOutputSample() 메서드에 주석을 달고 지속적으로 수신하는 MFTransformNeedInput 이벤트 유형을 계속 확인했습니다. 무엇이 잘못되었는지 말해 주시겠습니까? 왜 제가 왜 ProcessOutputSample을받지 못했습니까? – Abi

+0

@Abika : 그것은 단지 코드 조각 일 뿐이며, 잠깐 그곳을 좋아하지는 않지만 더 중요한 것은 그것이 실행 가능하지 않으며 문제가 발생한 원래의 문제를 일으키는 것이 무엇인지 확신 할 수 없다는 것입니다. 중요한 섹션에 의해 보호 된 코드 조각에서 WaitForSingleObject를 순차적으로 수행하는 방식을 싫어합니다. –