Membaca File ASF di DirectShow (Windows Media Format 11 SDK)

[Fitur yang terkait dengan halaman ini, Windows Media Format 11 SDK, adalah fitur warisan. Ini telah digantikan oleh Pembaca Sumber dan Penulis Sink. Pembaca Sumber dan Penulis Sink telah dioptimalkan untuk Windows 10 dan Windows 11. Microsoft sangat menyarankan agar kode baru menggunakan Pembaca Sumber dan Penulis Sink alih-alih Windows Media Format 11 SDK, jika memungkinkan. Microsoft menyarankan agar kode yang ada yang menggunakan API warisan ditulis ulang untuk menggunakan API baru jika memungkinkan.]

Pemutaran file ASF ditangani oleh filter Pembaca WM ASF . Ketika Pembaca WM ASF membaca file, ia secara otomatis membuat pin output untuk setiap aliran, termasuk aliran Web, aliran perintah skrip, dan jenis aliran arbitrer lainnya. Dalam kasus beberapa file laju bit, pin dibuat hanya untuk aliran yang saat ini dipilih.

Pembaca WM ASF mendukung antarmuka DirectShow IMediaSeeking , yang memungkinkan aplikasi untuk melakukan pencarian temporal dalam file. Namun, pemutaran pada kecepatan selain 1.0 (seperti yang ditentukan dalam IMediaSeeking::SetRate) tidak didukung.

Filter ini juga mengekspos beberapa antarmuka Windows Media Format SDK seperti yang dijelaskan dalam tabel berikut ini.

Antarmuka Bagaimana terekspos Komentar
IWMDRMReader Melalui IServiceProvider pada filter Disediakan untuk aplikasi yang perlu memutar konten yang dilindungi oleh Digital Rights Management (DRM). Antarmuka ini juga dapat digunakan untuk mendapatkan antarmuka lain pada Objek Pembaca secara langsung.
IWMHeaderInfo QueryInterface pada filter Disediakan sehingga aplikasi dapat membaca atribut file dan konten, serta informasi dan metadata penanda dan skrip.
IWMReaderAdvanced QueryInterface pada filter Diterapkan sebagian pada filter sehingga aplikasi dapat mengakses metode informasi pada objek Pembaca WM.
IWMReaderAdvanced2 QueryInterface pada filter Diterapkan sebagian pada filter sehingga aplikasi dapat mengakses metode informasi pada Objek Pembaca.

 

Filter Pembaca WM ASF pertama kali tersedia di DirectShow 8.0. Versi filter yang dikirim dengan DirectShow 8.1 dan 9.0 mendukung versi 7. x dari Windows Media Format SDK. Versi terbaru filter, bersama dengan komponen QASF lainnya, dikirim dengan dan mendukung Windows Media Format 9 Series SDK, dan versi yang lebih baru, dan menggantikan filter di DirectX 9.0. Jika Anda menginstal Windows Media Format SDK setelah menginstal DirectX 8. x atau 9. x SDK, Anda akan menimpa versi DirectX qasf.dll dengan versi Seri 9. Ini seharusnya tidak menimbulkan masalah kecuali mungkin dalam satu skenario di mana hal ini akan mengakibatkan perilaku yang berbeda dalam metode DirectShow IGraphBuilder::RenderFile . Windows Media Format 9 Series SDK versi WM ASF Reader adalah filter sumber default untuk ekstensi nama file .asf, .wmv, dan .wma. Ini berarti bahwa Pembaca WM ASF secara otomatis dibuat dan ditambahkan ke grafik filter oleh Filter Graph Manager dalam metode seperti IGraphBuilder::RenderFile atau IGraphBuilder::AddSourceFilter ketika file jenis ini ditentukan. Di DirectX 9.0 dan yang lebih lama, dan Windows XP Service Pack 1 dan yang lebih lama, metode RenderFile menggunakan Filter Sumber Media Windows yang lebih lama. Perilaku ini dipertahankan untuk memastikan kompatibilitas mundur dengan aplikasi yang menggunakan Pemutar Media Windows 6.4. Untuk informasi selengkapnya tentang Filter Sumber Windows Media warisan, lihat Dokumentasi DirectShow SDK.

Untuk memutar file ASF dengan konten berbasis Windows Media menggunakan Pembaca WM ASF, tiga langkah utama adalah membuat instans Filter Graph Manager, memanggil IGraphBuilder::RenderFile untuk membuat grafik, lalu memanggil IMediaControl::Run untuk memutar file. Contoh kode berikut adalah program lengkap yang memutar file ASF menggunakan DirectShow. Untuk menjalankan contoh ini, Anda harus menginstal DirectX SDK dan lingkungan build Anda harus dikonfigurasi sesuai dengan instruksi dalam topik dokumentasi DirectShow SDK "Menyiapkan Lingkungan Build." Selain itu, Anda harus menentukan file di komputer Anda dalam panggilan ke RenderFile.

#include <dshow.h>
#include <stdio.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"test.wmv", 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();
}

Perhatikan bahwa kode aplikasi untuk contoh sederhana ini tidak pernah mereferensikan Pembaca WM ASF secara khusus. Filter tersebut dibuat, disambungkan, dijalankan, dan akhirnya dirilis oleh Filter Graph Manager. Namun, dalam banyak skenario, Anda mungkin ingin mengonfigurasi Pembaca WM ASF sebelum memulai pemutaran.