Bagikan melalui


Untuk Menghitung Format Input

[Fitur yang terkait dengan halaman ini, Windows Media Format 11 SDK, adalah fitur warisan. Ini telah digantikan oleh Pembaca Sumber dan Penulis Sink. Pembaca Sumber dan Penulis Sink telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan Pembaca Sumber dan Penulis Sink alih-alih Windows Media Format 11 SDK, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Masing-masing codec Windows Media menerima satu atau beberapa jenis media input untuk pemadatan. Windows Media Format SDK memungkinkan Anda memasukkan berbagai format yang lebih luas daripada yang didukung oleh codec. SDK melakukan ini dengan melakukan transformasi pra-pemrosesan pada input jika diperlukan, seperti mengubah ukuran bingkai video atau mengambil sampel ulang audio. Bagaimanapun, Anda harus memastikan bahwa format input untuk file yang Anda tulis cocok dengan data yang Anda kirim ke penulis. Setiap codec memiliki format media input default yang diatur dalam penulis saat profil dimuat. Anda dapat memeriksa format input default dengan memanggil IWMWriter::GetInputProps.

Codec video mendukung format berikut: IYUV, I420, YV12, YUY2, UYVY, YVYU, YVU9, RGB 32, RGB 24, RGB 565, RGB 555, dan RGB 8. Codec audio mendukung audio PCM.

Untuk menghitung format input yang didukung oleh codec, lakukan langkah-langkah berikut:

  1. Buat objek penulis dan atur profil yang akan digunakan. Untuk informasi selengkapnya tentang mengatur profil di penulis, lihat Untuk Menggunakan Profil dengan Penulis.
  2. Identifikasi nomor input yang ingin Anda periksa formatnya. Untuk informasi selengkapnya tentang mengidentifikasi nomor input, lihat Untuk Mengidentifikasi Input Menurut Angka.
  3. Ambil jumlah total format input yang didukung oleh input yang diinginkan dengan memanggil IWMWriter::GetInputFormatCount.
  4. Perulangan semua format input yang didukung, lakukan langkah-langkah berikut untuk masing-masing format.
    • Ambil antarmuka IWMInputMediaProps untuk format input dengan memanggil IWMWriter::GetInputFormat.
    • Ambil struktur WM_MEDIA_TYPE untuk format input. Panggil IWMMediaProps::GetMediaType, melewati NULL untuk parameter pType untuk mendapatkan ukuran struktur. Kemudian alokasikan memori untuk menahan struktur dan memanggil GetMediaType lagi untuk mendapatkan struktur. IWMInputMediaProps mewarisi dari IWMMediaProps, sehingga Anda dapat melakukan panggilan ke GetMediaType dari instans IWMInputMediaProps yang diambil pada langkah sebelumnya.
    • Format yang dijelaskan dalam struktur WM_MEDIA_TYPE berisi semua informasi terkait tentang format input. Format dasar media diidentifikasi oleh WM_MEDIA_TYPE.subtype. Untuk aliran video, anggota pbFormat menunjuk ke struktur WMVIDEOINFOHEADER yang dialokasikan secara dinamis yang berisi detail lebih lanjut tentang aliran, termasuk ukuran persegi panjang. Ukuran bingkai input tidak diperlukan untuk mencocokkan ukuran yang sama persis dengan yang didukung oleh codec. Jika tidak cocok, komponen run-time SDK, dalam banyak kasus, akan secara otomatis mengubah ukuran bingkai video input menjadi sesuatu yang dapat diterima codec.

Contoh kode berikut menemukan format input subtipe yang diteruskan sebagai parameter. Untuk informasi selengkapnya tentang menggunakan kode ini, lihat Menggunakan Contoh Kode.

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

Antarmuka IWMWriter

Menulis File ASF