2016-07-25 2 views
5

MediaFoundation API를 사용하여 비디오를 인코딩하려고하지만 샘플을 SinkWriter로 푸는 데 문제가 있습니다.Media Foundation을 사용하여 Direct X 서페이스 인코딩

데스크톱 복제 API를 통해 프레임을 인코딩하려고합니다. 필자가 끝내는 것은 데스크탑 이미지가있는 ID3D11Texture2D입니다.

이 표면을 포함하는 IMFVideoSample을 만든 다음 해당 비디오 샘플을 SinkWriter로 푸시하려고합니다.

나는 다른 방법으로 이것에 대해려고 시도했습니다
  • 나는 질감이 SampleTime 및 SampleDuration에 가득 ID3D11Texture2D이다 MFCreateVideoSampleFromSurface(texture, &pSample)라고하고 SinkWriter에 생성 된 샘플을 통과시켰다.
    SinkWriter가 E_INVALIDARG를 반환했습니다.

  • nullptr을 첫 번째 인수로 전달하고 MFCreateDXGISurfaceBuffer를 사용하여 직접 버퍼를 만든 다음 샘플에 결과 버퍼를 전달하여 샘플을 만들려고했습니다.
    그 중 하나가 작동하지 않았다.

  • MediaFoundation 설명서를 읽었으며 DirectX 텍스처에서 샘플을 만드는 방법에 대한 자세한 정보를 찾을 수 없습니다.

나는 밖으로 시도하는 것을 다했다.
이전에이 API를 사용하는 사람이 있었는지, 내가 확인해야 할 사항을 생각해 볼 수 있습니까? 아니면 어떻게 디버깅을 할 수 있습니까?

+0

'MFCreateVideoSampleFromSurface'와'MFCreateDXGISurfaceBuffer'를 사용하여 실수 한 것으로 생각합니다.이 함수는 DirectX 및 시각화 표면에 쓰기위한 버퍼를 만들고 인터페이스 'IMF2DBuffer'를 사용하여 객체를 만들지 만 인코더와 작성기에는 IMFMediaBuffer가있는 객체가 필요합니다. 그들은'IMF2DBuffer'를 이해할 수 없습니다. 'MFCreateSampleCopierMFT'함수를 사용해보십시오 - MFT 객체를 생성하여 [MSDN]의 IMFMediaBuffer에서 IMF2DBuffer로 복사합니다 (https://msdn.microsoft.com/en-us/library/windows/desktop/dd388101 (v = vs.85) .aspx). 그것은 역 작업을 할 수 있습니다!?! –

+0

정말 확실하니? 'MFCreateDXGISurfaceBuffer'에 대한 문서를 보면 IMFMediaBuffer에 대한 포인터를 반환한다고 나와 있습니다. –

+0

'MFCreateDXGISurfaceBuffer'에서 버퍼의 IMFMediaBuffer를 통해 데이터를 가져올 수 있습니다. –

답변

1

우선 mftrace tool을 사용하는 법을 배워야합니다. 아마도, 문제를 바로 알릴 수 있습니다.

내 생각에 다음과 같은 문제가있을 수 있습니다.

  1. 아마도 SampleTime/SampleDuration 외에 다른 속성이 필요할 수 있습니다.

  2. 아마도 SinkWriter는 CPU에서 읽을 수있는 질감이 필요합니다. 이 문제를 해결하려면 프레임을 사용할 수있을 때 같은 형식 + 크기의 스테이징 텍스처를 만들고 CopyResource를 호출하여 데스크톱을 스테이징 텍스처로 복사 한 다음 해당 스테이징 텍스처를 MF로 전달합니다.

  3. CPU가 텍스처 데이터를 읽지 않도록 하드웨어 인코더를 사용하더라도 데스크톱 텍스처를 직접 MF로 전달하는 것은 좋지 않다고 생각합니다.

샘플 용 D3D 텍스처를 설정하면 샘플이 아무 것도 복사되지 않고 샘플이 텍스처 만 유지합니다.

MF는 비동기 적으로 작동하며 원하는 경우 토폴로지 노드에 여러 샘플을 버퍼링 할 수 있습니다.

DD는 데이터를 동 기적으로 제공하므로 AcquireNextFrame과 ReleaseFrame 호출 사이의 텍스처에만 액세스 할 수 있습니다.

+0

너무 많은 세부 사항으로 질문을 헛되이하지 않으려 고 노력했지만 CopyResource를 사용하기 전에 데스크탑 텍스처 디스크립터를 가져 와서이를 사용하여 새로운 텍스처를 생성하여 MF로 전달하기 전에 데스크탑 텍스처를 복사하려고합니다. mftrace 포인터에 대해 감사 드리며,이를 살펴 보겠습니다. –

+0

mfctrace를 사용하여 싱크대로 보내지는 샘플이 0B 크기로보고되고 있다는 것을 알아 냈습니다. 그래서 뭔가가 잘못되어 생성되었습니다. –

관련 문제