Condividi tramite


Per enumerare i formati di input

[La funzionalità associata a questa pagina, Windows Media Format 11 SDK, è una funzionalità legacy. È stata sostituita dal lettore di origine e dal writer sink. Lettore di origine e writer sink sono stati ottimizzati per Windows 10 e Windows 11. Microsoft consiglia vivamente che il nuovo codice usi lettore di origine e writer sink anziché Windows Media Format 11 SDK, quando possibile. Microsoft suggerisce che il codice esistente che usa le API legacy venga riscritto per usare le nuove API, se possibile.

Ognuno dei codec Windows Media accetta uno o più tipi di supporti di input per la compressione. Windows Media Format SDK consente di immettere un'ampia gamma di formati rispetto a quelli supportati dai codec. L'SDK esegue questa operazione eseguendo trasformazioni di pre-elaborazione sugli input quando necessario, ad esempio ridimensionando i fotogrammi video o ricampionando audio. In ogni caso, è necessario assicurarsi che i formati di input per i file scritti corrispondano ai dati inviati al writer. Ogni codec ha un formato multimediale di input predefinito impostato nel writer quando il profilo viene caricato. È possibile esaminare il formato di input predefinito chiamando IWMWriter::GetInputProps.

I codec video supportano i formati seguenti: IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555 e RGB 8. I codec audio supportano l'audio PCM.

Per enumerare i formati di input supportati da un codec, seguire questa procedura:

  1. Creare un oggetto writer e impostare un profilo da usare. Per altre informazioni sull'impostazione dei profili nel writer, vedere To Use Profiles with the Writer.For more information about setting profiles in the writer, see To Use Profiles with the Writer.
  2. Identificare il numero di input per il quale si desidera controllare i formati. Per altre informazioni sull'identificazione dei numeri di input, vedere Per identificare gli input per numero.
  3. Recuperare il numero totale di formati di input supportati dall'input desiderato chiamando IWMWriter::GetInputFormatCount.
  4. Scorrere tutti i formati di input supportati eseguendo i passaggi seguenti per ognuno di essi.
    • Recuperare l'interfaccia IWMInputMediaProps per il formato di input chiamando IWMWriter::GetInputFormat.
    • Recuperare la struttura WM_MEDIA_TYPE per il formato di input. Chiamare IWMMediaProps::GetMediaType, passando NULL per il parametro pType per ottenere le dimensioni della struttura. Allocare quindi memoria per contenere la struttura e chiamare nuovamente GetMediaType per ottenere la struttura. IWMInputMediaProps eredita da IWMMediaProps, quindi è possibile effettuare le chiamate a GetMediaType dall'istanza di IWMInputMediaProps recuperata nel passaggio precedente.
    • Il formato descritto nella struttura WM_MEDIA_TYPE contiene tutte le informazioni pertinenti sul formato di input. Il formato di base del supporto è identificato da WM_MEDIA_TYPE.sottotipo. Per i flussi video, il membro pbFormat punta a una struttura WMVIDEOINFOHEADER allocata dinamicamente che contiene ulteriori dettagli sul flusso, incluse le dimensioni del rettangolo. Le dimensioni dei fotogrammi di input non sono necessarie per corrispondere esattamente a una dimensione supportata dal codec. Se non corrispondono, i componenti di runtime dell'SDK, in molti casi, ridimensionano automaticamente i fotogrammi video di input in un elemento che il codec può accettare.

Il codice di esempio seguente trova il formato di input del sottotipo passato come parametro. Per altre informazioni sull'uso di questo codice, vedere Uso degli esempi di codice.

HRESULT FindInputFormat(IWMWriter* pWriter, 
                       DWORD dwInput,
                       GUID guidSubType,
                       IWMInputMediaProps** ppProps)
{
    DWORD   cFormats = 0;
    DWORD   cbSize   = 0;

    WM_MEDIA_TYPE*      pType  = NULL;
    IWMInputMediaProps* pProps = NULL;

    // Set the ppProps parameter to point to NULL. This will
    //  be used to check the results of the function later.
    *ppProps = NULL;

    // Find the number of formats supported by this input.
    HRESULT hr = pWriter->GetInputFormatCount(dwInput, &cFormats);
    if (FAILED(hr))
    {
        goto Exit;
    }
    // Loop through all of the supported formats.
    for (DWORD formatIndex = 0; formatIndex < cFormats; formatIndex++)
    {
        // Get the input media properties for the input format.
        hr = pWriter->GetInputFormat(dwInput, formatIndex, &pProps);
        if (FAILED(hr))
        {
            goto Exit;
        }
        // Get the size of the media type structure.
        hr = pProps->GetMediaType(NULL, &cbSize);
        if (FAILED(hr))
        {
            goto Exit;
        }
        // Allocate memory for the media type structure.
        pType = (WM_MEDIA_TYPE*) new (std::nothrow) BYTE[cbSize];
        if (pType == NULL)
        {
            hr = E_OUTOFMEMORY;
            goto Exit;
        }
        
        // Get the media type structure.
        hr = pProps->GetMediaType(pType, &cbSize);
        if (FAILED(hr))
        {
            goto Exit;
        }

        if(pType->subtype == guidSubType)
        {
            *ppProps = pProps;
            (*ppProps)->AddRef();
            goto Exit;
        }

        // Clean up for next iteration.
        delete [] pType;
        pType = NULL;
        SAFE_RELEASE(pProps);
    } // End for formatIndex.

    // If execution made it to this point, no matching format was found.
    hr = NS_E_INVALID_INPUT_FORMAT;

Exit:
    delete [] pType;
    SAFE_RELEASE(pProps);
    return hr;
}

Interfaccia IWMWriter

Scrittura di file ASF