Vlc управление из python

Обновлено: 02.07.2024

Цель: Реализовать потоковое вещание с двух спутниковых тарелок в сеть, используя имеющийся сервер с двумя DVB картами. По возможности также предусмотреть вещание с имеющихся камер Dlink DCS-2102. Сервер должен быть в меру автономным и требовать минимум человеческого участия для своей работы. В качестве операционной системы будет использоваться Ubuntu 10.04 LTS. Функции медиасервера будет выполнять VLC media player. Этот медиаплейер не только обладает широкими возможностями по перекодированию и сетевому вещанию, но также может одновременно обрабатывать несколько медиапотоков и поддерживает различные интерфейсы удаленного управления. Управление потоками будет производиться посредством VideoLAN manager в комбинации с telnet интерфейсом. В статье рассматриваются вопросы:

  • Как установить VLC в качестве службы
  • Как управлять VLC посредством VLM
  • Слежение за состоянием службы VLC

В статье НЕ будут рассматриваться следующие вопросы:

  • Установка Ubuntu на сервер
  • Настройка сети, добавление поддержки multicast
  • Определение параметров и списка каналов, передаваемых со спутника.

В Ubuntu есть специальная сборка VLC, не требующая наличия X-сервера.

Исполняемый файл в этом случае будет называться cvlc.

Чтобы не требовалось участия пользователя для запуска VLC, превратим его в системную службу. Сделать это не очень сложно. Поместите следующий текст в файл /etc/init.d/vlcd:

и сделайте его исполняемым:

Поместите следующий текст в файл /etc/default/vlcd (он содержит параметры запуска VLC):

Суммарно VLC будет запускаться со следующими опциями:

Запустите следующий скрипт с правами root:

Он создаст нового пользователя, под которым будет запускаться VLC и все необходимые каталоги. После чего создаст службу и добавит правило в таблицу маршрутизации для multicast потока. Принадлежность группе video позволит VLC иметь доступ к DVB устройствам. На этом создание службы можно считать законченным. Однако VLC пока что малополезен, поскольку понятия не имеет что и куда нужно вещать.

Общие сведения

VLM в работе оперирует таким понятием как медиапоток (media). Медиапоток представляет собой некий именованный объект, состоящий из набора входных потоков данных (между которыми можно переключаться), выходного потока и, возможно, параметров. Медиапотоки можно динамически создавать, удалять, запускать и останавливать. В качестве входного потока может использоваться любой источник, который в состоянии воспроизвести ваша сборка VLC. Аналогично, выходным потоком может являться любой выходной поток, поддерживаемый VLC. К сожалению, далеко не все параметры пока можно настраивать посредством VLM, именно поэтому часть из них пришлось вынести в строку запуска. Управление VLM осуществляется с помощью команд, последовательность которых можно записывать в файлы. Описание команд можно найти на странице официальной документации VLM. Нам потребуются следующие:

  • new mediastream broadcast [loop]
    Создает новый активный (enabled) или выключенный (disabled) медиапоток с именем mediastream. Попытка создать поток, имя которого совпадает с существующим, приведет к ошибке. Ключевое слово loop означает, что при завершении входного потока будет попытка воспроизвести его заново (нужно на случай обрыва связи при вещании из сети или для зацикленного воспроизведения локального файла).
  • del mediastream
    Удаляет медиапоток с именем medisatream. Попытка удаления несуществующего потока приведет к ошибке.
  • control mediastream
    Запускает (play) или останавливает (stop) медиапоток с именем mediastream.
  • setup mediastream input <опции>
    Устанавливает параметры входящего потока для медиапотока mediastream.
  • setup mediastream output <опции>
    Устанавливает параметры исходящего потока для медиапотока mediastream.
  • del media
    Удаляет все медиапотоки
  • load filename.cfg
    Последовательно выполняет команды VLM, записанные в файле filename.cfg Замечание: если одна из команд файла приведет к ошибке, то остаток файла будет проигнорирован

Скрипт запуска службы, приведенный ранее, написан так, что VLC после старта будет сначала пытаться выполнить VLM команды из файла /etc/vlcd/vlm.conf, а потом изо всех файлов с расширением .cfg, расположенных в /etc/vlcd/vlm.conf.d Поместим в файл /etc/vlcd/vlm.cfg следующий текст:

Тем самым при запуске VLC будут созданы четыре неактивных ненастроенных медиапотока: два для спутников (S-0, S-1) и два для камер (webcam1, webcam2).

Настройка видеокамер

Файлы конфигурации для камер довольно просты: /etc/vlcd/vlm.avail.d/cam_web1.cfg

Попробуем разобрать их подробнее.

