2017-10-26 12 views
1
나는 다음 MSDN의 샘플 코드를 사용하고

(미디어 재단)변환 미디어 만들기 세션

  1. 오디오/비디오 재생
  2. 에서 MFTs (그레이 스케일 샘플을) 적용 노드
  3. 토폴로지

나는 미디어 세션에 MFTs을 적용 할 기반 재생 MFT_Grayscale 샘플 에 디코더를 추가 TopoEdit에 등록되어 잘 작동합니다.

위의 샘플을 바탕으로, topolgy 링크 만 추가했습니다. 하지만 작동하지 않습니다.

다음은 내가 추가 한 것입니다.

HRESULT AddBranchToPartialTopology(
IMFTopology *pTopology,   // Topology. 
IMFMediaSource *pSource,  // Media source. 
IMFPresentationDescriptor *pPD, // Presentation descriptor. 
DWORD iStream,     // Stream index. 
HWND hVideoWnd)     // Window for video playback. 


{ 

    IMFStreamDescriptor *pSD = NULL; 
    IMFActivate   *pSinkActivate = NULL; 
    IMFTopologyNode  *pSourceNode = NULL; 
    IMFTopologyNode  *pOutputNode = NULL; 
    IMFTopologyNode  *pDecoderNode = NULL; 
    IMFTopologyNode  *pMFTNode = NULL; 

    BOOL fSelected = FALSE; 
    CLSID clsidDecoder = GUID_NULL; 

    HRESULT hr = pPD->GetStreamDescriptorByIndex(iStream, &fSelected, &pSD); 
    if (FAILED(hr)) 
    { 
     goto done; 
    } 

    if (fSelected) 
    { 
     // Create the media sink activation object. 
     hr = CreateMediaSinkActivate(pSD, hVideoWnd, &pSinkActivate); 
     if (FAILED(hr)) 
     { 
      goto done; 
     } 

     // Add a source node for this stream. 
     hr = AddSourceNode(pTopology, pSource, pPD, pSD, &pSourceNode); 
     if (FAILED(hr)) 
     { 
      goto done; 
     } 

     // Create the output node for the renderer. 
     hr = AddOutputNode(pTopology, pSinkActivate, 0, &pOutputNode); 
     if (FAILED(hr)) 
     { 
      goto done; 
     } 

     // Find a decoder. 
     if (SUCCEEDED(hr)) 
     { 
      hr = FindDecoderForStream(pSD, &clsidDecoder); 
     } 

     if (SUCCEEDED(hr)) 
     { 
      if (clsidDecoder == GUID_NULL) 
      { 
       // No decoder is required. 
       // Connect the source node to the output node. 
       hr = pSourceNode->ConnectOutput(0, pOutputNode, 0); 
      } 
      else 
      { 
       // Add a decoder node. 
       hr = AddTransformNode(pTopology, clsidDecoder, &pDecoderNode); 
       hr = AddTransformNode(pTopology, CLSID_GrayscaleMFT, &pMFTNode); 

       if (SUCCEEDED(hr)) 
       { 
        hr = pSourceNode->ConnectOutput(0, pDecoderNode, 0); 
       } 

       // Connect the decoder node to the output node. 
       if (SUCCEEDED(hr)) 
       { 
        hr = pDecoderNode->ConnectOutput(0, pMFTNode, 0); 
       } 

       if (SUCCEEDED(hr)) 
       { 
        hr = pMFTNode->ConnectOutput(0, pOutputNode, 0); 
       } 
      } 
     } 
     // Mark this branch as not requiring a decoder. 
     if (SUCCEEDED(hr)) 
     { 
      hr = pOutputNode->SetUINT32(
       MF_TOPONODE_CONNECT_METHOD, 
       MF_CONNECT_ALLOW_CONVERTER 
       ); 
     } 

     if (SUCCEEDED(hr)) 
     { 
      hr = pDecoderNode->SetUINT32(
       MF_TOPONODE_CONNECT_METHOD, 
       MF_CONNECT_ALLOW_CONVERTER 
       ); 
     } 

     if (SUCCEEDED(hr)) 
     { 
      hr = pMFTNode->SetUINT32(
       MF_TOPONODE_CONNECT_METHOD, 
       MF_CONNECT_ALLOW_CONVERTER 
       ); 
     } 
    } 
    // else: If not selected, don't add the branch. 
done: 
    SafeRelease(&pSD); 
    SafeRelease(&pSinkActivate); 
    SafeRelease(&pSourceNode); 
    SafeRelease(&pOutputNode); 
    SafeRelease(&pDecoderNode); 
    SafeRelease(&pMFTNode); 
    return hr; 
}  

답변

1

나는 바보처럼 느낍니다.

MFT_Grayscale은 비디오 스트림 만 변환합니다.

오디오 스트림을 연결하지 마십시오.

다음과 같이 ...

if (MFMediaType_Audio == guidMajorType) 
{ 
    pSourceNode->ConnectOutput(0, pDecoderNode, 0); 
    pDecoderNode->ConnectOutput(0, pOutputNode, 0); 
} 
else if (MFMediaType_Video == guidMajorType) 
{ 
    pSourceNode->ConnectOutput(0, pDecoderNode, 0); 
    pDecoderNode->ConnectOutput(0, pMFTNode, 0); 
    pMFTNode->ConnectOutput(0, pOutputNode, 0); 
}