2017-03-09 5 views
0

H264 비디오 인코딩을위한 Media Foundation IMFTransform을 사용하여 비디오 프레임을 인코딩 할 수있게하려고합니다. Win32에서는 MFTEnumEx를 사용하여 변환을 나열하고 H264 인코더를 쉽게 찾을 수 있습니다.WinRT Store App에 H264 인코더를 인스턴스화하는 방법

그러나 WinRT (Store Apps)에서는 인스턴스화 할 수있는 방법을 찾을 수 없습니다. 클래스 CMSH264EncoderMFT가 있지만 CoCreateInstance에 사용할 CLSID에 대한 정의가 없습니다.

으로 :

CoCreateInstance(CLSID_CMSH264EncoderMFT, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IUnknown), (void **)&pUnknown); 

CLSID_CMSH264EncoderMFT는 WinRT 응용 프로그램에 대한 정의되지 않습니다.

그리고 시도 :

ComPtr<CMSH264EncoderMFT> encoder = Make<CMSH264EncoderMFT>(); 

그것은 클래스 CMSH264EncoderMFT이 불완전하고 말한다 "정의되지 않은 형식 'CMSH264EncoderMFT'의 사용"말했다. Make 구문이 올바른지 또는 적합하지 않은지조차 모르겠다. ...

누구나 WinRT에서이 작업을 수행하는 방법에 대한 단서가 있습니까? Provides functionality required for all Windows Runtime classes - 그것은 예를 IInspectable에 대한 WinRT에서 개체가 반드시 몇 가지 인터페이스를 가지고 있지 않기 때문에

+0

안녕하세요, 올바른 조언을 드릴 수는 없지만 비슷한 문제가있는 동안 [Windows Store C++ 프로젝트에서 Free-COM DLL 사용] (https://blogs.msdn.microsoft)을 사용하기로 결정했습니다. .com/win8devsupport/2013/05/19/using-free-com-dll-in-windows-store-c-project /). 아이디어는 데스크톱 버전의 Windows 용 WindowsStore 응용 프로그램 코드에서 COM DLL을 호출 할 수 있다는 것입니다. Windows WinRT에서는 작동하지 않지만 이러한 Windows 버전의 장치는 매우 적습니다. 이 솔루션은 범용 앱 전용 데스크톱 용 솔루션이 아닙니다. –

+0

안녕하세요 @ EvgenyPereguda, 감사합니다. COM을 무료로로드 할 수 있다는 것은 흥미로운 일입니다. 그러나 나는 모바일을 위해 이것을 정말로 필요로한다. 내가 모바일 용으로 인코딩 할 수있는 유일한 방법은 Sink Writer를 사용하는 것이지만 파일 형식의 오버 헤드 (mp4라고 함)를 제공합니다. IMFTransform :: ProcessOutput에서 샘플을 가져 와서 실제로 작업하고 싶습니다. ... –

답변

-1

당신은 CMSH264EncoderMFT를 통해 개체를 인스턴스화 할 수 없습니다. CMSH264EncoderMFT는 WinRT 클래스가 아닙니다. 함수 MFCreateSinkWriterFromMediaSink으로 작업을 해결할 수 있습니다.이 함수는 인터페이스 IMFMediaSink이있는 객체를 사용합니다. IMFMediaSink 인터페이스를 가진 객체에 대한 코드를 작성할 수 있으며 IMFTransform::ProcessOutput의 샘플을 수신 할 수 있습니다. 주의를 기울여야합니다. Windows 런타임 클래스가 아닌 WindowsStore 코드 개체에서 인스턴스를 생성 할 수 없습니다.

감사합니다, 예브게니 Pereguda

+0

그 대답은 말이되지 않습니다. CoCreateInstance는 Windows 런타임 객체가 아닌 COM 객체를 만드는 함수입니다. 실패한 실제 이유는 Windows Store 응용 프로그램에서 해당 클래스를 사용할 수 없기 때문입니다. 그러나 사용할 수 있고 IInspectable을 구현하지 않는 많은 COM 클래스가 있습니다. – Sunius

+0

Windows 스토어 C++ 프로젝트에서'Free-COM DLL 사용하기 '를 통해 COM 객체를 생성 할 수 있다고 썼습니다.'그러나 Joao Carrion은 접근 가능한 GUID처럼 WindowsStore의 컨텍스트에서 CMSH264EncoderMFT를 사용하려고했습니다. 나는 특정 플랫폼의 수준 추상화 인 WinRT 환경에서는 Free-COM을 사용할 수 없다고 지적합니다. –

+0

안녕하세요 @ EvgenyPereguda, 내가 IMFMediaSink를 구현해야한다고 말하는 것입니까? 아마도 IMFStreamSink도 H264 코덱의 출력 프레임을 가져올 수 있다고 가정하고 있습니까? 지금은 그 부분을 살펴보고 있지만 표준 쓰기를 파일에 쓰거나 파일 라우팅에서 재생하고 싶지 않으면 설명서가 매우 혼란 스럽습니다. –

0

사용 MFCreateSinkWriterFromURL 먼저 파일 라이터를 만들 수 있습니다. 그런 다음 MFCreateMediaType을 사용하여 IMFMediaType을 만듭니다. 그 중 하나가 출력 형식이 될 속성을 설정합니다. MF_MT_SUBTYPE guid가있는 미디어 유형에 SetGUID 메서드를 사용하고 MFVideoFormat_H264를 인수로 지정합니다. 마지막으로 싱크 작성기에서 AddStream 메서드를 사용하여 미디어 유형을 설정합니다.

예가 here입니다 (MF_MT_SUBTYPE을 (를) 설정하면 약간 수정해야합니다).

+0

감사합니다. 지금 당장은 실제로 그 일을하고 있지만 문제는 코덱 출력 샘플을 얻지 못한다는 것입니다. 이미 파일 형식 (예 : mp4)의 스트림으로 저장됩니다. 내가 필요한 것은 코덱의 IMFT 변환을 인스턴스화하여 데스크톱에서 얻을 수있는 비디오 샘플입니다. –