Заметьте, что в данном случае VLC не занимается перекодированием аудио/видео, тем самым почти не нагружая процессор. Если же вам потребуется перекодировать поток (изменить размер изображеня, аудио/видео кодек, и т.п.) обратитесь к документации VLC (не VLM) и соответствующим образом исправьте строку output. Еще раз подчеркну, параметры, указываемые после input и output являются обычными опциями командной строки VLC для входных (обычно указываются последними) и выходных (указываются после --sout ) потоков соответственно.

Настройка спутникового вещания

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

Внимание! Строчка "setup S-0 output . " разбита на несколько частей исключительно для удобства чтения! В реальной конфигурации все, что начинается с "setup S-0 output" и до пустой строки перед "control S-0 play" должно быть записано в одну строку.

Модулем VLM можно управлять двумя способами: через HTTP посредством XML файлов определенного формата и через telnet просто указывая команды VLM. Я выбрал telnet ввиду простоты управления как из консоли, так и из скриптов. Фактически, в описанной конфигурации все управление сводится в подключении по telnet и вводу команды "load /path/to/filename.cfg". Все остальное сделают команды в файле. Для облегчения работы используется специальный скрипт на языке expect.

Для автоматизации процесса переключения каналов по расписанию, а также корректного переключения на последние каналы после перезапуска VLC используется еще один вспомогательный скрипт.

При его запуске с параметрами:

будут выполнены команды из файлов /etc/vlcd/vlm.avail.d/s0-prog1.cfg и /etc/vlcd/vlm.avail.d/s1-prog2.cfg, а также созданы две символические ссылки: /etc/vlcd/vlm.conf.d/s0-schedule.cfg и /etc/vlcd/vlm.conf.d/s1-schedule.cfg, указывающие на вышеупомянутые файлы. Ссылки как раз и обеспечат включение нужных каналов при запуске, т.к. при старте службы будут выполнены все файлы из каталога /etc/vlcd/vlm.conf.d

В качестве имени программы можно передать специальное ключевое слово nop, означающее, что каналы на данной карте (в соответствии с порядком указания) переключаться не будут.

На этом работу по настройке VLM можно считать оконченной. Можно запустить службу:

Увы, VLC при длительной работе с DVB излишней стабильностью не страдает, особенно в части утечек памяти. В версии 1.0.6-1ubuntu1 (Ubuntu 10.04) ситуация значительно улучшилась, теперь он способен проработать без сюрпризов как минимум неделю (на 9.04 он съедал 2Гб оперативной памяти примерно за сутки/двое, на 10.10 достаточно пары минут). Однако время от времени он по-прежнему сходит с ума и либо поглощает оперативную память, пока процесс не упадет с "Out of memory", либо просто зависает (что, к счастью случается крайне редко).

По этой причине состояние процесса необходимо отслеживать и перезапускать vlc при необходимости).

Создайте файл /usr/bin/check_proc_mem со следующим содержимым:

и добавьте его запуск в /etc/crontab:

Если качестве системы мониторинга уже используется Nagios, то будет логичным возложить обязанности отслеживания состояния VLC на нее.

Установка дополнительных пакетов

Необходимо установить поддержку NRPE на медиа-сервере:

Убедитесь, что файл /etc/nagios/nrpe.cfg содержит следующие строки (создайте при необходимости):

При помощи visudo добавьте в /etc/sudoers следующие строки:

Создайте в /usr/lib/nagios/plugins скрипт check_proc_mem со следующим содержимым:

Это так называемый check plugin для Nagios. Принимает три параметра. Первый - путь к файлу, содержащему PID интересующего процесса. Второй - предел для предупреждения, третий - критический предел. Скрипт запускает ps для нужного процесса и определяет количество потребляемой памяти.

Дальнейшая настройка производится на сервере Nagios.

Описание медиа-сервера в Nagios

Создайте в /etc/nagios файл mediaserver.cfg со следующим содержимым:

и добавьте в /etc/nagios/nagios.cfg строку:

Зависание

Утечки памяти

Добавляем в /etc/nagios/mediaserver.cfg:

Если все было сделано верно, то теперь у вас в наличии есть собственный медиа-сервер передающий в сеть видео как со спутника, так и видеокамер.

  • Не очень стабильная работа VLC из-за чего, в частности, пришлось отказаться от перекодирования потоков
  • Сложность настройки output потоков
  • Удаленное переключение каналов придется продумывать и реализовывать отдельно (пока - только по расписанию)

Что еще можно сделать:

  • формировать все скрипты в deb-пакет.
  • транслировать не только сигнал со спутников и вебкамер, но и локальные файлы, слайдшоу.
  • задействовав плагины, можно добавлять собственное лого на изображение, формировать видео типа Picture-in-Picture
  • одновременно с трансляцией записывать потоки в файл на диске.
  • организовывать и web-трансляции средствами VLC, но опять же стабильности такого решения будет под вопросом. Хотя в качестве бэкенда VLC вполне можно использовать.
  • построить распределенную систему вещания (создав целые "гирлянды" из медиа-серверов)


