прямая трансляция с использованием Media Foundation SDK - PullRequest
3 голосов
/ 22 ноября 2011

Существует ли простой способ использовать данные, которые я кодирую, с помощью Media Foundation и передавать их по сети вместо записи в файл WMV?

1 Ответ

2 голосов
/ 20 августа 2012

Во-первых, я полагаю, вам нужно знать, какой формат (закодированный как / содержащийся в нем) вы собираетесь транслировать как.

Я думаю, h264.С Windows 7 Media Foundation создать вспомогательные функции H264.Вам необходимо создать топологию.Источник читает файл, а приемник превращает декодированный и закодированный формат в h264.Все, что вам нужно, это источник и раковина.Вам на самом деле не нужен декодер и кодер.Строитель топологии определяет, что нужно подключить между ними.

Существует функция CreateTranscodeTopology, но она вам не поможет, поскольку она записывает закодированные данные в файл.Вот почему вам нужно создать свою собственную топологию.

Единственное, что вам нужно написать, - это класс, который реализует IMFByteStream.

Ваш приемник должен принять вашу реализацию этого байтового потока.Ваша реализация "Write" функция собирается записать в сокет, в который вы хотите отправить данные.Поэтому, возможно, вы можете передать свой сокет конструктору вашей реализации IMFByteStream или функции обратного вызова.

Я бы также предложил вам поместить некоторые операторы печати в другую функцию, которую вам нужно реализовать в IMFByteStream, потому что SinkWriter вызывает определенныетакие вещи, какGetCapabilities, поэтому вы должны хотя бы вернуться.

HRESULT STDMETHODCALLTYPE NetworkOutputStream::GetCapabilities(__RPC__out DWORD        *pdwCapabilities){HRESULT hr=S_OK; 
 printf("GetCapabilities\n");

*pdwCapabilities= (MFBYTESTREAM_IS_READABLE|MFBYTESTREAM_IS_WRITABLE|MFBYTESTREAM_IS_SEEKABLE);

return hr;
}

Сказав это, если у вас есть проигрыватель на клиенте ("Браузер HTML5"), я бы предложил вам использовать пример "MFCopy".

Создание топологии в основном для воспроизведения и прочегоТаким образом, он декодирует и кодирует его со скоростью, которую должно воспроизводить движение. Но все, что вам нужно, это кодировать файл и отправлять его по проводам. Поэтому взгляните на MFCopy и реализуйте свой собственный IMFByteStream. Вместо создания приемника, который пишет влокальная файловая система передает ваш IMFByteStream в приемник.

...