Считыватель источника и пользовательский поток байтов

Я реализую кастом IMFByteStream для потоковой передачи видео по сети, но проблема в том, что я не могу передать его объект в источник разрешения для создания источника мультимедиа, потому что CreateObjectFromByteStream возвращает ошибку:

0xc00d36ee: Предоставленный тестовый поток, как ожидали, будет доступен для поиска, и это не так.

Конечно, мой пользовательский поток байтов не доступен для поиска, потому что поиск по сети невозможен. Итак, вопрос в том, как создать источник мультимедиа, используя поток байтов без возможности поиска? Мое конечное назначение — создать IMFSourceReader объект. Тип исходного содержимого — ASF.

0

Решение

Я реализовал два 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

Другие решения

Ваша ошибка предположительно происходит от:

Во время создания источника мультимедиа распознаватель источника создает поток байтов для файла, из которого источник мультимедиа считывает содержимое ASF. Чтобы преобразование времени было успешным, поток байтов, связанный с файлом ASF, должен иметь возможности поиска; в противном случае приложение получает MF_E_BYTESTREAM_NOT_SEEKABLE ошибка с начала … звоните.

Вы можете попробовать медиа источник свойства но это больше похоже на обязательное требование, что поток байтов является доступным для поиска. Единственное, что вы можете сделать, чтобы обойти это, — это действительно пометить как доступный для поиска и выполнить ожидание, когда еще не будет считано положение из чтения.

0