Bagikan melalui


Cara Memutar File

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

Artikel ini dimaksudkan untuk memberi Anda rasa pemrograman DirectShow. Ini menyajikan aplikasi konsol sederhana yang memutar file audio atau video. Program ini hanya beberapa baris, tetapi menunjukkan beberapa kekuatan pemrograman DirectShow.

Seperti yang dijelaskan dalam artikel Pengantar DirectShow Application Programming , aplikasi DirectShow selalu melakukan langkah-langkah dasar yang sama:

  1. Buat instans Filter Graph Manager.
  2. Gunakan Filter Graph Manager untuk membuat grafik filter.
  3. Jalankan grafik, menyebabkan data berpindah melalui filter.

Untuk mengkompilasi dan menautkan kode dalam topik ini, sertakan file header Dshow.h dan tautkan ke file pustaka statis strmiids.lib. Untuk informasi selengkapnya, lihat Membangun Aplikasi DirectShow.

Mulailah dengan memanggil CoInitialize atau CoInitializeEx untuk menginisialisasi pustaka COM:

HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
    // Add error-handling code here. (Omitted for clarity.)
}

Untuk menjaga semuanya tetap sederhana, contoh ini mengabaikan nilai pengembalian, tetapi Anda harus selalu memeriksa nilai HRESULT dari panggilan metode apa pun.

Selanjutnya, panggil CoCreateInstance untuk membuat Filter Graph Manager:

IGraphBuilder *pGraph;
HRESULT hr = CoCreateInstance(CLSID_FilterGraph, NULL, 
    CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void **)&pGraph);

Seperti yang ditunjukkan, pengidentifikasi kelas (CLSID) CLSID_FilterGraph. Filter Graph Manager disediakan oleh DLL dalam proses, sehingga konteks eksekusi CLSCTX_INPROC_SERVER. DirectShow mendukung model free-threading, sehingga Anda juga dapat memanggil CoInitializeEx dengan bendera COINIT_MULTITHREADED .

Panggilan ke CoCreateInstance mengembalikan antarmuka IGraphBuilder , yang sebagian besar berisi metode untuk membangun grafik filter. Dua antarmuka lain diperlukan untuk contoh ini:

  • IMediaControl mengontrol streaming. Ini berisi metode untuk menghentikan dan memulai grafik.
  • IMediaEvent memiliki metode untuk mendapatkan peristiwa dari Filter Graph Manager. Dalam contoh ini, antarmuka digunakan untuk menunggu pemutaran selesai.

Kedua antarmuka ini diekspos oleh Filter Graph Manager. Gunakan penunjuk IGraphBuilder yang dikembalikan untuk mengkuerinya:

IMediaControl *pControl;
IMediaEvent   *pEvent;
hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

Sekarang Anda dapat membangun grafik filter. Untuk pemutaran file, ini dilakukan dengan satu panggilan metode:

hr = pGraph->RenderFile(L"C:\\Example.avi", NULL);

Metode IGraphBuilder::RenderFile membangun grafik filter yang dapat memutar file yang ditentukan. Parameter pertama adalah nama file, yang direpresentasikan sebagai string karakter lebar (2-byte). Parameter kedua dicadangkan dan harus sama dengan NULL.

Metode ini dapat gagal jika file yang ditentukan tidak ada, atau format file tidak dikenali. Namun, dengan asumsi bahwa metode berhasil, grafik filter sekarang siap untuk diputar. Untuk menjalankan grafik, panggil metode IMediaControl::Run :

hr = pControl->Run();

Saat grafik filter berjalan, data bergerak melalui filter dan dirender sebagai video dan audio. Pemutaran terjadi pada utas terpisah. Anda dapat menunggu pemutaran selesai dengan memanggil metode IMediaEvent::WaitForCompletion :

long evCode = 0;
pEvent->WaitForCompletion(INFINITE, &evCode);

Metode ini memblokir hingga file selesai diputar, atau sampai interval waktu habis yang ditentukan berlalu. Nilai INFINITE berarti aplikasi memblokir tanpa batas waktu sampai file selesai diputar. Untuk contoh penanganan peristiwa yang lebih realistis, lihat Merespons Peristiwa.

Setelah aplikasi selesai, lepaskan penunjuk antarmuka dan tutup pustaka COM:

pControl->Release();
pEvent->Release();
pGraph->Release();
CoUninitialize();

Contoh Kode

Berikut adalah kode lengkap untuk contoh yang dijelaskan dalam artikel ini:

#include <dshow.h>
void main(void)
{
    IGraphBuilder *pGraph = NULL;
    IMediaControl *pControl = NULL;
    IMediaEvent   *pEvent = NULL;

    // Initialize the COM library.
    HRESULT hr = CoInitialize(NULL);
    if (FAILED(hr))
    {
        printf("ERROR - Could not initialize COM library");
        return;
    }

    // Create the filter graph manager and query for interfaces.
    hr = CoCreateInstance(CLSID_FilterGraph, NULL, CLSCTX_INPROC_SERVER, 
                        IID_IGraphBuilder, (void **)&pGraph);
    if (FAILED(hr))
    {
        printf("ERROR - Could not create the Filter Graph Manager.");
        return;
    }

    hr = pGraph->QueryInterface(IID_IMediaControl, (void **)&pControl);
    hr = pGraph->QueryInterface(IID_IMediaEvent, (void **)&pEvent);

    // Build the graph. IMPORTANT: Change this string to a file on your system.
    hr = pGraph->RenderFile(L"C:\\Example.avi", NULL);
    if (SUCCEEDED(hr))
    {
        // Run the graph.
        hr = pControl->Run();
        if (SUCCEEDED(hr))
        {
            // Wait for completion.
            long evCode;
            pEvent->WaitForCompletion(INFINITE, &evCode);

            // Note: Do not use INFINITE in a real application, because it
            // can block indefinitely.
        }
    }
    pControl->Release();
    pEvent->Release();
    pGraph->Release();
    CoUninitialize();
}

Tugas DirectShow Dasar