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;
        }