Menggunakan Two-Pass Encoding (Windows Media Format 11 SDK)

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 kode lulus 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 SDK Format Media Windows dengan memanggil metode antarmuka IWMWriterPreprocess.

Dalam kasus di mana pengodean dua pass diperlukan untuk format tertentu, tetapi aplikasi gagal melakukan pass praprosem, 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