Mengatur Jenis Media Grup

[Fitur yang terkait dengan halaman ini, DirectShow, adalah fitur warisan. Ini telah digantikan oleh MediaPlayer, IMFMediaEngine, dan Tangkapan 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 Audio/Video Capture 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.]

[API ini tidak didukung dan mungkin diubah atau tidak tersedia di masa mendatang.]

Semua grup harus menentukan jenis media yang tidak dikompresi, baik audio atau video. Jenis media yang tidak dikompresi adalah format yang dilihat atau didengar penonton selama pemutaran. Biasanya, output akhir akan dalam format terkompresi. Untuk informasi selengkapnya, lihat Merender Proyek.

Untuk mengatur format yang tidak dikompresi, buat struktur AM_MEDIA_TYPE dan isi dengan jenis utama, subjenis, dan header format yang sesuai. Untuk video, alokasikan struktur VIDEOINFOHEADER untuk blok format, dan atur lebar, tinggi, dan kedalaman bit. Untuk audio, alokasikan struktur WAVEFORMATEX untuk blok format, dan atur laju sampel, kedalaman bit, dan jumlah saluran. Jika Anda hanya mengatur jenis utama, DES menyediakan default yang wajar untuk nilai lainnya. Dalam praktiknya, Anda harus mengatur nilai secara eksplisit untuk mengontrol output.

Setelah Anda menginisialisasi struktur jenis media, panggil metode IAMTimelineGroup::SetMediaType untuk mengatur jenis media untuk grup.

Contoh berikut menentukan video RGB 16-bit, lebar 320 piksel dengan tinggi 240 piksel:

AM_MEDIA_TYPE mtGroup;  
mtGroup.majortype = MEDIATYPE_Video;
mtGroup.subtype = MEDIASUBTYPE_RGB555;

// Set format headers.
mtGroup.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(VIDEOINFOHEADER));
if (mtGroup.pbFormat == NULL)
{
    return E_OUTOFMEMORY;
}

VIDEOINFOHEADER *pVideoHeader = (VIDEOINFOHEADER*)mtGroup.pbFormat;
ZeroMemory(pVideoHeader, sizeof(VIDEOINFOHEADER));
pVideoHeader->bmiHeader.biBitCount = 16;
pVideoHeader->bmiHeader.biWidth = 320;
pVideoHeader->bmiHeader.biHeight = 240;
pVideoHeader->bmiHeader.biPlanes = 1;
pVideoHeader->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
pVideoHeader->bmiHeader.biSizeImage = DIBSIZE(pVideoHeader->bmiHeader);

// Set the format type and size.
mtGroup.formattype = FORMAT_VideoInfo;
mtGroup.cbFormat = sizeof(VIDEOINFOHEADER);

// Set the sample size.
mtGroup.bFixedSizeSamples = TRUE;
mtGroup.lSampleSize = DIBSIZE(pVideoHeader->bmiHeader);

// Now use this media type for the group.
pGroup->SetMediaType(&mtGroup);

// Clean up.
CoTaskMemFree(mtGroup.pbFormat);

Contoh berikutnya menentukan grup audio, dengan mengatur jenis media grup ke stereo 16-bit, 44100 sampel per detik:

AM_MEDIA_TYPE mt;  
ZeroMemory(&mt, sizeof(AM_MEDIA_TYPE));

mt.majortype = MEDIATYPE_Audio;
mt.subtype = MEDIASUBTYPE_PCM;
mt.formattype = FORMAT_WaveFormatEx;

// Set format block.
mt.pbFormat = (BYTE*)CoTaskMemAlloc(sizeof(WAVEFORMATEX));
if (mt.pbFormat == NULL)
{
    return E_OUTOFMEMORY;
}
mt.cbFormat = sizeof(WAVEFORMATEX);

// Fill in the WAVEFORMATEX structure.
WAVEFORMATEX *wave = (WAVEFORMATEX*) mt.pbFormat;
wave->wFormatTag = WAVE_FORMAT_PCM;
wave->nChannels = 2;  // Stereo
wave->nSamplesPerSec = 44100;
wave->wBitsPerSample = 16;
wave->nBlockAlign = wave->nChannels * wave->wBitsPerSample/8;
wave->nAvgBytesPerSec = wave->nSamplesPerSec * wave->nBlockAlign; 
wave->cbSize = 0;

hr = pGroup->SetMediaType(&mt);
CoTaskMemFree(mt.pbFormat);

Anda juga dapat menggunakan kelas CMediaType di Kelas Dasar DirectShow untuk mengelola jenis media. Ini berisi beberapa metode pembantu yang berguna, dan secara otomatis merilis blok format.

Tentang Tipe Media

Membuat Garis Waktu