入力形式を列挙するには

[このページに関連付けられている機能である Windows Media Format 11 SDK は、レガシ機能です。 これは、ソース リーダーシンク ライターによって置き換えられます。 ソース リーダーシンク ライターは、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、Windows Media Format 11 SDK ではなくソース リーダーシンク ライターを使用することを強くお勧めします。 Microsoft は、従来の API を使用する既存のコードを、可能であれば新しい API を使用するように書き直すよう提案しています。]

各 Windows メディア コーデックは、圧縮のために 1 つ以上の種類の入力メディアを受け入れます。 Windows Media Format SDK を使用すると、コーデックでサポートされている形式よりもさまざまな形式を入力できます。 SDK では、ビデオ フレームのサイズ変更やオーディオのリサンプリングなど、必要に応じて入力に対して前処理変換を実行することでこれを行います。 いずれの場合も、書き込むファイルの入力形式が、ライターに送信するデータと一致していることを確認する必要があります。 各コーデックには、プロファイルの読み込み時にライターで設定される既定の入力メディア形式があります。 IWMWriter::GetInputProps を呼び出すことで、既定の入力形式を調べることができます。

ビデオ コーデックは、IYUV、I420、YV12、YUY2、UYVY、YVYU、YVU9、RGB 32、RGB 24、RGB 565、RGB 555、RGB 8 の形式をサポートしています。 オーディオ コーデックは PCM オーディオをサポートします。

コーデックでサポートされている入力形式を列挙するには、次の手順を実行します。

  1. ライター オブジェクトを作成し、使用するプロファイルを設定します。 ライターでのプロファイルの設定の詳細については、「ライター でプロファイルを使用するには」を参照してください。
  2. 形式をチェックする入力番号を特定します。 入力番号の識別の詳細については、「入力を数値 で識別するには」を参照してください。
  3. IWMWriter::GetInputFormatCount を呼び出して、目的の入力でサポートされる入力形式の合計数を取得します。
  4. サポートされているすべての入力形式をループ処理し、それぞれに対して次の手順を実行します。
    • IWMWriter::GetInputFormat を呼び出して、入力形式の IWMInputMediaProps インターフェイスを取得します。
    • 入力形式の WM_MEDIA_TYPE 構造体を取得します。 IWMMediaProps::GetMediaType を呼び出し、pType パラメーターに NULL を渡して構造体のサイズを取得します。 次に、構造体を保持するメモリを割り当て、もう一度 GetMediaType を 呼び出して構造体を取得します。 IWMInputMediaProps はIWMMediaProps から継承されるため、前の手順で取得した IWMInputMediaProps のインスタンスから GetMediaType を呼び出すことができます。
    • WM_MEDIA_TYPE 構造体で説明されている形式には、入力形式に関するすべての関連情報が含まれています。 メディアの基本的な形式は 、WM_MEDIA_TYPE.サブタイプによって識別されます。 ビデオ ストリームの場合、 pbFormat メンバーは、動的に割り当てられた WMVIDEOINFOHEADER 構造体を指します。この構造体には、四角形のサイズなど、ストリームに関する詳細が含まれます。 入力フレームのサイズは、コーデックでサポートされているサイズと正確に一致する必要はありません。 それらが一致しない場合、SDK ランタイム コンポーネントは、多くの場合、入力ビデオ フレームのサイズをコーデックで受け入れられるものに自動的に変更します。

次のコード例では、パラメーターとして渡されたサブタイプの入力形式を検索します。 このコードの使用方法の詳細については、「コード 例の使用」を参照してください。

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 インターフェイス

ASF ファイルの書き込み