Udostępnij przez


Aby wyliczyć formaty wejściowe

[Funkcja skojarzona z tą stroną, windows Media Format 11 SDK, jest starszą funkcją. Został zastąpiony przez czytnik źródła i zapisujący danych . czytnika źródeł i składników zapisywania ujścia zostały zoptymalizowane pod kątem systemów Windows 10 i Windows 11. Firma Microsoft zdecydowanie zaleca, aby nowy kod używał Source Reader i Sink Writer zamiast Windows Media Format 11 SDK, jeśli jest to możliwe. Firma Microsoft sugeruje, że istniejący kod, który używa starszych interfejsów API, należy przepisać go do korzystania z nowych interfejsów API, jeśli to możliwe.]

Każdy koder windows Media akceptuje co najmniej jeden typ nośnika wejściowego na potrzeby kompresji. Zestaw SDK formatu Windows Media umożliwia wprowadzanie szerszej gamy formatów niż te obsługiwane przez koderów. Zestaw SDK robi to, wykonując przekształcenia przetwarzania wstępnego na danych wejściowych w razie potrzeby, takie jak zmiana rozmiaru ramek wideo lub ponowne próbkowanie dźwięku. W każdym razie należy upewnić się, że formaty danych wejściowych dla zapisywanych plików są zgodne z danymi wysyłanymi do narzędzia do zapisywania. Każdy koder-dekoder ma domyślny format nośnika wejściowego, który jest ustawiany w module zapisywania podczas ładowania profilu. Domyślny format danych wejściowych można sprawdzić, wywołując IWMWriter::GetInputProps.

Koderie wideo obsługują następujące formaty: IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555 i RGB 8. Koderie audio obsługują dźwięk PCM.

Aby wyliczyć formaty wejściowe obsługiwane przez koder kodujący, wykonaj następujące kroki:

  1. Utwórz obiekt zapisujący i ustaw profil do zastosowania. Aby uzyskać więcej informacji na temat ustawiania profilów w programie Writer, zobacz To Use Profiles with the Writer.
  2. Zidentyfikuj numer wejściowy, dla którego chcesz sprawdzić formaty. Aby uzyskać więcej informacji na temat identyfikowania numerów wejściowych, zobacz Aby zidentyfikować dane wejściowe według liczby.
  3. Pobierz łączną liczbę formatów wejściowych obsługiwanych przez żądane dane wejściowe, wywołując IWMWriter::GetInputFormatCount.
  4. Przeprowadź pętlę po wszystkich obsługiwanych formatach wejściowych, wykonując następujące kroki dla każdego z nich.
    • Pobierz interfejs IWMInputMediaProps dla formatu wejściowego, wywołując IWMWriter::GetInputFormat.
    • Pobierz strukturę WM_MEDIA_TYPE dla formatu wejściowego. Wywołaj IWMMediaProps::GetMediaType, przekazując null parametru pType, aby uzyskać rozmiar struktury. Następnie przydziel pamięć do przechowywania struktury i wywołaj GetMediaType ponownie, aby uzyskać strukturę. IWMInputMediaProps dziedziczy z IWMMediaProps, dzięki czemu można wykonywać wywołania GetMediaType z wystąpienia IWMInputMediaProps, które pobrano w poprzednim kroku.
    • Format opisany w strukturze WM_MEDIA_TYPE zawiera wszystkie istotne informacje o formacie wejściowym. Podstawowy format nośnika jest identyfikowany przez WM_MEDIA_TYPE.subtype. W przypadku strumieni wideo pbFormat wskazuje na dynamicznie przydzieloną strukturę WMVIDEOINFOHEADER, która zawiera dalsze szczegóły dotyczące strumienia, w tym rozmiar prostokąta. Rozmiar ramek wejściowych nie musi dokładnie odpowiadać rozmiarowi obsługiwanemu przez koder. Jeśli nie są one zgodne, komponenty czasu wykonania SDK w wielu przypadkach automatycznie zmieniają rozmiar wejściowych ramek wideo na taki, jaki koder może zaakceptować.

Poniższy przykładowy kod znajduje format wejściowy podtypu przekazanego jako parametr. Aby uzyskać więcej informacji na temat korzystania z tego kodu, zobacz Using the Code Examples.

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

Interfejs IWMWriter

Pisanie plików ASF