Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Skompresowane dane wyjściowe generowane przez kodery Windows Media Video 9 nie mogą być prawidłowo dekompresowane bez niektórych danych dostarczonych przez koder. Te dane, nazywane danymi prywatnymi kodera, muszą być dołączane do typu nośnika wyjściowego. Dane prywatne kodera można uzyskać, wywołując metody interfejsu IWMCodecPrivateData. Przekaż w przeciwnym razie pełną strukturę DMO_MEDIA_TYPE do IWMCodecPrivateData::SetPartialOutputType. Następnie wywołaj IWMCodecPrivateData::GetPrivateData dwa razy, raz, aby uzyskać rozmiar danych, a następnie ponownie skopiować dane do buforu tego rozmiaru. Utwórz nowy bufor do przechowywania VIDEOINFOHEADER struktury z dołączonymi danymi prywatnymi, a następnie skopiuj strukturę i dane do tego buforu. Na koniec ustaw element pbFormat struktury DMO_MEDIA_TYPE na adres nowo utworzonego buforu i ustaw człon cbFormat na połączony rozmiar w bajtach, uwzględniający VIDEOINFOHEADER oraz dane prywatne.
Jeśli używasz programu MediaFoundation, możesz utworzyć strukturę DMO_MEDIA_TYPE z interfejsu IMFMediaType, wywołując MFCreateAMMediaTypeFromMFMediaType.
Należy użyć danych prywatnych enkodera uzyskanych po pierwszym ustawieniu właściwości w enkoderze. Jeśli jakiekolwiek właściwości zostaną zmienione, musisz pobrać nowe dane prywatne. Jeśli nie używasz danych prywatnych uzyskanych po ustawieniu wszystkich właściwości dla sesji kodowania, dekoder może nie być w stanie zdekompresować danych.
W poniższym przykładzie kodu pokazano, jak uzyskać prywatne dane dla typu wideo:
HRESULT GetFinalOutputType(DMO_MEDIA_TYPE* pMedia, IMediaObject* pDMO)
{
// WARNING //
// This function does not deallocate the memory pointed to by
// pMedia->pbFormat. If the VIDEOINFOHEADER referenced by pbFormat
// was dynamically allocated, a reference to it must be kept before
// calling this function so that it can be freed.
// Perform simple parameter checks.
if(pMedia == NULL || pDMO == NULL)
return E_POINTER;
if(pMedia->formattype != MEDIATYPE_VideoInfo)
return E_INVALIDARG;
HRESULT hr = S_OK;
IWMCodecPrivateData* pPrivData = NULL;
BYTE* pbData = NULL;
DWORD cbData = 0;
BYTE* pbNewVidInf = NULL;
DWORD cbNewVidInf = 0;
BYTE* pbNewPriv = NULL;
// Get the private data interface.
hr = pDMO->QueryInterface(IID_IWMCodecPrivateData,
(void**)&pPrivData);
GOTO_EXIT_IF_FAILED(hr);
// Set the partial media type.
hr = pPrivData->SetPartialOutputType(pMedia);
GOTO_EXIT_IF_FAILED(hr);
// Get the size of the private data.
hr = pPrivData->GetPrivateData(NULL, &cbData);
GOTO_EXIT_IF_FAILED(hr);
// Allocate memory for the private data.
pbData = new BYTE[cbData];
if(pbData == NULL)
{
hr = E_OUTOFMEMORY;
goto Exit:
}
// Get the private data.
hr = pPrivData->GetPrivateData(pbData, &cbData);
// Allocate memory for the new VIDEOINFOHEADER.
cbNewVidInf = pMedia->cbFormat + cbData;
pbNewVidInf = new BYTE[cbNewVidInf];
// Copy the VIDEOINFOHEADER to the new buffer.
memcpy((void*)pbNewVidInf, (void*)pMedia->pbFormat, pMedia->cbFormat);
// Get the address of the first byte following the VIDEOINFOHEADER.
pbNewPriv = pbNewVidInf + pMedia->cbFormat;
// Copy the private data to the new buffer.
memcpy((void*)pbNewPriv, (void*)pbData, cbData);
// Set the new VIDEOINFOHEADER in the DMO_MEDIA_TYPE.
pMedia->pbFormat = pbNewVidInf;
pMedia->cbFormat = cbNewVidInf;
Exit:
SAFE_RELEASE(pPrivData);
SAFE_ARRAY_DELETE(pbData);
pbNewPriv = NULL;
return hr;
}
Notatka
Prywatne dane kodera kodera wideo nie mają gwarancji, że są takie same jak dane prywatne dostarczane przez inną implementację tego samego kodera koderowego dla tej samej konfiguracji. Tę wartość należy zawsze wygenerować, wykonując kroki opisane w tym temacie. nigdy nie skopiuj prywatnych danych z innego pliku.
Tematy pokrewne
-
Konfigurowanie kodowania wideo