Condividi tramite


Metodo IMFASFIndexer::GetCompletedIndex (wmcontainer.h)

Recupera l'indice completato dall'oggetto indicizzatore ASF.

Sintassi

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

Parametri

[in] pIIndexBuffer

Puntatore all'interfaccia IMFMediaBuffer di un buffer multimediale che riceve i dati dell'indice.

[in] cbOffsetWithinIndex

Offset dei dati da recuperare, in byte dall'inizio dei dati dell'indice. Impostare su 0 per la prima chiamata. Se sono necessarie chiamate successive (il buffer non è sufficientemente grande da contenere l'intero indice), impostare sul byte dopo l'ultimo recuperato.

Valore restituito

Il metodo restituisce un valore HRESULT. I valori possibili includono, ma non sono limitati a, quelli indicati nella tabella seguente.

Codice restituito Descrizione
S_OK
Il metodo è riuscito.
MF_E_INDEX_NOT_COMMITTED
Non è stato eseguito il commit dell'indice prima di tentare di ottenere l'indice completato. Per altre informazioni, vedere la sezione Osservazioni.

Commenti

Questo metodo usa il maggior numero possibile di buffer e aggiorna la lunghezza del buffer in modo appropriato.

Se pIIndexBuffer è sufficientemente grande da contenere l'intero buffer, cbOffsetWithinIndex deve essere 0 e la chiamata deve essere eseguita una sola volta. In caso contrario, non devono esistere spazi tra buffer successivi.

L'utente deve scrivere questi dati nel contenuto in cbOffsetFromIndexStart byte dopo la fine dell'oggetto dati ASF. È possibile chiamare IMFASFIndexer::GetIndexPosition per determinare la posizione iniziale dell'indice ASF.

Questa chiamata non riesce a meno che non sia stato chiamato IMFASFIndexer::CommitIndex . Dopo aver chiamato GetCompletedIndex, il chiamante deve chiamare IMFASFContentInfo::GenerateHeader e sovrascrivere l'intestazione ASF esistente con la nuova intestazione; in caso contrario, l'intestazione ASF non corrisponderà al contenuto e il file non è garantito che venga riprodotto correttamente.

Non è possibile utilizzare questo metodo in uno scenario di lettura dell'indice. È possibile utilizzare questo metodo solo quando si scrivono indici.

Esempio

Nell'esempio seguente viene illustrato come scrivere l'indice ASF completo in un flusso di 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;
};

Requisiti

Requisito Valore
Client minimo supportato Windows Vista [solo app desktop]
Server minimo supportato Windows Server 2008 [solo app desktop]
Piattaforma di destinazione Windows
Intestazione wmcontainer.h
Libreria Mfuuid.lib

Vedi anche

Oggetto ASF Index

IMFASFIndexer

Utilizzo dell'indicizzatore per scrivere un nuovo indice