어떤 이유인지 H.264를 디코딩 할 수 없습니다. 입력/출력 구성은 입력/출력 버퍼 작성과 마찬가지로 잘되었습니다.Media Foundation H.264 디코더 작동 방법
실시간 스트림에서 디멀티플렉싱 된 H.264를 디코더에 수동으로 공급하고 있습니다. 따라서 미디어 하위 유형으로 MFVideoFormat_H264_ES를 사용합니다. 디코딩은 매우 느리고 디코딩 된 프레임은 완전한 쓰레기입니다. 다른 디코더는 동일한 스트림을 올바르게 디코딩합니다.
이상한 것은 일단 ProcessInput()이 MF_E_NOTACCEPTING을 반환하면 다음 ProcessOutput()은 MF_E_TRANSFORM_NEED_MORE_INPUT을 반환한다는 것입니다. MSDN에 따르면 이것은 결코 일어나지 않아야합니다.
아무도 그것을 할 수있는 방법에 대한 구체적인 정보를 제공 할 수 있습니까? (MF H.264가 기능적이라고 가정 할 때, 나는 그것을 심각하게 의심한다).
추가 정보를 기꺼이 제공하지만 도움을 받으려면 누군가가 필요할 수도 있습니다.
편집 : 정확하게 입력 버퍼의 바이트 수를 0으로 재설정해야합니까? Btw, ProcessOutput()이 무언가를 (가비지) 제공 할 때 출력 버퍼를 재설정 중입니다.
Edit2 : 입력 버퍼의 현재 버퍼 크기를 0으로 재설정하지 않고도 일부 유효한 출력을 얻을 수있었습니다. 준 유효성에 따라 모든 성공적인 ProcessOutput()에서 현재 이미지에 이전 프레임보다 더 많은 디코딩 된 매크로 블록이 포함 된 YUV 이미지가 수신됨을 의미합니다. 나머지 프레임은 검은 색입니다. 크기를 재설정하지 않기 때문에 잠시 후 중단됩니다. 그래서, 버퍼 크기를 다시 설정하는 문제가있는 것 같아요 전체 프레임 완료 될 때 또는 일부 알림을 받아야합니다 같아요.
Edit3 : 입력 버퍼를 만드는 동안 GetInputStreamInfo()는 입력 버퍼 크기로 4096을 반환합니다. 그러나 0, 4k는 충분하지 않습니다. 4MB로 증가하면 프레임 조각 단위로 프레임을 압축 해제하는 데 도움이됩니다. 전체 프레임이 디코딩 된시기를 알 수있는 방법이 있는지 파악해야합니다.
디코더의 SetInputType 및 SetOutputType은 어떻게 호출합니까? ProcessInput을 처음 호출하기 전에 MFT_MESSAGE_NOTIFY_BEGIN_STREAMING 및 MFT_MESSAGE_NOTIFY_START_OF_STREAM 개의 메시지를 보냈습니까? – VuVirt
입력 및 출력 버퍼를 재설정하지 마십시오. MSDN에서 인용 : "호출자가 미디어 샘플을 할당하면 미디어 샘플에 출력 데이터를 저장할만큼 큰 버퍼가 있어야합니다. 버퍼 요구 사항을 찾으려면 GetOutputStreamInfo를 호출합니다 .MFT는 출력 데이터를 버퍼에 이미 존재하는 모든 데이터를 덮어 씁니다. " https://msdn.microsoft.com/en-us/library/windows/desktop/ms704014(v=vs.85).aspx – VuVirt
예, 두 메시지가 모두 성공적으로 전송되었습니다 (MFT_MESSAGE_NOTIFY_BEGIN_STREAMING 및 MFT_MESSAGE_NOTIFY_START_OF_STREAM). SetInputType 및 SetOutputType이 제대로 처리되었습니다. 디코딩하는 동안 MF_E_TRANSFORM_STREAM_CHANGE를 받고 성공적으로 처리했습니다. 버퍼 오버 라이팅에 관해서는 MSDN이 설명하는 것처럼 실제로 작동하지 않습니다. 일부 디코더에서는 ProcessOutput()이 무언가를 전달한 후에 버퍼 길이를 0으로 재설정해야했습니다. – kytodrk