源阅读器和自定义不可搜索字节流

时间:2016-12-31 07:15:24

标签: c++ ms-media-foundation asf

我正在实现自定义IMFByteStream以通过网络流式传输视频,但问题是我无法将其对象传递给源解析器来创建媒体源,因为CreateObjectFromByteStream正在返回错误:

  

0xc00d36ee:提供的字节流预计是可搜索的,而不是。

当然,我的自定义字节流不可寻找,因为无法通过网络进行搜索。所以问题是如何使用不可搜索的字节流创建媒体源?我的最终目的是创建一个IMFSourceReader对象。源内容的类型是ASF。

2 个答案:

答案 0 :(得分:1)

我已经实现了两个IMFByteStream接口,一个叫做MediaByteStream,用于非存储内存流,另一个叫做StoreByteStream(我知道),它用于内存存储。

将以下代码放在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;
        }

如果您希望实施Seek界面的IMFByteStream方法,但是在您的情况下(网络流式传输),您可以返回搜索位置。

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

答案 1 :(得分:0)

你的失败应该来自:

  

During the creation of the media source, the source resolver creates a byte stream for the file from which the media source reads the ASF content. In order for the time conversions to be successful, the byte stream associated with the ASF file must have seeking capabilities; otherwise, the application gets the MF_E_BYTESTREAM_NOT_SEEKABLE error from the Begin... call.

您可以尝试使用媒体源properties,但它看起来更像是字节流可以搜索的强制要求。关于你可以做的事情就是确实标记为可寻找并且一旦有一个尚未可用的位置读取就实现等待。