Mengatur Properti pada Efek dan Transisi

[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.]

Banyak efek dan transisi DirectShow Editing Services mendukung properti yang mengontrol perilakunya. Aplikasi dapat mengatur nilai properti menggunakan antarmuka IPropertySetter . Efek atau objek transisi yang mendasar harus mendukung IDispatch untuk mengatur properti. Dengan efek dan transisi video, aplikasi dapat mengatur rentang nilai yang berubah dari waktu ke waktu. (Misalnya, Anda dapat mengatur transisi penghapusan untuk bergerak bolak-balik di seluruh bingkai.) Dengan efek audio, nilai properti statis dan tidak dapat berubah dari waktu ke waktu. Satu-satunya pengecualian adalah efek Amplop Volume , yang mendukung properti dinamis untuk tingkat volume.

Untuk mengatur properti, lakukan langkah-langkah berikut.

  1. Buat instans setter properti (CLSID_PropertySetter).
  2. Isi struktur DEXTER_PARAM dan DEXTER_VALUE dengan data properti. Struktur ini dibahas di bawah ini.
  3. Teruskan struktur DEXTER_PARAM dan DEXTER_VALUE ke metode IPropertySetter::AddProp .
  4. Ulangi langkah 2 dan 3 untuk setiap properti yang ingin Anda atur.
  5. Teruskan penunjuk antarmuka IPropertySetter ke metode IAMTimelineObj::SetPropertySetter .

Struktur DEXTER_PARAM menentukan properti mana yang sedang diatur. Ini berisi anggota berikut.

  • Nama: Nama properti
  • dispID: Dicadangkan, harus nol
  • nValues: Jumlah nilai

Struktur DEXTER_VALUE menentukan nilai properti pada waktu tertentu. Ini berisi anggota berikut.

  • v: Jenis VARIAN yang menentukan nilai baru untuk properti . Anggota vt dari VARIAN ini mendefinisikan jenis data properti. Untuk informasi selengkapnya tentang jenis VARIAN , lihat Windows SDK.
  • rt: Waktu referensi ketika properti mengasumsikan nilai ini, relatif terhadap waktu mulai efek atau transisi. Waktu mulai efek atau transisi relatif terhadap waktu mulai objek induknya.
  • dwInterp: Bendera yang menentukan bagaimana properti berubah dari nilai sebelumnya ke nilai baru. Dengan bendera DEXTERF_JUMP, properti langsung melompat ke nilai baru pada waktu yang ditentukan. Dengan bendera DEXTERF_INTERPOLATE, properti diinterpolasi secara linear dari nilai sebelumnya.

Jika Anda mengatur anggota vt ke VT_BSTR, setter properti membuat konversi yang diperlukan. Untuk nilai floating-point, sertakan nol di depannya sebelum tempat desimal. Misalnya, 0,3, bukan .3.

Catatan

Aplikasi harus menghindari mengandalkan konversi dari BSTRs ke nilai numerik. Jika properti memiliki nilai numerik, gunakan jenis VARIAN numerik yang sesuai dimungkinkan.

 

Nilai properti dapat berubah dari waktu ke waktu, sehingga metode IPropertySetter::AddProp mengambil struktur DEXTER_PARAM tunggal dan pointer ke array struktur DEXTER_VALUE . Array menentukan sekumpulan nilai berbasis waktu untuk properti . Anggota array harus dalam urutan waktu naik, dan anggota nValues dari struktur DEXTER_PARAM harus sama dengan panjang array.

Contoh kode berikut membuat data properti untuk transisi Penghapusan SMPTE . Ini mengatur kode penghapusan ke 120, yang membuat penghapusan oval. Ini mengatur waktu referensi ke nol, menunjukkan awal transisi.

IPropertySetter     *pProp;   // Property setter
IAMTimelineObj      *pTransObj;  // Transition object
// Create an SMPTE Wipe transition object. (Not shown)

hr = CoCreateInstance(CLSID_PropertySetter, NULL, CLSCTX_INPROC_SERVER,
    IID_IPropertySetter, (void**) &pProp);

// Error checking is omitted for clarity...

DEXTER_PARAM param;
DEXTER_VALUE *pValue = (DEXTER_VALUE*)CoTaskMemAlloc(sizeof(DEXTER_VALUE));

// Initialize the parameter. 
param.Name = SysAllocString(L"MaskNum");
param.dispID = 0;
param.nValues = 1;

// Initialize the value.
pValue->v.vt = VT_I4;
pValue->v.lVal = 120; // Oval
pValue->rt = 0;
pValue->dwInterp = DEXTERF_JUMP;

pProp->AddProp(param, pValue);

// Free allocated resources.
SysFreeString(param.Name);
VariantClear(&(pValue->v));
CoTaskMemFree(pValue);

// Set the property on the transition.
pTransObj->SetPropertySetter(pProp);
pProp->Release();

Properti yang Berubah Secara Dinamis

Setelah Anda merender proyek pengeditan video, dimungkinkan untuk memodifikasi properti objek efek atau transisi saat grafik sedang berjalan. Namun, ini hanya dimungkinkan jika Anda mengatur properti pada objek tersebut sebelum aplikasi bernama IRenderEngine::ConnectFrontEnd. Jika demikian, Anda dapat memanggil IAMTimelineObj::GetPropertySetter pada efek atau transisi, menghapus atau memodifikasi properti, dan perubahan akan terjadi secara dinamis saat grafik berjalan. Mungkin ada anomali visual saat perubahan terjadi, jadi ini direkomendasikan hanya untuk pratinjau. Jangan ubah properti saat Anda menulis proyek ke file.

Jika Anda tidak mengatur properti apa pun pada objek efek atau transisi sebelum Anda memanggil ConnectFrontEnd, Anda tidak dapat menambahkan properti ke dalamnya saat grafik sedang berjalan.

Bekerja dengan Efek dan Transisi