Метод IMFMediaSource::Start (mfidl.h)
Запускает, ищет или перезапускает источник мультимедиа, указывая, где начать воспроизведение.
Синтаксис
HRESULT Start(
[in] IMFPresentationDescriptor *pPresentationDescriptor,
[in] const GUID *pguidTimeFormat,
[in] const PROPVARIANT *pvarStartPosition
);
Параметры
[in] pPresentationDescriptor
Указатель на интерфейс IMFPresentationDescriptor дескриптора представления источника мультимедиа. Чтобы получить дескриптор презентации, вызовите IMFMediaSource::CreatePresentationDescriptor. Вы можете изменить дескриптор презентации перед вызовом Start, чтобы выбрать или отменить выбор потоков или изменить типы мультимедиа.
[in] pguidTimeFormat
Указатель на GUID, указывающий формат времени. Формат времени определяет единицы измерения для параметра pvarStartPosition . Если значение равно GUID_NULL, то формат времени равен 100 наносекундным единицам. Некоторые источники мультимедиа могут поддерживать идентификаторы GUID дополнительного формата времени. Этот параметр может принимать значение NULL. Если значение равно NULL, оно эквивалентно GUID_NULL.
[in] pvarStartPosition
Указывает, где начать воспроизведение. Единицы измерения этого параметра указываются в формате времени, заданном в pguidTimeFormat. Если формат времени GUID_NULL, тип variant должен быть VT_I8 или VT_EMPTY. Используйте VT_I8 , чтобы указать новую начальную позицию в 100-наносекундных единицах. Используйте VT_EMPTY , чтобы начать с текущей позиции. Другие форматы времени могут использовать другие типы PROPVARIANT .
Возвращаемое значение
Метод возвращает HRESULT. Допустимые значения включают, но не ограничиваются, значения, приведенные в следующей таблице.
Код возврата | Описание |
---|---|
|
Метод выполнен успешно. |
|
Начальная позиция находится после окончания презентации (источник мультимедиа ASF). |
|
Аппаратному устройству не удалось запустить потоковую передачу. Этот код ошибки может возвращать источник мультимедиа, представляющий аппаратное устройство, например камеру. Например, если камера уже используется другим приложением, метод может вернуть этот код ошибки. |
|
Недопустимый запрос на запуск. Например, начальная позиция находится после конца презентации. |
|
Был вызван метод Shutdown источника мультимедиа. |
|
Источник мультимедиа не поддерживает формат времени, указанный в pguidTimeFormat. |
Комментарии
Этот метод является асинхронным. Если операция выполнена успешно, источник мультимедиа отправляет следующие события:
- Для каждого нового потока источник отправляет событие MENewStream . Это событие отправляется для первого вызова Start , в котором отображается поток. Данные события являются указателем на интерфейс IMFMediaStream потока.
- Для каждого обновленного потока источник отправляет событие MEUpdatedStream . Поток обновляется, если поток уже существовал при вызове start (например, если приложение ищет во время воспроизведения). Данные события являются указателем на интерфейс IMFMediaStream потока.
- Если предыдущее состояние было остановлено, источник отправляет событие MESourceStarted .
- Если предыдущее состояние было запущено или приостановлено, а начальной позицией является текущая позиция (VT_EMPTY), источник отправляет событие MESourceStarted .
- Если предыдущее состояние было запущено или приостановлено и указана новая начальная позиция, источник отправляет событие MESourceSeeked .
- Если источник отправляет событие MESourceStarted , каждый поток мультимедиа отправляет событие MEStreamStarted . Если источник отправляет событие MESourceSeeked , каждый поток отправляет событие MEStreamSeeked .
Вызов start приводит к поиску , если предыдущее состояние было запущено или приостановлено, а новая начальная позиция не VT_EMPTY. Не каждый источник мультимедиа может искать. Если источник мультимедиа может искать, метод IMFMediaSource::GetCharacteristics возвращает флаг MFMEDIASOURCE_CAN_SEEK .
События из источника мультимедиа не синхронизируются с событиями из потоков мультимедиа. Таким образом, если вы ищете источник мультимедиа, вы по-прежнему можете получать примеры из предыдущей позиции после получения события MESourceSeeked . Если необходимо синхронизировать операции, дождитесь события потока MEStreamSeeked, которое помечает точную точку в потоке, где выполняется поиск.
Конец Stream
Когда поток воспроизводится до конца, поток отправляет событие MEEndOfStream . Когда все выбранные потоки достигнут конца, источник мультимедиа отправляет событие MEEndOfPresentation .Если начальная позиция находится после конца выбранного потока (но до конца презентации), поток должен отправлять MEEndOfStream сразу после MEStreamStarted/MEStreamSeeked. Если воспроизведение достигает конца презентации и запускается снова из текущей позиции, потоки повторно отправляют событие MEEndOfStream, а источник мультимедиа повторно отправляет событие MEEndOfPresentation . Эти события сообщают конвейеру больше не запрашивать данные.
Во время обратного воспроизведения начало файла считается концом потока. Дополнительные сведения см. в разделе Реализация управления скоростью.
Реализация начального запуска
Когда источник мультимедиа выполняет поиск, он должен начинаться с первого ключевого кадра до времени поиска, чтобы декодер мог декодировать образцы для целевого времени начала. Конвейер отменит все декодированные примеры, которые являются слишком ранними.Если время начала VT_EMPTY , а предыдущее состояние было запущено или приостановлено, источник должен возобновить работу с текущей позиции. В этом случае нет необходимости повторно отправлять предыдущий ключевой кадр, так как декодер по-прежнему будет иметь данные, которые были отправлены ранее.
При проверке параметра pPresentationDescriptor источник мультимедиа должен проверка только сведения, необходимые для правильной работы. В частности, клиент может добавлять частные атрибуты в дескриптор представления. Наличие дополнительных атрибутов не должно приводить к сбою метода Start .
После вызова Start каждый поток в источнике мультимедиа должен выполнять одно из следующих действий:
- Доставка данных мультимедиа в ответ на звонки IMFMediaStream::RequestSample .
- Отправка событий MEStreamTick , чтобы указать разрыв в потоке.
- Отправьте событие MEEndOfStream , чтобы указать конец потока.
Примеры
Следующий пример запускает воспроизведение презентации в 1 секунду.
PROPVARIANT var;
PropVariantInit(&var);
var.vt = VT_I8;
var.hVal.QuadPart = 10000000; // 10^7 = 1 second.
hr = pSource->Start(pPresentationDescriptor, NULL, &var);
Требования
Требование | Значение |
---|---|
Минимальная версия клиента | Windows Vista [классические приложения | Приложения UWP] |
Минимальная версия сервера | Windows Server 2008 [классические приложения | Приложения UWP] |
Целевая платформа | Windows |
Header | mfidl.h |
Библиотека | Mfuuid.lib |