Вы ведь наверняка знакомы с VLC, вездесущим медиаплеером, флагманом проекта VideoLAN? VLC — это кросс-платформенное приложение, доступное в репозиториях многих (если не всех) дистрибутивов Linux. Имеются версии VLC для MacOS, Windows, и даже для телефонов/планшетов/часов, работающих на iOS и Android. Но для последних это всего лишь медиаплеер. В любом случае, наверное, это основной вариант его использования. Так ли это?
По сути, десктопная версия VLC является намного большим, чем просто инструментом для воспроизведения видеофайлов на вашем жёстком диске! Поэтому советую прочитать эту статью, чтобы узнать о менее известных функциях этой прекрасной программы.
1. Используем VLC для импортирования видео с устройств UPnP
Перед тем, как говорить о встроенной в VLC поддержке UPnP, стоит вкратце объяснить, что вообще представляет собой UPnP.
UPnP (Universal Plug and Play) — это набор протоколов, позволяющих соединённым устройствам определять наличие друг друга в сети. UPnP предназначен для быстрого подключения сетевых устройств пользователями не особо разбирающимися в технике. Причина, по которой мы это упоминаем, заключается в том, что большое количество электронных устройств для массового пользователя сейчас имеют поддержку UPnP. Иногда это не очевидно, поскольку эта функция может называться DLNA — но в нашем случае это не важно.
Это устройство потребительского класса может выступать в качестве медиа-сервера DLNA / UPnP
VLC поддерживает UPnP. К сожалению, к моменту написания этой статьи VLC может работать только как клиент UPnP, а не как сервер UPnP. Но этого будет достаточно, если вы хотите воспроизвести из VLC какой-то контент, хранящийся на внешнем сервере UPnP, например, на UPnP-совместимом цифровом видеорекордере или медиа-комбайне DVD/BR/HDD.
Воспроизведение видео с сетевого устройства UPnP интуитивно понятно. Но знали ли вы о том, что щёлкнув правой кнопкой мыши на потоке вы можете скопировать («сохранить») файл с устройства UPnP на локальное устройство?
Должен признаться, на моей системе это работает только для записанных видео и не работает для потоков в реальном времени. Является ли это проблемой моего HDD-рекордера или это ограничение VLC? Не могу сказать с уверенностью — кстати, если у вас есть какая-либо информация по этому поводу, не стесняйтесь рассказать об этом в комментариях, расположенных под этой статьёй!
В качестве дополнительного трюка, поскольку мой HDD-рекордер использует HTTP в качестве транспортного слоя, я нахожу очень полезной возможность просматривать иерархию HDD с помощью VLC, а затем с помощью нескольких команд загружать и/или обрабатывать поток. По-моему это намного более удобно для пакетной обработки:
# Загрузка «сырых» данных с моего HDD
curl http://10.129.36.11:60001/AV-0-268435456-2-0-268435503-251953200_BDY \
-o stream.raw
# Перекодирование потока с HDD с помощью `ffmpeg`
ffmpeg -i http://10.129.36.11:60001/AV-0-268435456-2-0-268435503-251953200_BDY \
-seekable 0 \
-codec:a copy \
-codec:v libx264 -preset fast -tune film \
out.mkv
2. Используем VLC для перекодирования видео
В предыдущем примере я использовал ffmpeg для перекодирования видеофайла, расположенного на HDD-рекордере. Однако на самом деле вам не требуется использовать сторонние инструменты. VLC и сам может делать это. И даже из командной строки:
cvlc http://10.129.36.11:60001/AV-0-268435456-2-0-268435503-251953200_BDY \
--sout-x264-preset fast --sout-x264-tune film \
--sout "#transcode{vcodec=h264,acodec=copy}:file{dst=out.mp4}" \
vlc://quit
3. Плеер VLC без графического интерфейса
Вы наверняка заметили, что в предыдущем примере вместо команды vlc
я использовал команду cvlc
? Нет, cvlc это не разновидность плеера VLC. Это просто способ запуска VLC без графического интерфейса пользователя.
Например, если вам нужно просто запустить какое-то видео в полноэкранном режиме без заморочек с графическим интерфейсом, просто введите:
cvlc --play-and-exit \
--fullscreen \
stream.raw
Я нахожу команду cvlc
особенно полезной для пакетной обработки, либо если мне требуется воспроизвести видео в «режиме киоска». Это может потребоваться, например для показа информации на экранах в точках продаж и обслуживания. В этом случае cvlc может представлять собой альтернативу ffplay или mplayer.
4. Захват изображения экрана с помощью VLC
VLC — отличный видеоплеер. В дополнение к этому, как мы только что видели, он может также загружать и перекодировать видео. Но он не был бы полным решением для работы с видео, если бы не мог сам записывать видео.
И он может: с помощью VLC вы можете записывать видео с разных источников, таких, как вебкамера или ТВ-тюнер DVB-S2.
Но есть ещё одно псевдо-устройство, которое привлекло моё внимание: «Desktop».
Это устройство позволяет позволяет захватывать изображение с экрана компьютера так, как если бы экран был «настоящим» видеоустройством. Это прекрасное решение, если вы хотите записать обучающее видео или скринкаст. Единственный минус — пока VLC не способен захватывать изображение курсора, поэтому, возможно, это не лучший способ для захвата экрана. Тем не менее он работает.
Для записи видео с экрана с помощью VLC просто откройте диалог устройств захвата, выполните необходимые настройки для устройства «Desktop» в соответствии с вашими потребностями и нажмите … «Play».
Должен признать, что для меня это поначалу было слегка непонятно. Но при работе с графическим интерфейсом VLC, для того, чтобы «открыть» устройство нужно нажать «Play». И только после этого надо нажать кнопку «Record» для записи видеопотока.
VLC работает с разными устройствами захвата: вебкамера, карта DVB, …
![Запись изображения экрана с помощью VLC](/content/images/2017/06/vlc-typical-desktop-record-settings.png)Запись изображения экрана с помощью VLC
![Нажмите запись для захвата воспроизводимого потока](/content/images/2017/06/vlc-recording.png)Нажмите кнопку «Record» для захвата воспроизводимого потока
Предупреждение: на «оригинальной» системе Debian Linux Stretch/Sid мне потребовалось установить дополнительный пакет vlc-plugin-access-extra для того, чтобы избвиться от ошибки
VLC is unable to open the MRL ‘screen://'”/”open of `screen://’ failed.
Насколько я знаю, в интерефейсе пользователя нет никакого оповещения о том, куда именно сохраняется файл записи. На моей системе он сохраняется в ~/Videos/vlc-record-<ДАТА>-<УСТРОЙСТВО>.avi
.
Вероятно это можно изменить где-то в настройках VLC. Но лично я при использовании этой функции предпочитаю работать в командной строке, что позволяет лучше управлять процессом и может быть встроено в какой-либо скрипт:
cvlc screen:// \
--screen-fps=30\
--sout-x264-preset fast --sout-x264-tune animation \
--sout "#transcode{vcodec=h264,acodec=copy}:file{dst=out.mp4}"
Не кажется ли вам эта команда знакомой? Конечно, она ведь практически та же, что я использовал для перекодирования файла с HDD-рекордера.
Параметры командной строки VLC довольно сложны, поэтому я не буду касаться их в этой статье. Скажу лишь, что как только вы изучите несколько основных команд, вы сможете использовать их независимо от того, из какого источника будет идти видеопоток.
5. Использование VLC для потоковой передачи видео
Плеер, кодировщик, рекордер — список не будет полным, если я не упомяну «сервер». Мы видели, что VLC может работать как клиент для отображения сетевого видеопотока. И я упоминал, что он не может работать как сервер DLNA. Однако, он поддерживает другие серверные протоколы, позволяющие удалённым клиентам получать и воспроизводить видеофайлы, расположенные на вашем компьютере.
Эта возможность может быть полезной, например, для просмотра на большом экране телевизора видео, хранящегося на вашем ноутбуке. Либо для передачи рекламных роликов на разные экраны, расположенные в каком-либо общественном месте.
Какое-то время проект VideoLAN предоставлял утилиту vls (VideoLAN Server), предназначенную для решения этих задач. Однако сейчас функционал VLS был встроен в VLC — таким образом дальнейшее развитие VLS, как отдельной утилиты было остановлено.
Для передачи видео с помощью VLC можно использовать графический интерфейс. В интерфейсе передачи вы выбираете те файлы, которые хотите раздать, а затем выбираете тип потока передачи.
В этом примере я буду рассматривать потоковую передачу видео по протоколу HTTP, поскольку он является универсальным.
VLC может работать как сервер
![Выбор файлов для стрима](/content/images/2017/06/vlc-open-file-for-streaming.png)Сначала надо выбрать список файлов, которыми вы хотите поделиться
![Окно после нажатия кнопки `Stream` на предыдущем шаге](/content/images/2017/06/vlc-streaming-wizard-screen-1.png)Окно после нажатия кнопки `Stream` на предыдущем шаге
![Выберите место назначения](/content/images/2017/06/vlc-streaming-wizard-screen-2-select-destination.png)Выберите место назначения
![Настройки назначения](/content/images/2017/06/vlc-streaming-wizard-screen-2-http-options.png)Укажите желаемые настройки для места назначения. Нажмите `Next`
![Выберите настройки кодирования. Это поможет снизить нагрузку на канал передачи данных](/content/images/2017/06/vlc-streaming-wizard-screen-3-choose-transcoding.png)Выберите настройки кодирования. Это поможет снизить нагрузку на канал передачи данных
![Все готово для начала стрима](/content/images/2017/06/vlc-streaming-wizard-screen-4-start-streaming.png)Все готово для начала стрима
На последнем экране находится очень удобная вещь — команда, выполнение которую в командной строке приведёт к запуску сервера без необходимости повторного выбора вручную всех параметров в мастере настройки. Вы можете повторно использовать эту команду или изменить настройки позже для запуска стрим-сервера VLC без вмешательства пользователя.
Это очень помогло мне однажды, когда понадобилось немного изменить параметры кодека VLC, чтобы видео воспроизводилось корректно. В частности, я выбрал использование кодека MPEG 1 – Audio Layer 3 (MP3) вместо MPEG 1 – Layer 2 Audio (mpga). Не спрашивайте почему, но при перекодировании видео в MP2, перекодированные файлы содержали до 24 пустых аудиодорожек, тогда, как файл, перекодированный в MP3 содержал одну «правильную» дорожку. Если вы знаете, почему так происходит, поделитесь советом в комментариях! Итак:
cvlc /path/to/my/file.mp4 \
--sout=#transcode{vcodec=h264,acodec=mp3,ab=128,channels=2,samplerate=44100}:http{mux=ffmpeg{mux=flv},dst=:8181/movie} \
--sout-keep
Нужно понимать, что эта команда запускает стрим-сервер, а не просто файл-сервер. Это значит, что как только сервер инициализируется и запустится, VLC начнет «проигрывать» входящий поток независимо от того, подключены ли клиенты, или нет. Другими словами, если вам понадобится 5 минут для запуска клиента и подключения его к серверу — вы потеряете 5 минут просмотра вашего видео! А значит, о готовности клиента стоит позаботится до запуска сервера…
# отображение видео:
vlc http://addr.of.the.server:8181/movie
ffplay http://addr.of.the.server:8181/movie
mplayer http://addr.of.the.server:8181/movie
Список поддерживаемых протоколов и режимов стриминга доступен на веб-сайте VideoLAN. В рассматриваемом случае используется протокол HTTP. Однако для более сложных ситуаций я советую изучить протокол RTP (Real-time Transport Protocol). Хорошая особенность протокола RTP в том, что он поддерживает мультикастинг. Не углубляясь в детали, скажу, что HTTP основан на протоколе TCP, который был разработан для надежной передачи данных по схеме «один-одному» (юникаст). RTP основан на протоколе UDP, который менее надежен, но может использоваться для передачи данных по схеме «один-многим» (мультикаст).
Проще говоря, при использовании протокола HTTP, сервер отправляет данные персонально каждому клиенту. Это значит, что если у вас есть 100 клиентов, подключённых по протоколу HTTP, то VLC нужно отправлять каждый пакет данных по 100 раз. По одному разу для каждого подключённого клиента. В то время, как с помощью RTP вы можете использовать мультикаст-адрес и один и тот же пакет будет одновременно передаваться на несколько клиентов. Если у вас имеются 100 клиентов, подключённых к одному мультикаст-адресу, то серверу VLC нужно будет отправить каждый пакет данных всего один раз. Ответственной за доставку этого пакета клиентам будет инфраструктура локальной сети (роутеры, маршрутизаторы). Обычно это снижает нагрузку на канал передачи данных и на сервер.
В настоящее время VLC поддерживает только три протокола стриминга: HTTP, RTP unicast и RTP multicast.
# Start VLC as a multicast RTP server
cvlc -vvv ~/some-video.avi \
--sout='#transcode{vcodec=h264,acodec=mp3,ab=128,channels=2,samplerate=44100}:rtp{mux=ts,dst=224.0.0.10,port=1234}'\
--sout-keep
VLC обладает серьёзными возможностями по передаче потоковых данных, а с помощью перекодировки вы сможете транслировать практически любой видеофайл. Если вы планируете регулярно использовать функцию потоковой передачи, непременно стоит обрабатывать ваши файлы заранее, используя более специализированное ПО, например ffmpeg. Это не только снизит нагрузку на сервер, по сравнению с перекодировкой в реальном времени, но и избавит от возможных проблем при перекодировке с помощью VLC файлов, содержащих несколько аудио или видеодорожек.
5. Помощь при работе с VLC
Вы могли заметить, что в статье я несколько раз упоминал ffmpeg. Одной из причин, по которой мне особенно нравится этот инструмент является прекрасная документация, доступная для этого проекта.
Не будет неправильным сказать, что документация VLC намного менее… эмм … «исчерпывающа», чем у ffmpeg. Однако при подготовке статьи я обнаружил (и использую) одну особенность — для разных модулей VLC доступна встроенная справка. Например, ранее мы использовали (среди прочих) модули кодирования и HTTP. Вы можете получить (немного) информации о том, какие параметры поддерживаются этими модулями с помощью следующих команд:
vlc -p transcode --advanced
vlc -p http --advanced
Конечно, эта встроенная справка не содержит много информации. Но в конце концов она может помочь определить какие ключевые слова надо вбить в строку поиска браузера!
Ветровоск, Ринсвинд и другие
Мой последний «фокус» о VLC на самом деле совсем не является таковым. Однако я не мог закончить статью не рассказав о названиях релизов.
Сейчас я использую VLC Weatherwax (Ветровоск) (v2.2.x). А мой первый опыт использования VLC начинался, возможно, с The Luggage (Багаж) (v1.1.x). Если вы когда-либо задумывались о том, откуда берутся эти забавные названия, то вот ответ —
на самом деле это имена главных персонажей из серии рассказов о Плоском мире Терри Пратчетта (†2015). VLC 2.2.1 была первым релизом, выпущенным уже после смерти писателя, поэтому ему было присвоено название Terry Pratchett.
Как вы заметили, исследуя возможности VLC, находящиеся за пределами базовых функций, мы вторглись в область с высоким уровнем магии. А ведь мы только «поскребли по поверхности». Мы не рассмотрели ещё великое множество вещей, которые можно делать с помощью этого приложения. Если вы знаете какие-либо трюки, которые можно вытворять, используя VLC, либо можете рассказать о необычных случаях его применения — будет здорово услышать о них в комментариях ниже!