Видеоплеер На Базе Vlc. Часть 1



Введение, или как все начиналось.

Когда я пришел подавать заявление на работу, мне показали модель того, что мне придется делать.

Это был видеоплеер с довольно приятным интерфейсом.

Предполагалось, что мой плеер будет использовать в качестве видеодвижка плеер VLC (вернее его библиотеку LibVLC).

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

С языком разработки мы определились сразу — C++.

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

в SDK есть много классов для ускорения разработки приложения пользовательского интерфейса.



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

Необходимо было нарисовать полупрозрачный интерфейс поверх видеоизображения.

Хммм.

Я думал, и думал крепко.

Проблема была весьма интересной.

Посоветовавшись с Google, я нашел несколько вариантов:

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

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

будет проблематично.



Решение 2
Решением было сохранить прозрачное окно с интерфейсом поверх видеопотока.

Второе окно, естественно, должно быть синхронизировано с координатами и состоянием первого окна.

Но это было хорошо только в теории и, к сожалению, так и осталось — мне не удалось это реализовать, так как я так и не понял, как связать абсолютно прозрачное окно с полупрозрачными элементами.

И потому что.



Решение 3
Очень часто в Интернете при описании движков на базе VLC я встречал описание плагина VMem. Поэтому я решил, что это мое последнее средство – и был прав.



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

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

Причём раздел памяти должен быть создан вызывающим приложением.

И самое главное, изображение в памяти будет сформировано только после того, как будут применены все фильтры и плагины для обработки видеоизображения (например, фильтр деинтерлейсинга, отображения субтитров и т.п.

).



LibVLC API

Несколько слов об API: хотя библиотека написана на PureC, есть порты на другие языки (Python, Java, .

NET, Pascal, Objective C) есть даже обертки для C++, Qt. в общем, за исключением того, что BrainFuck не включен в приведенный выше список.

На официальном сайте есть пара уроков, как собрать видеоплеер на базе LibVLC на коленке.



Заключение

Вот и закончилась первая часть статьи.

В ней я описал основные трудности, с которыми мне пришлось столкнуться, когда я впервые начал разработку плеера.

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



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

  1. Официальный сайт разработчиков
  2. Док по API
  3. Форум разработчиков
Теги: #C++ #Qt #DirectX #VLC #Разработка веб-сайтов
Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.