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 错误代码。
注解
此方法最多从流中的当前位置读取 cb 字节,并将其复制到调用方提供的缓冲区中。 读取的字节数在 印刷电路板 参数中返回。 方法在到达文件末尾时不会返回错误代码,因此,在方法返回后,应用程序应在检查该属性值。
此方法是同步方法。 它会阻止,直到读取操作完成。
实现说明:此方法应通过将已读取的字节数(由 在印刷板Read 参数中返回的值指定)添加到当前位置来更新流中的当前位置。 可更新当前位置的其他方法包括 Read、 Write、 BeginWrite、 Seek 和 SetCurrentPosition。
如果安装了 Windows Media Format 11 SDK 可再发行组件,则此接口在以下平台上可用:
- 具有 Service Pack 2 的 Windows XP (SP2) 及更高版本。
- Windows XP Media Center Edition 2005 KB900325 (Windows XP Media Center Edition 2005) 和安装KB925766 (2006 年 10 月更新汇总的 Windows XP Media Center Edition) 。
示例
以下示例将数据从字节流读取到调用方分配的媒体缓冲区。 有关媒体缓冲区的详细信息,请参阅 媒体缓冲区。
// 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;
}
下一个示例类似,但分配了一个新的媒体缓冲区来保存数据。
注意 此示例使用 SafeRelease 函数释放接口指针。
//-------------------------------------------------------------------
// 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 |
标头 | mfobjects.h (包括 Mfidl.h) |
Library | Mfuuid.lib |