Menggunakan Two-Pass Encoding (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.]

Beberapa codec mendukung pengodean dua-pass untuk format tertentu. Dalam beberapa kasus, codec mengharuskan format tertentu dikodekan menggunakan dua pass. Saat pengodean dua pass digunakan, Anda mengirim sampel untuk aliran ke codec sebelum pengodean lulus. Codec menganalisis sampel dan mengonfigurasi pass pengodean berdasarkan analisis. Ini menghasilkan file yang dikodekan dengan lebih efisien.

Untuk menentukan apakah codec mendukung pengodean satu pass, atau dua kali, atau keduanya, untuk format tertentu, panggil IWMCodecInfo3::SetCodecEnumerationSetting dengan g_wszNumPasses dan nilai yang sesuai, lalu hitung format untuk melihat apakah format yang Anda inginkan dikembalikan. Untuk informasi selengkapnya tentang codec Windows Media yang mendukung pengodean dua-pass, lihat Memilih Metode Pengodean.

Anda dapat menggunakan pengodean dua-pass dengan Windows Media Format SDK dengan memanggil metode antarmuka IWMWriterPreprocess .

Dalam kasus di mana pengodean dua-pass diperlukan untuk format tertentu, tetapi aplikasi gagal melakukan pass pra-pemrosesan, panggilan pertama ke WriteSample akan gagal dengan NS_E_INVALID_NUM_PASSES.

Contoh fungsi berikut menunjukkan cara melakukan pengodean dua-pass. Fungsi ini dipanggil setelah penulis diatur dengan profil dan dimulai. Untuk informasi selengkapnya tentang menggunakan kode ini, lihat Menggunakan Contoh Kode.

HRESULT PreProcess(IWMWriter* pWriter, DWORD dwInputNum)
{
    HRESULT hr        = S_OK;
    DWORD   dwMaxPass = 0;

    IWMWriterPreprocess* pPreProc = NULL;

    // Get the writer preprocessor interface.
    hr = pWriter->QueryInterface(IID_IWMWriterPreprocess, 
                                 (void**) &pPreProc);
    GOTO_EXIT_IF_FAILED(hr);

    // Check that the input can be preprocessed.
    hr = pPreProc->GetMaxPreprocessingPasses(dwInputNum,0, &dwMaxPass);
    GOTO_EXIT_IF_FAILED(hr);

    if(dwMaxPass == 0)
    {
        hr = NS_E_INVALID_REQUEST;
        goto Exit;
    }

    // Set the number of preprocessing passes to the maximum.
    hr = pPreProc->SetNumPreprocessingPasses(dwInputNum, 0, dwMaxPass);
    GOTO_EXIT_IF_FAILED(hr);

    // Call BeginWriting before calling BeginPreprocessingPass
    hr = pWriter->BeginWriting();

    // Start preprocessing the first pass.
    hr = pPreProc->BeginPreprocessingPass(dwInputNum, 0);
    GOTO_EXIT_IF_FAILED(hr);

    // TODO: Make repeated calls to pPreProc->PreprocessSample to
    // preprocess all the samples in the stream.

    // End preprocessing.
    hr = pPreProc->EndPreprocessingPass(dwInputNum, 0);
    GOTO_EXIT_IF_FAILED(hr);

    // TODO: If the maximum number of preprocessing passes is greater
    // than one, repeat the preprocessing steps for each pass.

Exit:
    SAFE_RELEASE(pPreProc);
    Return hr;
}

Menulis File ASF