Compartir a través de


Para enumerar formatos de entrada

[La característica asociada a esta página, WINDOWS Media Format 11 SDK, es una característica heredada. Se ha reemplazado por lector de origen y escritor receptor. Lector de origen y escritor receptor se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use lector fuente y escritor receptor en lugar del SDK de Windows Media Format 11, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.

Cada uno de los códecs de Windows Media acepta uno o varios tipos de medios de entrada para la compresión. El SDK de Windows Media Format te permite introducir una variedad más amplia de formatos que los admitidos por los códecs. El SDK lo hace realizando transformaciones de preprocesamiento en las entradas cuando sea necesario, como cambiar el tamaño de fotogramas de vídeo o volver a muestrear audio. En cualquier caso, debe asegurarse de que los formatos de entrada de los archivos que escriba coincidan con los datos que envíe al escritor. Cada códec tiene un formato multimedia de entrada predeterminado que se establece en el escritor cuando se carga el perfil. Puede examinar el formato de entrada predeterminado llamando a IWMWriter::GetInputProps.

Los códecs de vídeo admiten los siguientes formatos: IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555 y RGB 8. Los códecs de audio admiten audio PCM.

Para enumerar los formatos de entrada admitidos por un códec, realice los pasos siguientes:

  1. Cree un objeto writer y establezca un perfil que se va a usar. Para obtener más información sobre cómo establecer perfiles en el escritor, vea Para usar perfiles con el escritor.
  2. Identifique el número de entrada para el que desea comprobar los formatos. Para obtener más información sobre la identificación de números de entrada, vea Para identificar entradas por número.
  3. Recupere el número total de formatos de entrada admitidos por la entrada deseada llamando a IWMWriter::GetInputFormatCount.
  4. Recorra en bucle todos los formatos de entrada admitidos, realizando los pasos siguientes para cada uno.
    • Recupere la interfaz IWMInputMediaProps para el formato de entrada llamando a IWMWriter::GetInputFormat.
    • Recupere la estructura WM_MEDIA_TYPE para el formato de entrada. Llame a IWMMediaProps::GetMediaType y pase NULL para el parámetro pType para obtener el tamaño de la estructura. A continuación, asigne memoria para contener la estructura y llame a GetMediaType de nuevo para obtener la estructura. IWMInputMediaProps hereda de IWMMediaProps, por lo que puede realizar las llamadas a GetMediaType desde la instancia de IWMInputMediaProps recuperada en el paso anterior.
    • El formato descrito en la estructura WM_MEDIA_TYPE contiene toda la información pertinente sobre el formato de entrada. El formato básico del medio se identifica mediante WM_MEDIA_TYPE.subtipo. En el caso de las secuencias de vídeo, el miembro pbFormat apunta a una estructura WMVIDEOINFOHEADER asignada dinámicamente que contiene más detalles sobre la secuencia, incluido el tamaño del rectángulo. El tamaño de los fotogramas de entrada no es necesario para que coincida exactamente con un tamaño admitido por el códec. Si no coinciden, los componentes en tiempo de ejecución del SDK, en muchos casos, cambiarán automáticamente el tamaño de los fotogramas de vídeo de entrada a algo que el códec pueda aceptar.

El código de ejemplo siguiente busca el formato de entrada del subtipo pasado como parámetro. Para obtener más información sobre el uso de este código, vea Usar los ejemplos de código.

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;
}

IWMWriter (Interfaz)

Escritura de archivos ASF