C++ 源读取器和自定义不可查找字节流
我正在实现一个自定义的C++ 源读取器和自定义不可查找字节流,c++,ms-media-foundation,asf,C++,Ms Media Foundation,Asf,我正在实现一个自定义的IMFByteStream来通过网络传输视频,但问题是我无法将其对象传递给源解析程序来创建媒体源,因为createObjectFromByTestStream返回错误: 0xc00d36ee:所提供的TestStream预期是可查找的,但不是 当然,我的自定义字节流是不可查找的,因为通过网络查找是不可能的。所以问题是如何使用不可查找的字节流创建媒体源?我的最终目的是创建一个IMFSourceReader对象。源内容的类型为ASF。您的失败可能来自: 您可以尝试使用媒体源,
IMFByteStream
来通过网络传输视频,但问题是我无法将其对象传递给源解析程序来创建媒体源,因为createObjectFromByTestStream
返回错误:
0xc00d36ee:所提供的TestStream预期是可查找的,但不是
当然,我的自定义字节流是不可查找的,因为通过网络查找是不可能的。所以问题是如何使用不可查找的字节流创建媒体源?我的最终目的是创建一个
IMFSourceReader
对象。源内容的类型为ASF。您的失败可能来自:
您可以尝试使用媒体源,但它更像是一个强制性要求,即字节流是可查找的。要解决这个问题,您可以做的一件事是,一旦“读取自”位置不可用,就将其标记为“可查找”,并实现等待 我已经实现了两个
IMFByteStream
接口,一个叫做MediaByTestStream,用于非存储内存流,另一个叫做StoreByTestStream(是的,我知道),用于内存存储
将下面的代码放在IMFByteStream
实现中将消除可查找的错误,并且不会影响您的流式处理能力
/// <summary>
/// Retrieves the characteristics of the byte stream.
/// </summary>
/// <param name="pdwCapabilities">Receives a bitwise OR of zero or more flags. The following flags are defined. [out]</param>
/// <returns>The result of the operation.</returns>
HRESULT MediaByteStream::GetCapabilities(
DWORD *pdwCapabilities)
{
HRESULT hr = S_OK;
// Stream can read, can write, can seek.
*pdwCapabilities = MFBYTESTREAM_IS_READABLE | MFBYTESTREAM_IS_WRITABLE | MFBYTESTREAM_IS_SEEKABLE;
// Return the result.
return hr;
}
您需要一个媒体源,它可以处理不可查找的流。这是一些媒体源需要搜索的关键,他们检查CAP以确保搜索可用。我的目标媒体源的内容类型是ASF。可以创建不需要可查找字节流的ASF媒体源吗?我假设所有查找都是“正向”的,所以很可能对流执行一次简单的查找(只是读取不需要的数据)。目前我正试图创建这样的旁路,但位置设置为0,即使之前的值为1024。所以我不认为所有的搜索都是向前的,但是在可搜索字节流中的位置可以在任何地方设置。所以我必须缓冲我收到的所有数据。这是不可能的。可寻性要求通常是有原因的。您使用的源假定为有限字节流。您要么尽可能调整代码以模拟可搜索性,要么需要切换到scheme处理程序和全功能网络源(与字节流相反)。当字节流携带渐进式下载样式的数据时,查找很有可能仅在较小的系统(格式、元数据)范围内,然后依次读取有效负载。只有当我看到您的解决方案时,我才看到我的问题。我没有设置*pdwCapabilities,而是在HRESULT中返回or。
/// <summary>
/// Moves the current position in the stream by a specified offset.
/// </summary>
/// <param name="SeekOrigin">Specifies the origin of the seek as a member of the MFBYTESTREAM_SEEK_ORIGIN enumeration. The offset is calculated relative to this position. [in]</param>
/// <param name="qwSeekOffset">Specifies the new position, as a byte offset from the seek origin. [in]</param>
/// <param name="dwSeekFlags">Specifies zero or more flags. The following flags are defined. [in]</param>
/// <param name="pqwCurrentPosition">Receives the new position after the seek. [out]</param>
/// <returns>The result of the operation.</returns>
HRESULT MediaByteStream::Seek(
MFBYTESTREAM_SEEK_ORIGIN SeekOrigin,
LONGLONG qwSeekOffset,
DWORD dwSeekFlags,
QWORD *pqwCurrentPosition)
{
HRESULT hr = S_OK;
_seekRequest = true;
// Select the seek origin.
switch (SeekOrigin)
{
case MFBYTESTREAM_SEEK_ORIGIN::msoCurrent:
// If the buffer is less or same.
if ((qwSeekOffset + _position) < size)
_position += qwSeekOffset;
else
_position = size;
break;
case MFBYTESTREAM_SEEK_ORIGIN::msoBegin:
default:
// If the buffer is less or same.
if (qwSeekOffset < size)
_position = qwSeekOffset;
else
_position = size;
break;
}
// Get the current position in the stream.
*pqwCurrentPosition = _position;
// Return the result.
return hr;
}