Метод IMFByteStream::Read (mfobjects.h)
Считывает данные из потока.
Синтаксис
HRESULT Read(
[in] BYTE *pb,
[in] ULONG cb,
[out] ULONG *pcbRead
);
Параметры
[in] pb
Указатель на буфер, который получает данные. Вызывающий объект должен выделить буфер.
[in] cb
Размер буфера в байтах.
[out] pcbRead
Получает количество байтов, копируемых в буфер. Этот параметр не может иметь значение NULL.
Возвращаемое значение
Если этот метод завершается успешно, он возвращает S_OK. В противном случае возвращается код ошибки HRESULT .
Комментарии
Этот метод считывает не более кб байтов из текущей позиции в потоке и копирует их в буфер, предоставленный вызывающим объектом. Число прочитанных байтов возвращается в параметре pcbRead . Метод не возвращает код ошибки при достижении конца файла, поэтому приложение должно проверка значение в pcbRead после возврата метода.
Этот метод является синхронным. Он блокируется до завершения операции чтения.
Примечания о реализации:Этот метод должен обновить текущую позицию в потоке, добавив число прочитанных байтов, которое задается значением, возвращенным в параметре pcbRead , в текущую позицию. Другие методы, которые могут обновить текущую позицию: Read, Write, BeginWrite, Seek и SetCurrentPosition.
Этот интерфейс доступен на следующих платформах, если установлены распространяемые компоненты пакета SDK формата 11 для Windows Media:
- Windows XP с пакетом обновления 2 (SP2) и более поздних версий.
- Windows XP Media Center Edition 2005 с установленным KB900325 (Windows XP Media Center Edition 2005) и KB925766 (накопительный пакет обновления для Windows XP Media Center Edition за октябрь 2006 г.).
Примеры
В следующем примере данные из потока байтов считываются в буфер мультимедиа, выделенный вызывающим объектом. Дополнительные сведения о буферах мультимедиа см. в разделе Буферы мультимедиа.
// Read data from a byte stream into a media buffer.
//
// This function reads a maximum of cbMax bytes, or up to the size of the
// buffer, whichever is smaller. If the end of the byte stream is reached, the
// actual amount of data read might be less than either of these values.
//
// To find out how much data was read, call IMFMediaBuffer::GetCurrentLength.
HRESULT ReadFromByteStream(
IMFByteStream *pStream, // Pointer to the byte stream.
IMFMediaBuffer *pBuffer, // Pointer to the media buffer.
DWORD cbMax // Maximum amount to read.
)
{
DWORD cbBufferMax = 0;
DWORD cbRead = 0;
BYTE *pData= NULL;
HRESULT hr = pBuffer->Lock(&pData, &cbBufferMax, NULL);
// Do not exceed the maximum size of the buffer.
if (SUCCEEDED(hr))
{
if (cbMax > cbBufferMax)
{
cbMax = cbBufferMax;
}
// Read up to cbMax bytes.
hr = pStream->Read(pData, cbMax, &cbRead);
}
// Update the size of the valid data in the buffer.
if (SUCCEEDED(hr))
{
hr = pBuffer->SetCurrentLength(cbRead);
}
if (pData)
{
pBuffer->Unlock();
}
return hr;
}
Следующий пример аналогичен, но выделяет новый буфер мультимедиа для хранения данных.
//-------------------------------------------------------------------
// AllocReadFromByteStream
//
// Reads data from a byte stream and returns a media buffer that
// contains the data.
//-------------------------------------------------------------------
HRESULT AllocReadFromByteStream(
IMFByteStream *pStream, // Pointer to the byte stream.
DWORD cbToRead, // Number of bytes to read.
IMFMediaBuffer **ppBuffer // Receives a pointer to the media buffer.
)
{
HRESULT hr = S_OK;
BYTE *pData = NULL;
DWORD cbRead = 0; // Actual amount of data read.
IMFMediaBuffer *pBuffer = NULL;
// Create the media buffer.
// This function allocates the memory for the buffer.
hr = MFCreateMemoryBuffer(cbToRead, &pBuffer);
// Get a pointer to the memory buffer.
if (SUCCEEDED(hr))
{
hr = pBuffer->Lock(&pData, NULL, NULL);
}
// Read the data from the byte stream.
if (SUCCEEDED(hr))
{
hr = pStream->Read(pData, cbToRead, &cbRead);
}
// Update the size of the valid data in the buffer.
if (SUCCEEDED(hr))
{
hr = pBuffer->SetCurrentLength(cbRead);
}
// Return the pointer to the caller.
if (SUCCEEDED(hr))
{
*ppBuffer = pBuffer;
(*ppBuffer)->AddRef();
}
if (pData)
{
pBuffer->Unlock();
}
SafeRelease(&pBuffer);
return hr;
}
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2008 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | mfobjects.h (включая Mfidl.h) |
Библиотека | Mfuuid.lib |