Bagikan melalui


Metode IMFASFIndexer::GetCompletedIndex (wmcontainer.h)

Mengambil indeks yang telah selesai dari objek pengindeks ASF.

Sintaks

HRESULT GetCompletedIndex(
  [in] IMFMediaBuffer *pIIndexBuffer,
  [in] QWORD          cbOffsetWithinIndex
);

Parameter

[in] pIIndexBuffer

Penunjuk ke antarmuka IMFMediaBuffer dari buffer media yang menerima data indeks.

[in] cbOffsetWithinIndex

Offset data yang akan diambil, dalam byte dari awal data indeks. Atur ke 0 untuk panggilan pertama. Jika panggilan berikutnya diperlukan (buffer tidak cukup besar untuk menahan seluruh indeks), atur ke byte setelah yang terakhir diambil.

Mengembalikan nilai

Metode mengembalikan HRESULT. Nilai yang mungkin termasuk, tetapi tidak terbatas pada, yang ada dalam tabel berikut.

Menampilkan kode Deskripsi
S_OK
Metode berhasil.
MF_E_INDEX_NOT_COMMITTED
Indeks tidak diterapkan sebelum mencoba untuk mendapatkan indeks yang telah selesai. Untuk informasi selengkapnya, lihat Keterangan.

Keterangan

Metode ini menggunakan buffer sebanyak mungkin, dan memperbarui panjang buffer dengan tepat.

Jika pIIndexBuffer cukup besar untuk berisi seluruh buffer, cbOffsetWithinIndex harus 0, dan panggilan hanya perlu dilakukan sekali. Jika tidak, seharusnya tidak ada celah antara buffer berturut-turut.

Pengguna harus menulis data ini ke konten di byte cbOffsetFromIndexStart setelah akhir objek data ASF. Anda dapat memanggil IMFASFIndexer::GetIndexPosition untuk menentukan posisi awal indeks ASF.

Panggilan ini tidak akan berhasil kecuali IMFASFIndexer::CommitIndex telah dipanggil. Setelah memanggil GetCompletedIndex, pemanggil harus memanggil IMFASFContentInfo::GenerateHeader dan menimpa header ASF yang ada dengan header baru; jika tidak, header ASF tidak akan cocok dengan konten, dan file tidak dijamin untuk diputar dengan benar.

Anda tidak dapat menggunakan metode ini dalam skenario pembacaan indeks. Anda hanya dapat menggunakan metode ini saat menulis indeks.

Contoh

Contoh berikut menunjukkan cara menulis indeks ASF lengkap ke aliran byte.

HRESULT WriteASFIndex(IMFASFIndexer *pIndex,IMFByteStream *pStream)
{
    const DWORD cbChunkSize = 4096;

    IMFMediaBuffer *pBuffer = NULL;

    QWORD cbIndex = 0;
    DWORD cbIndexWritten = 0;

    HRESULT hr = pIndex->GetIndexWriteSpace(&cbIndex);
    if (FAILED(hr))
    {
        goto done;
    }

    hr = MFCreateMemoryBuffer(cbChunkSize, &pBuffer);
    if (FAILED(hr))
    {
        goto done;
    }

    while (cbIndexWritten < cbIndex)
    {
        BYTE *pData = NULL;
        DWORD cbData = 0;
        DWORD cbWritten = 0;

        hr = pIndex->GetCompletedIndex(pBuffer, cbIndexWritten);
        if (FAILED(hr))
        {
            goto done;
        }

        hr = pBuffer->Lock(&pData, NULL, &cbData);
        if (FAILED(hr))
        {
            goto done;
        }

        hr = pStream->Write(pData, cbData, &cbWritten);

        (void)pBuffer->Unlock();

        if (FAILED(hr))
        {
            goto done;
        }

        cbIndexWritten += cbData;
    }

done:
    SafeRelease(&pBuffer);
    return hr;
};

Persyaratan

Persyaratan Nilai
Klien minimum yang didukung Windows Vista [hanya aplikasi desktop]
Server minimum yang didukung Windows Server 2008 [hanya aplikasi desktop]
Target Platform Windows
Header wmcontainer.h
Pustaka Mfuuid.lib

Lihat juga

Objek Indeks ASF

IMFASFIndexer

Menggunakan Pengindeks untuk Menulis Indeks Baru