c ++ - Windows Media Foundation Sådan bruger du IMFMediaSink :: AddStreamSink

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg implementerer prøveapplikation ved hjælp af Windows Media Foundation.


Jeg har lavet et eksempel applikation som beskrevet i nedenstående link:

https://msdn.microsoft.com/en-us/library/windows/desktop/ms703190(v=vs.85).aspx[6]


I ovenstående eksempel har jeg tilføjet to videostrømme ved hjælp af MFCreateAggregateSource.


I EVR renderer er jeg i stand til at høre lyd fra begge videoer, men jeg kan ikke se kun en reference stream video eller som er først indlæst.


Som pr. Linket,

https://msdn.microsoft.com/en-us/library/windows/desktop/aa965265(v=vs.85).aspx [7]


The EVR media sink initially has one stream sink, which corresponds to the reference stream. To add new stream sinks, call IMFMediaSink::AddStreamSink.


I min ansøgning bruger jeg MFCreateVideoRendererActivate.

Hvordan kan jeg bruge IMFMediaSink::AddStreamSink for at tilføje streams til min EVR.


Så jeg kan se to videostrømme, der spilles i en renderer.


** opdatering **


Jeg har ændret nedenfor eksempelkode og tilføjet kode for at tilføje video


HRESULT CreateMediaSinkActivate(
    IMFStreamDescriptor *pSourceSD,     // Pointer to the stream descriptor.
    DWORD iStream,
    HWND hVideoWindow,                  // Handle to the video clipping window.
    IMFActivate **ppActivate
)
{
    IMFMediaTypeHandler *pHandler = NULL;
    IMFActivate *pActivate = NULL;

    // Get the media type handler for the stream.
    HRESULT hr = pSourceSD->GetMediaTypeHandler(&pHandler);
    if (FAILED(hr))
    {
        goto done;
    }

    // Get the major media type.
    GUID guidMajorType;
    hr = pHandler->GetMajorType(&guidMajorType);
    if (FAILED(hr))
    {
        goto done;
    }

    // Create an IMFActivate object for the renderer, based on the media type.
    if (MFMediaType\_Audio == guidMajorType)
    {
        // Create the audio renderer.
        hr = MFCreateAudioRendererActivate(&pActivate);
    }
    else if (MFMediaType\_Video == guidMajorType) // Added this else if case 
    {
        // Create the video renderer.
        hr = MFCreateVideoRendererActivate(hVideoWindow, &pActivate);
        IMFMediaSink* pVideoSink = NULL;
        HRESULT hrMS = pActivate->ActivateObject(IID\_IMFMediaSink, (void**)&pVideoSink);
        if (SUCCEEDED(hrMS))
        {
            IMFStreamSink* pStreamSink = NULL;
            hrMS  = pVideoSink->AddStreamSink(iStream, NULL, &pStreamSink);
            if (SUCCEEDED(hrMS))
            {
                DWORD dwID=10;
                hrMS = pStreamSink->GetIdentifier(&dwID);
                if (SUCCEEDED(hrMS))
                {
                    printf("
\%d", dwID);
                    SafeRelease(&pStreamSink);
                }
            }       
        }
    }
    else
    {
        // Unknown stream type. 
        hr = E\_FAIL;
        // Optionally, you could deselect this stream instead of failing.
    }
    if (FAILED(hr))
    {
        goto done;
    }

    // Return IMFActivate pointer to caller.
    *ppActivate = pActivate;
    (*ppActivate)->AddRef();

done:
    SafeRelease(&pHandler);
    SafeRelease(&pActivate);
    return hr;
}


Men problemet er, at jeg ikke kan se to videostrømme i videovinduet.

Bedste reference