Поддерживаемые протоколы
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. |
Связанные разделы