Copyright © 2008–2013 Vladimir Voroshilov — Powered by Pelican

Работаю с плеером vlc из python, и у меня есть необходимость непрерывно воспроизводить видео из папки. Вариант, предлагаемый в документации к библиотеке - создать плейлист со всеми видео, и запустить плеер, но это мне не подходит, т.к. видео будут приходить в эту папку "извне", а добавить во время работы плеера уже ничего нельзя.

Что я пока придумал - воспроизводить их по одному в бесконечном цикле, плеер при этом не создаётся заново, а просто устанавливается новое медиа для него. Когда заканчивается видео, на секунду плеер закрывается и виден рабочий стол, перед началом следующего. Это критично для меня. Я пробывал без обращения к базе данных (из неё просто берётся название следующего видео) - и ситуация та же.

Самое интересное в том, что моим способом видеоплеер всё таки "непрерывно"(видна задержка, но на рабочий стол не выкидывает) воспроизводит видео mp4 примерно до 10 - 12 Кб в качестве 720p. При следующем в очереди .webm, например, уже с 10 Кб начинает выкидывать (100% он его просто дольше открывает)

__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь

Meta.vlc какая то ошибка при воспроизведение видео
Вызывающий поток не может получить доступ к данному объекту, так как владельцем этого объекта.

Некоректное воспроизведение видео файла *.m2ts плеером VLC
Доброго времени суток))) Столкнулся с такой проблемой. Плеер VLC (настройки default) не особо.

Потоковое воспроизведение видео через плеер
Доброго времени суток! Появилась идея создания интернет-канала, типа телевизора, только в.

Медиа плеер. Воспроизведение любых форматы видео и аудио файлов
Мне задали курсовой проект - медиа плеер, я накопал на просторах интернета библиотеку с помощью.

Плеер - непрерывное проигрывание
Привет ребят.Помогите пожалуйста. подскажите можно ли на сайте сделать проигрыватель который.


Непрерывное воспроизведение аудио
Здравствуйте! Я хочу сделать так, чтобы аудио воспроизводилось непрерывно, но у меня не всё.

Непрерывное воспроизведение звука из массива
Привет всем! Долго подступался к программированию для Андроид и наконец решился. Мне нравится.

Плеер VLC
Проблема такого рода. Купил пульт управления компьютером. ДУ. Настраиваю кнопки управления плеером.

VLC - плеер и UDP
Добрый день. Ситуация следующая - есть несколько TV LG и есть ПК с VLC -плеером (Windows) на борту.

Цифровое телевидение через VLC плеер
Всем, Добрый День! Провайдер пишет вот что: Для просмотра цифровых телевизионных каналов.

Я ищу хорошо поддерживаемую библиотеку Python, позволяющую воспроизводить аудиофайлы на моем Raspberry Pi с использованием стандартного аудиовыхода.

Пока я пробовал несколько, но ни один из них, кажется, не работает. Хотя pyglet работает на моем обычном компьютере нормально, он вызывает ошибку на Raspberry Pi. Есть ли библиотека Python, которая доказала свою простоту использования?

Доказано, что он прост в использовании, но относителен, но я разместил альтернативу pygame аналогичному вопросу на StackOverflow здесь . По сути, это альтернатива vlc.py (модуль Python libVLC, который очень хорошо поддерживается). Еще один вопрос говорит о том, что Pyglet работает над RPi. Вы можете обновить с вашей ошибкой?

Я рекомендую широко популярную игру Pygame. Я могу ошибаться, но я считаю, что он предустановлен на Pi. Вы можете использовать музыкальный модуль Pygame Mixer для воспроизведения аудиофайлов. Я включил пример кода ниже.

Предполагая, что у нас есть аудиофайл под названием myFile.wav .

ПРИМЕЧАНИЕ. Если это не помогло, перейдите в терминал и обновите систему

и попробуй еще раз.

Если у вас есть более одного звука для воспроизведения (что вполне вероятно), тогда лучше создать объект pygame.mixer.Sound для каждого из них, тогда вы можете хранить определения имен файлов звуков в одном месте. Это то, что я хочу, но у моей материнской платы нет драйвера, поэтому я использую звуковую карту USB. Играет espeak просто отлично, но не это.

Мне нужен был сценарий для воспроизведения песни с тридцати секунд на заднем плане, в то же время отвечая на ввод других пользователей. Я тогда хотел, чтобы это закончило песню на каком-то событии.

Я не думаю, что это особенно элегантно, но я открыл канал для фонового процесса MPlayer.

