Pull to refresh

Видео-плеер на основе VLC. Часть 1

Reading time2 min
Views23K

Вступление, или как все начиналось...


Когда я пришел устраиваться на работу, мне показали макет того, что я должен буду сделать. Это был видео-плеер с довольно симпатичным интерфейсом. Предполагалось, что мой плеер будет использовать плеер VLC (а точнее его библиотеку LibVLC) в качестве видео-движка. Дело в том, что плеер, который все привыкли видеть на своем рабочем столе — VLC по сути лишь интерфейс для библиотеки LibVLC, которая позволяет загружать и декодировать видео файлы с локального диска, мультикаст поток.

С языком разработки определились сразу же — С++. Что касается среды разработки, то у меня, как и у начальства были свои предложения (Visual Studio IDE) — в итоге сошлись на Qt IDE, т.к. SDK имеет множество классов, позволяющих ускорить разработку приложения с пользовательским интерфейсом.

Суть проблемы


Требовалось отрисовать полупрозрачный интерфейс поверх видео изображения. Мда… подумал я, и крепко задумался. Задачка была довольно интересная. Посоветовавшись с гуглом, я нашел несколько вариантов:

Решение 1

Поскольку сам плеер состоит из множества плагинов, сделанных как самими разработчиками, так и любителями недоброжелателями, то мысль была сделать свой плагин по типу image overlay. Однако изучив исходники подобных плагинов, я пришел к выводу, что встроить подобную систему с анимацией и отслеживанием нажатий мышки, клавиш и прочего, будет проблематично.

Решение 2

Решение заключалось в том, чтобы поверх видео потока держать transculent окно с интерфейсом. Второе окно, ясное дело должно синхронизироваться с координатами и состоянием первого окна. Но это было хорошо только в теории и к сожалению таким и осталось — реализовать мне не удалось, поскольку я так и не понял каким же образом увязать абсолютно прозрачное окно с полупрозрачными элементами. А потому…

Решение 3

Очень часто в интернетах при описании с движков на основе VLC я натыкался на описание плагина VMem. Поэтому я решил, что это мой последний выход — и оказался прав.

Эврика! Или на сцену выходит VMem...


Итак, модуль VMem, чем он так хорош, какие функции он выполняет?
Модуль предназначен для вывода картинки в участок памяти вместо непосредственного вывода на экран. Причем участок памяти должен быть создан вызывающим приложением. И что самое главное, картинка в памяти будет сформирована только после того, как ней будут применены все фильтры и плагины, для обработки видео изображения (например фильтр устранения чересстрочности, отображения субтитров и т.д.).

LibVLC API


Несколько слов по поводу API: хотя библиотека написана на PureC, существует порты и на другие языки (Python, Java,.NET, Pascal, Objective C) даже есть обертки для С++, Qt… вообщем, разве что BrainFuck не входит в вышеприведенный список. На официальном сайте есть пара уроков, как можно на коленке собрать видео-плеер на основе LibVLC.

Заключение


Вот и закончилась первая часть статьи. В ней я описал основные сложности, с которыми мне пришлось столкнуться, когда я только начал разрабатывать плеер. В следующей части статьи я бы хотел рассказать о том, как организовать вывод картинки на экран и о том, какой графический АПИ (GAPI) для этого лучше использовать.

Список для чтения и посещения:

  1. Официальный сайт разработчиков
  2. Дока по АПИ
  3. Форум для разработчиков
Tags:
Hubs:
Total votes 55: ↑39 and ↓16+23
Comments23

Articles