Bekerja dengan Sampel Media
Topik ini menjelaskan cara menggunakan antarmuka IMFSample untuk memanipulasi objek sampel media. Untuk gambaran umum sampel media, lihat Sampel Media.
Untuk membuat sampel media baru, panggil fungsi MFCreateSample. Awalnya, daftar buffer sampel kosong. Untuk menambahkan buffer ke akhir daftar, panggil IMFSample::AddBuffer.
Kode berikut menunjukkan cara membuat sampel dan menambahkan buffer ke dalamnya.
HRESULT CreateMediaSample(DWORD cbData, IMFSample **ppSample)
{
HRESULT hr = S_OK;
IMFSample *pSample = NULL;
IMFMediaBuffer *pBuffer = NULL;
hr = MFCreateSample(&pSample);
if (SUCCEEDED(hr))
{
hr = MFCreateMemoryBuffer(cbData, &pBuffer);
}
if (SUCCEEDED(hr))
{
hr = pSample->AddBuffer(pBuffer);
}
if (SUCCEEDED(hr))
{
*ppSample = pSample;
(*ppSample)->AddRef();
}
SafeRelease(&pSample);
SafeRelease(&pBuffer);
return hr;
}
Cara yang disarankan untuk mendapatkan buffer dari sampel adalah dengan memanggil IMFSample::ConvertToContiguousBuffer. Metode ini mengembalikan buffer berkelanjutan tunggal.
Untuk melakukan iterasi melalui buffer dalam daftar, mulailah dengan memanggil IMFSample::GetBufferCount. Metode ini mengembalikan jumlah buffer. Kemudian panggil IMFSample::GetBufferByIndex dan tentukan indeks buffer untuk diambil. Buffer diindeks dari nol.
Kode berikut menunjukkan cara melakukan iterasi melalui buffer dalam sampel.
IMFMediaBuffer *pBuffer = NULL;
DWORD cBuffers = 0;
hr = pSample->GetBufferCount(&cBuffers);
if (SUCCEEDED(hr))
{
for (DWORD i = 0; i < cBuffers; i++)
{
hr = pSample->GetBufferByIndex(i, &pBuffer);
// Use buffer (not shown).
SafeRelease(&pBuffer);
if (FAILED(hr))
{
break;
}
}
}
Sampel memiliki stempel waktu dan durasi. Stempel waktu menunjukkan kapan data dalam sampel harus dirender, relatif terhadap jam presentasi. Durasinya adalah lamanya waktu di mana data harus dirender. Biasanya komponen yang menghasilkan himpunan data stempel waktu awal dan durasi. Nilai-nilai ini mungkin dimodifikasi oleh Sesi Media. Untuk mengatur stempel waktu, panggil IMFSample::SetSampleTime. Untuk mengatur durasi, panggil IMFSample::SetSampleDuration.
Sampel juga dapat memiliki atribut, yang berisi informasi tambahan tentang sampel. Untuk daftar atribut sampel, lihat Atribut Sampel. Untuk mengatur dan mengambil atribut, gunakan Antarmuka IMFAttributes, yang diwarisi IMFSample.
Topik terkait