Затем, когда я захотел завершить процесс MPlayer, я просто написал «q» для выхода в канал.

Посмотрите в документации MPlayer все виды команд, которые вы можете передать таким образом, чтобы управлять воспроизведением.

Надеюсь, это несколько полезно!

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

Другой вариант - использовать mpg321 и вызывать его из командной строки.

Pygame почти наверняка более устойчив, но, я полагаю, зависит от ваших потребностей.

Я думал об этом сам, но думал, что это не очень элегантно, потому что это делает паузу, регулировку громкости и т.д. намного сложнее.

Я бы порекомендовал pyglet, а не pygame, если вам не нужна графика. На мой взгляд, это проще, элегантнее и лучше поддерживается. Опять же, я ожидаю, что это может быть дело вкуса.

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

Pygame дает вам простой и удобный способ загружать и воспроизводить звуки на разных каналах.

Вы можете использовать несколько внешних игроков через каналы. Тем не менее, вы почти всегда будете испытывать потерю скорости. Существует также проблема с управлением воспроизведением.

Оригинал: How To Control Media Players From Commandline In Linux
Автор: SK
Дата публикации: 6 ноября 2017 года
Перевод: А. Кривошей
Дата перевода: февраль 2017 г.

Приветствую любителей музыки! Сегодня я узнал, что в Unix-подобных операционных системах мы можем управлять медиаплеерами из командной строки. Вы можете включать воспроизведение, приостанавливать его, увеличивать/уменьшать громкость, переключаться на следующие/предыдущие мультимедийные файлы и останавливать воспроизведение. Все из терминала! В этом руководстве мы обсудим две простые утилиты, которые можно использовать для управления медиаплеерами из терминала в Linux.

1. Playerctl

Playerctl - простая утилита командной строки для управления медиафайлами из терминала. Она позволяет воспроизводить, приостанавливать воспроизведение, переключаться на следующую или предыдущую дорожку, увеличивать или уменьшать громкость, останавливать воспроизведение и т. д. Используя Playerctl, мы можем управлять всеми медиаплеерами, которые реализуют спецификацию интерфейса MPRIS D-Bus. Ниже приведены некоторые из популярных медиаплееров, которыми можно управлять с помощью Playerctl.

Audacious,
Bmp,
Spotify,
Mplayer/SMplayer,
VLC,
Xmms2.

Установка

Playerctl доступен в официальных репозиториях большинства современных дистрибутивов Linux. Поэтому вы можете установить его, используя штатный менеджер пакетов.

В Debian, Ubuntu и их производных:

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

Использование

Сначала выведем список всех доступных плееров с помощью следующей команды:

Вы можете просмотреть статус плеера:

Как вы можете видеть, в настоящее время в моей системе есть два плеера (открытые и запущенные в настоящее время). Vlc остановлен, и сейчас играет smplayer.

Чтобы воспроизвести трек, введите:

Если был запущен только один плеер, вам не нужно использовать переключатель «-p» или «-player». Playerctl автоматически воспроизводит трек в запущенном плеере. Чтобы приостановить воспроизведение текущей дорожки (при условии, что у вас есть только один плеер), введите:

Для перехода к следующему треку:

Для перехода к предыдущему треку:

Чтобы просмотреть справку по программе, введите:

Более детальную информацию можно получить на странице проекта в GitHub.

2. OmniPause

OmniPause - это простое приложение python для управления медиаплеерами через DBus. В отличие от Playerctl, OmniPause находится на ранней стадии разработки. Однако он полностью функционален и может выполнять все те же операции, что и Playerctl.

Установка

OmniPause написан на Python, поэтому вам нужно сначала установить приведенные ниже зависимости. Эти пакеты доступны в официальных репозиториях всех дистрибутивов Linux. Поэтому их можно установить с помощью штатного диспетчера пакетов.

После установки зависимостей клонируйте проект git:

Перейдите в директорию проекта:

Теперь запустите команду для установки программы.

Эта команда скопирует программу omnipause.py в /usr/local/bin/omnipause.

Использование

Программа работает также, как Playerctl. В отличие от последнего Omnipause имеет ограниченную функциональность. Доступны только следующие функции:

play,
pause,
next,
previous,
toggle,
stop.

Для временной остановки воспроизведения введите:

Для продолжения воспроизведения:

Для остановки всех медиаплееров:

Для перехода к следующему треку на всех медиаплеерах:

Для перехода к предыдущему треку на всех медиаплеерах:

Чтобы переключить состояние запущенных плееров:

Как вы могли видеть, мы можем управлять всеми работающими медиаплеерами, используя одну команду. Как и у Playerctl, у omnipause нет никаких опций для работы с определенным плеером, а также для увеличения/уменьшения громкости.

Читайте также: