Сейчас я поднимаюсь вверх по крутой кривой обучения Windows Media Foundation и сосредотачиваюсь на двух очень похожих примерах кода, которые помогут мне понять технологию. Несмотря на то, что оба используют Media Session для очень простой программы «Play», которая воспроизводит видео из файла, есть важные тонкие различия.
Первый образец - это Microsoft MF Play, расположенный по адресу:
https://msdn.microsoft.com/en-us/library/windows/desktop/dd979592(v=vs.85).aspx
Он не инициализирует COM и не выполняет блокировки критических разделов, но при этом очень хорошо воспроизводит видео. Ограничит ли отсутствие использования COM его использование другими способами, например, при обработке нескольких видеопотоков для разделения окон посредством многопоточности? Поскольку этот код находится в сети, я могу наивно предполагать, что этот код более актуален.
Второй образец взят из книги «Разработка приложений Microsoft Media Foundation - Антон Полингер». Я загрузил образец кода отсюда: https://www.microsoftpressstore.com/content/images/9780735656598/downloads/9780735656598_files.zip
Эта программа Play в папке Chapter 3 немного сложнее из-за использования этих функций инициализации COM:
// initialize COM
hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
...
// uninitialize COM
CoUninitialize();
Он также использует несколько блокировок критических разделов, используя:
CComCritSecLock<CComAutoCriticalSection> lock(m_critSec);
Но загадочным образом нет соответствующих анлочков (). Так может кто-нибудь объяснить эти потенциальные важные различия между этими двумя образцами кода и какими из них я должен использовать? Меня беспокоит, что, если я не буду использовать методы COM, у меня могут возникнуть проблемы позже, когда я попытаюсь передать несколько видео в несколько окон, или, что еще хуже, у меня могут возникнуть проблемы с надежностью.
Кстати, код Polinger работает, но не обрабатывает изменение размера окна во время воспроизведения видео. Я попытался добавить код, аналогичный тому, как это делает код MS, используя этот код после события изменения размера окна:
m_pVideoDisplay->SetVideoPosition(NULL, &rcDest)
Использование этого просто привело к зависанию программы.
Любая помощь будет принята с благодарностью!