Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Плеер на основе libvlc / 3 сообщений из 3, страница 1 из 1
27.07.2016, 18:45
    #39281488
kab18
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плеер на основе libvlc
Не получается заставить работать проект из следующего гайда . Проект компилируется, но пробный файл не воспроизводится.
Код
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
// libvlcProject.cpp : Defines the entry point for the console application.
//

#include <stdio.h>
#include <stdlib.h>
#include <vlc/vlc.h>
#include <windows.h>

static void raise(libvlc_exception_t * ex)
{
    if (libvlc_exception_raised (ex))
    {
         fprintf (stderr, "error: %s\n", libvlc_exception_get_message(ex));
         exit (-1);
    }
}
int main(int argc, char* argv[])
{
    const char * const vlc_args[] = {
              "-I", "dummy", /* Don't use any interface */
              "--ignore-config", /* Don't use VLC's config */
              "--plugin-path=C:\\Program Files (x86)\\VideoLAN\\VLC\\plugins\\"};
    libvlc_exception_t ex;
    libvlc_instance_t * inst;
    libvlc_media_player_t *mp;
    libvlc_media_t *m;
    
    libvlc_exception_init (&ex);
    /* init vlc modules, should be done only once */
    inst = libvlc_new (sizeof(vlc_args) / sizeof(vlc_args[0]), vlc_args, &ex);
    raise (&ex);
 
    /* Create a new item */
	m = libvlc_media_new (inst, "c:/try.avi", &ex);
    raise (&ex);
   
    /* XXX: demo art and meta information fetching */
   
    /* Create a media player playing environement */
    mp = libvlc_media_player_new_from_media (m, &ex);
    raise (&ex);
    
    /* No need to keep the media now */
    libvlc_media_release (m);

    /* play the media_player */
    libvlc_media_player_play (mp, &ex);
    raise (&ex);
   
    Sleep (10000); /* Let it play a bit */
   
    /* Stop playing */
    libvlc_media_player_stop (mp, &ex);

    /* Free the media_player */
    libvlc_media_player_release (mp);

    libvlc_release (inst);
    raise (&ex);

    return 0;
}


Скрин работы
...
Рейтинг: 0 / 0
27.07.2016, 19:30
    #39281505
Гость123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плеер на основе libvlc
Если не используется какая-то древняя версия, то хочу сказать: разработчики решили, что пользователям не нужна возможность задавать путь к плагинам и выпилили её начисто. Так что плагины живут либо вместе с программой, либо в системе(для Windows если не ошибаюсь в переменной окружения PATH). По ошибкам в логе похоже на то, что плагины не находятся.

Немного личного мнения о libvlc. Простота встраивания для просто просмотра видео 5+. Всё остальное это невообразимый ужас. Особенно доставляет документация составленная капитаном очевидность, любящим немного приврать. Проект в котором я использовал libvlc является самым костыльным из всех когда либо мной написанных.
...
Рейтинг: 0 / 0
27.07.2016, 21:19
    #39281547
Гость123
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Плеер на основе libvlc
Список того с чем придется столкнуться. Вдруг это у меня кривые руки и кто-нибудь подскажет прямой путь.

Небольшое вступление как происходит встраивание vlc в интерфейс приложение:
Вы даёте vlc хэндл окна для вывода, он полностью его захавывает и запускает рабочий поток. Дальше вся работа происходит полностью асинхронно: когда вы даёте какую-либо команду она встаёт в очередь команд потока и через некоторое время выполняется.

Теперь начнём погружение.

Шаг первый: добавляем кнопку старт/стоп и начинаем её жмакать с максимальной скоростью, рекомендуется иметь компьютер постарее. Через некоторое время состояние кнопки не будет соответсвовать происходящему на экране. Похоже vlc может не добавлять некоторые команды в очередь. Что же делать?

Находим что мы можем подписаться калбэками на почти всё что происходит внутрях потока, так и сделаем. После нажатия кнопки мы её блокируем и разблокируем в калбэке. Ну или почти так... Калбэк происходит внутри рабочего потока, а с интерфейсом работать из других потоков а-та-та. Да ещё одна досадная мелочь: из калбэка нельзя управлять плеером, вроде на мутексах дедлочится.
Ну в общем схема такая: даём команду и вырубаем кнопку, в калбэке посылаем сообщение в основной поток и в основном потоке делаём всё что нужно(включаем кнопку). Вообще всё выглядит весьма логично.

Шаг второй: мы хотим обрабатывать клики мышкой по окну где играется видео, а vlc его захавал. Лезем в документацию и сразу видим libvlc_video_set_mouse_input
Enable or disable mouse click events handling.
By default, those events are handled. This is needed for DVD menus to work, as well as a few video filters such as "puzzle".
See also
libvlc_video_set_key_input().
Warning
This function is only implemented for X11 and Win32 at the moment.
Parameters
p_mi the media player
on true to handle mouse click events, false to ignore them.

Очевидно, что это то что нам надо. Немедленно делаём "libvlc_video_set_mouse_input(player, 0);" А оно не работает! В чём же дело? После поисков и чтения всякого, находим единственный форумный пост в котором говорится, что под Windows для того чтобы отключить перехват мыши, надо также отключить перехват клавы "libvlc_video_set_key_input(player, 0);"
Клики обрабатываются, но осадочек остался.

Шаг третий: мы хотим добавить регулятор громкости. В документации сразу находим libvlc_audio_set_volume. С легким недоверием смотрим на её описание:
Set current software audio volume.
Parameters
p_mi media player
i_volume the volume in percents (0 = mute, 100 = 0dB)
Returns
0 if the volume was set, -1 if it was out of range

Вообще если посмотреть исходный код: -1 возвращается при любой ошибке, которые могут быть разными. Но как говорится "Во многой мудрости много печали; и кто умножает познания, умножает скорбь." поэтому не будем об этом. У меня в vlc версии 2.2.1 всегда возвращает -1 даже если меняет громкость. Скорбь == 0.
Есть неприятная особенность о которой опять не упомянуто в описании. Громкость меняется только если происходить проигрывание(пауза вроде тоже сойдёт), но если файл не открыт или остановлен, то громкость не изменится.
И тут казалось бы у нас же есть калбэк перед началом воспроизведения из первого шага. Но мы упираемся в то, что не можем управлять плеером из калбэка, а только послать сообщение в основной поток. Если пользователь собирается открыть нечто громкое и предусмотрительно делает очень маленькую громкость, он всё равно будет изснасилован в ухи за те десятки миллисекунд пока ходят сообщения.


Я прописал основное с чем предстоит столкнуться. Основная часть моих костылей связана со спецификой проекта: возможность синхронизированно одновременно показывать несколько видео файлов и некоторые другие особенности. Синхронизация состояния нескольких плееров и является основным костыльным адом безумия.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Плеер на основе libvlc / 3 сообщений из 3, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]