Поддерживаемые протоколы
Media Foundation поддерживает следующие протоколы:
Протокол потоковой передачи в реальном времени (RTSP)
RTSP в основном используется для потоковой передачи мультимедийного содержимого. Он может использовать UDP или TCP в качестве транспортных протоколов. UDP является наиболее эффективным для доставки содержимого, так как накладные расходы на пропускную способность меньше, чем при использовании протоколов на основе TCP. Несмотря на то, что протокол TCP обеспечивает надежную доставку пакетов, ПРОТОКОЛ TCP не подходит для цифровых потоков мультимедиа, где эффективное использование пропускной способности важнее, чем случайные потерянные пакеты.
Протокол HTTP
HTTP использует ПРОТОКОЛ TCP и используется веб-серверами. Схема "httpd://" указывает, что источник можно скачать с веб-сервера. HTTP также используется в случае брандмауэров, которые обычно настроены для приема HTTP-запросов и обычно отклоняют другие протоколы потоковой передачи.
Приложение может получить протоколы, поддерживаемые Media Foundation, с помощью интерфейса IMFNetSchemeHandlerConfig . Для этого приложение сначала должно получить количество протоколов, вызвав IMFNetSchemeHandlerConfig::GetNumberOfSupportedProtocols , а затем получить тип протокола на основе индекса, вызвав IMFNetSchemeHandlerConfig::GetSupportedProtocolType. Этот метод возвращает одно из значений, определенных в перечислении MFNETSOURCE_PROTOCOL_TYPE .
Приложение также может получить схемы, поддерживаемые сопоставителем источника, вызвав функцию MFGetSupportedSchemes .
Смена протокола
Когда приложение указывает "mms://" в качестве схемы URL-адреса, сопоставитель источника выполняет операцию смены протокола . В этом процессе сопоставитель источника определяет оптимальный протокол для сетевого источника для получения содержимого. Как правило, для потоковой передачи мультимедиа RTSP с UDP (RTSPU) является более эффективным, чем HTTP. Тем не менее, если содержимое размещается на веб-сервере, лучше выбрать ПРОТОКОЛ HTTP.
Смена протокола также может произойти, если попытка использовать протокол, указанный в схеме URL-адресов, завершается сбоем. Например, протокол может завершиться ошибкой, если брандмауэр блокирует пакеты UDP. В этом случае сопоставитель источника переключается на HTTP.
Смена протокола не применяется, если схема URL-адресов содержит определенный протокол, например "rtspu://". Кроме того, смена не выполняется, если проверка подлинности завершается неудачно или сервер достиг предела клиентских подключений. Рекомендуется, чтобы приложения указали схему "mms://" и позволили сопоставительу источника выбрать оптимальный протокол для сценария.
В следующей таблице приведен порядок смены.
Разрешенные схемы | Порядок смены протокола |
---|---|
mms:// или rtsp:// | Быстрый кэш включен:
|
rtspu:// | RTSPU |
rtspt:// | RTSPT |
https:// |
|
httpd:// | HTTPD |
Получение текущего протокола
После операции смены протокола источник сети может использовать протокол, отличный от протокола, указанного приложением в схеме URL-адресов. Результат смены протокола доступен приложению после того, как сетевой источник установит соединение с сервером мультимедиа.
Чтобы получить протокол и транспорт, используемые для получения содержимого, приложение может получить значения свойств для свойства MFNETSOURCE_PROTOCOL и свойства MFNETSOURCE_TRANSPORT объекта IPropertyStore из сетевого источника.
В следующем коде показано, как получить эти значения.
// Create an IPropertyStore object.
IPropertyStore *pProp = NULL;
hr = CreatePropertyStore(&pProp);
PROPVARIANT var;
PropVariantInit(&var);
// Get the property store from the network source.
// The network source is created by the source resolver. Not shown.
if (SUCCEEDED(hr))
{
hr = pNetworkSource->QueryInterface
(__uuidof(IPropertyStore),
(void**)&pProp);
}
if (SUCCEEDED(hr))
{
// Create a property key.
PROPERTYKEY key;
// Get the MFNETSOURCE_PROTOCOL property value.
key.fmtid = MFNETSOURCE_PROTOCOL;
hr = pProp->GetValue (key, &var);
// Get the MFNETSOURCE_TRANSPORT property value.
key.fmtid = MFNETSOURCE_TRANSPORT;
key.pid = 0;
hr = pProp->GetValue (key, &var);
}
В приведенном выше примере кода IPropertyStore::GetValue получает значение MFNETSOURCE_PROTOCOL, которое является членом перечисления MFNETSOURCE_PROTOCOL_TYPE . Для MFNETSOURCE_TRANSPORT значение является членом перечисления MFNETSOURCE_TRANSPORT_TYPE .
Кроме того, приложение может получить те же значения с помощью службы MFNETSOURCE_STATISTICS_SERVICE. Чтобы использовать эту службу, приложение может вызвать функцию MFGetService , чтобы получить хранилище свойств из сетевого источника. Это хранилище свойств содержит статистику сети в свойстве MFNETSOURCE_STATISTICS . Значения протокола и транспорта можно получить, указав MFNETSOURCE_PROTOCOL_ID и MFNETSOURCE_TRANSPORT_ID, определенные в перечислении MFNETSOURCE_STATISTICS_IDS . В следующем коде показано, как получить значения протокола и транспорта с помощью службы MFNETSOURCE_STATISTICS_SERVICE.
// Create an IPropertyStore object.
IPropertyStore *pProp = NULL;
hr = CreatePropertyStore(&pProp);
HRESULT hr = S_OK;
hr = MFGetService(
pMediaSource,
MFNETSOURCE_STATISTICS_SERVICE,
IID_IPropertyStore,
(void**) & pProp);
if (SUCCEEDED(hr))
{
// Create a property key.
PROPERTYKEY key;
// Get the property value.
key.fmtid = MFNETSOURCE_STATISTICS;
key.pid = MFNETSOURCE_PROTOCOL_ID;
hr = pProp->GetValue (key, &var);
// Get the transport value.
key.fmtid = MFNETSOURCE_STATISTICS;
key.pid = MFNETSOURCE_TRANSPORT_ID;
hr = pProp->GetValue (key, &var);
}
Включение и отключение протоколов
Приложение может настроить сетевой источник таким образом, чтобы определенные протоколы пропускались во время смены. Для этого свойства источника сети используются для отключения определенных протоколов. В следующей таблице показаны свойства и протоколы, которые они управляют.
Свойство | Описание |
---|---|
MFNETSOURCE_ENABLE_HTTP | Включает или отключает HTTP и HTTPD. |
MFNETSOURCE_ENABLE_RTSP | Включает или отключает RTSPU и RTSPT. |
MFNETSOURCE_ENABLE_TCP | Включает или отключает RTSPT. |
MFNETSOURCE_ENABLE_UDP | Включает или отключает RTSPU. |
MFNETSOURCE_ENABLE_DOWNLOAD | Включает или отключает HTTPD. |
MFNETSOURCE_ENABLE_STREAMING | Включает или отключает RTSPU, RTSPT и HTTP. |
Связанные темы