Formato flusso

[La funzionalità associata a questa pagina, DirectShow, è una funzionalità legacy. È stata sostituita da MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation. Queste funzionalità sono state ottimizzate per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi MediaPlayer, IMFMediaEngine e Audio/Video Capture in Media Foundation invece di DirectShow, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Sia MSDV che il driver UVC possono restituire due formati DV: audio-video interleaved o solo video. Audio-video interleaved è il formato originale del dispositivo. Il formato solo video contiene gli stessi dati, ma gli esempi sono contrassegnati come senza dati audio. Il formato di solo video esiste principalmente per la compatibilità con le applicazioni che usano Video per Windows. Per altre informazioni, vedere Type-1 vs. Type-2 DV AVI Files.For more information, see Type-1 vs. Type-2 DV AVI Files.

MSDV Driver

Il driver MSDV ha due pin di output. Il primo pin di output invia dati interleaved e il secondo pin di output invia dati solo video. È possibile connettere un solo pin di output alla volta. Per selezionare un formato, connettere il pin di output appropriato. È possibile usare l'interfaccia IAMStreamConfig nel pin di output per trovare il formato.

UVC Driver

A differenza del driver MSDV, il driver UVC fornisce entrambi i formati dallo stesso pin. Il formato predefinito è solo video. Per selezionare il formato, usare l'interfaccia IAMStreamConfig nel pin di output. Chiamare il metodo GetStreamCaps per enumerare i tipi di supporti nel pin di output. Per ogni tipo di supporto, se il tipo principale corrisponde al formato desiderato, chiamare SetFormat e passare tale tipo di supporto.

Formato Tipo principale
Audio e video interleaved MEDIATYPE_Interleaved
Solo video MEDIATYPE_Video

 

La funzione seguente imposta il formato in base al GUID di tipo principale.

HRESULT SetStreamFormat(IAMStreamConfig *pConfig, const GUID& majorType)
{
    if (pConfig == NULL)
    {
        return E_POINTER;
    }

    // Get the number of stream capabilities.
    int count = 0, size = 0;
    HRESULT hr = pConfig->GetNumberOfCapabilities(&count, &size);
    if (FAILED(hr))
    {
        return hr;
    }

    // Allocate memory for the stream capabilities structure.
    BYTE *pCaps = new BYTE[size];
    if (pCaps == NULL)
    {
        return E_OUTOFMEMORY;
    }
    
    // Enumerate the stream capabilities.
    bool bFoundType = false;
    for (int ix = 0; ix < count; ix++)
    {
        AM_MEDIA_TYPE *pmt;
        hr = pConfig->GetStreamCaps(ix, &pmt, pCaps);
        if (FAILED(hr))
        {
            break;
        }
        else if (pmt->majortype == majorType)
        {
            // This is the media type we want.
            bFoundType = true;
            hr = pConfig->SetFormat(pmt);
            DeleteMediaType(pmt);
            break;
        }
        DeleteMediaType(pmt);
    }
    delete [] pCaps;
    if (FAILED(hr))
    {
        return hr;
    }
    return bFoundType ? S_OK : E_FAIL;
}

Il driver MSDV supporta anche IAMStreamConfig, quindi è possibile scrivere codice che funziona per entrambi i tipi di dispositivo.

Controllo di un DV Dv