Видео-плеер на основе VLC. Часть 1
Вступление, или как все начиналось...
Когда я пришел устраиваться на работу, мне показали макет того, что я должен буду сделать. Это был видео-плеер с довольно симпатичным интерфейсом. Предполагалось, что мой плеер будет использовать плеер VLC (а точнее его библиотеку LibVLC) в качестве видео-движка. Дело в том, что плеер, который все привыкли видеть на своем рабочем столе — VLC по сути лишь интерфейс для библиотеки LibVLC, которая позволяет загружать и декодировать видео файлы с локального диска, мультикаст поток.
С языком разработки определились сразу же — С++. Что касается среды разработки, то у меня, как и у начальства были свои предложения (Visual Studio IDE) — в итоге сошлись на Qt IDE, т.к. SDK имеет множество классов, позволяющих ускорить разработку приложения с пользовательским интерфейсом.
Суть проблемы
Требовалось отрисовать полупрозрачный интерфейс поверх видео изображения. Мда… подумал я, и крепко задумался. Задачка была довольно интересная. Посоветовавшись с гуглом, я нашел несколько вариантов:
Решение 1
Поскольку сам плеер состоит из множества плагинов, сделанных как самими разработчиками, так и любителями
Решение 2
Решение заключалось в том, чтобы поверх видео потока держать transculent окно с интерфейсом. Второе окно, ясное дело должно синхронизироваться с координатами и состоянием первого окна. Но это было хорошо только в теории и к сожалению таким и осталось — реализовать мне не удалось, поскольку я так и не понял каким же образом увязать абсолютно прозрачное окно с полупрозрачными элементами. А потому…
Решение 3
Очень часто в интернетах при описании с движков на основе VLC я натыкался на описание плагина VMem. Поэтому я решил, что это мой последний выход — и оказался прав.
Эврика! Или на сцену выходит VMem...
Итак, модуль VMem, чем он так хорош, какие функции он выполняет?
Модуль предназначен для вывода картинки в участок памяти вместо непосредственного вывода на экран. Причем участок памяти должен быть создан вызывающим приложением. И что самое главное, картинка в памяти будет сформирована только после того, как ней будут применены все фильтры и плагины, для обработки видео изображения (например фильтр устранения чересстрочности, отображения субтитров и т.д.).
LibVLC API
Несколько слов по поводу API: хотя библиотека написана на PureC, существует порты и на другие языки (Python, Java,.NET, Pascal, Objective C) даже есть обертки для С++, Qt… вообщем, разве что BrainFuck не входит в вышеприведенный список. На официальном сайте есть пара уроков, как можно на коленке собрать видео-плеер на основе LibVLC.
Заключение
Вот и закончилась первая часть статьи. В ней я описал основные сложности, с которыми мне пришлось столкнуться, когда я только начал разрабатывать плеер. В следующей части статьи я бы хотел рассказать о том, как организовать вывод картинки на экран и о том, какой графический АПИ (GAPI) для этого лучше использовать.