Bagikan melalui


Tentang Jenis Media (DirectShow)

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Pengambilan Audio/Video di Media Foundation. Fitur-fitur tersebut telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan MediaPlayer, IMFMediaEngine , dan Pengambilan Audio/Video di Media Foundation alih-alih DirectShow, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Karena DirectShow bersifat modular, directShow memerlukan cara untuk menjelaskan format data di setiap titik dalam grafik filter. Misalnya, pertimbangkan pemutaran AVI. Data memasukkan grafik sebagai aliran gugus RIFF. Ini diurai ke dalam aliran video dan audio. Aliran video terdiri dari bingkai video, yang mungkin dikompresi. Setelah pendekodean, streaming video adalah serangkaian bitmap yang tidak dikompresi. Aliran audio melalui proses yang sama.

Jenis Media: Cara DirectShow Mewakili Format

Jenis media adalah cara universal dan dapat diperluas untuk menggambarkan format media digital. Ketika dua filter terhubung, mereka menyetujui jenis media. Jenis media mengidentifikasi jenis data apa yang akan dikirimkan filter upstram ke filter hilir, dan tata letak fisik data. Jika dua filter tidak dapat menyetujui jenis media, filter tersebut tidak akan tersambung.

Untuk beberapa aplikasi, Anda tidak perlu khawatir tentang jenis media. Dalam pemutaran file, misalnya, DirectShow menangani semua detail. Jenis aplikasi lain mungkin perlu bekerja langsung dengan jenis media.

Jenis media didefinisikan menggunakan struktur AM_MEDIA_TYPE . Struktur ini berisi informasi berikut:

  • Jenis utama: Jenis utama adalah GUID yang menentukan kategori keseluruhan data. Jenis utama termasuk video, audio, aliran byte yang tidak diparsasi, data MIDI, dan sebagainya.

  • Subjenis: Subjenis adalah GUID lain, yang selanjutnya mendefinisikan format. Misalnya, dalam jenis utama video, ada subjenis untuk RGB-24, RGB-32, UYVY, dan sebagainya. Dalam audio, ada audio PCM, payload MPEG-1, dan lainnya. Subjenis menyediakan lebih banyak informasi daripada jenis utama, tetapi tidak menentukan segala sesuatu tentang format. Misalnya, subjenis video tidak menentukan ukuran gambar atau kecepatan bingkai. Ini didefinisikan oleh blok format, dijelaskan di bawah ini.

  • Blok format: Blok format adalah blok data yang menjelaskan format secara rinci. Blok format dialokasikan secara terpisah dari struktur AM_MEDIA_TYPE . Anggota pbFormat dari struktur AM_MEDIA_TYPE menunjuk ke blok format.

    Anggota pbFormat di ketik batal* karena tata letak blok format berubah tergantung pada jenis media. Misalnya, audio PCM menggunakan struktur WAVEFORMATEX . Video menggunakan berbagai struktur, termasuk VIDEOINFOHEADER dan VIDEOINFOHEADER2. Anggota formattype dari struktur AM_MEDIA_TYPE adalah GUID yang menentukan struktur mana yang terkandung dalam blok format. Setiap struktur format diberi GUID. Anggota cbFormat menentukan ukuran blok format. Selalu periksa nilai-nilai ini sebelum mendereferensikan penunjuk pbFormat .

Jika blok format diisi, maka jenis utama dan subjenis berisi informasi redundan. Namun, jenis dan subjenis utama menyediakan cara mudah untuk mengidentifikasi format tanpa blok format lengkap. Misalnya, Anda dapat menentukan format RGB 24-bit generik (MEDIASUBTYPE_RGB24), tanpa mengetahui semua informasi yang diperlukan oleh struktur VIDEOINFOHEADER , seperti ukuran gambar dan kecepatan bingkai.

Misalnya, filter mungkin menggunakan kode berikut untuk memeriksa jenis media:

HRESULT CheckMediaType(AM_MEDIA_TYPE *pmt)
{
    if (pmt == NULL) return E_POINTER;

    // Check the major type. We're looking for video.
    if (pmt->majortype != MEDIATYPE_Video)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the subtype. We're looking for 24-bit RGB.
    if (pmt->subtype != MEDIASUBTYPE_RGB24)
    {
        return VFW_E_INVALIDMEDIATYPE;
    }

    // Check the format type and the size of the format block.
    if ((pmt->formattype == FORMAT_VideoInfo) &&
         (pmt->cbFormat >= sizeof(VIDEOINFOHEADER) &&
         (pmt->pbFormat != NULL))
    {
        // Now it's safe to coerce the format block pointer to the
        // correct structure, as defined by the formattype GUID.
        VIDEOINFOHEADER *pVIH = (VIDEOINFOHEADER*)pmt->pbFormat;
    
        // Examine pVIH (not shown). If it looks OK, return S_OK.
        return S_OK;
    }

    return VFW_E_INVALIDMEDIATYPE;
}

Struktur AM_MEDIA_TYPE juga berisi beberapa bidang opsional. Ini dapat digunakan untuk memberikan informasi tambahan, tetapi filter tidak diperlukan untuk menggunakannya:

  • lSampleSize. Jika bidang ini bukan nol, bidang ini menentukan ukuran setiap sampel. Jika nol, itu menunjukkan bahwa ukuran sampel dapat berubah dari sampel menjadi sampel.
  • bFixedSizeSamples. Jika bendera Boolean ini TRUE, itu berarti nilai dalam lSampleSize valid. Jika tidak, Anda harus mengabaikan lSampleSize.
  • bTemporalCompression. Jika bendera Boolean ini FALSE, itu berarti bahwa semua bingkai adalah bingkai kunci.

Grafik Filter dan Komponennya