DLNA сервер для Linux Debian / Ubuntu на базе MiniDLNA

Если у вас роутер ASUS, или TP-LINK с USB-портом, то скорее всего? на нем есть возможность запустит медиа-сервер, и предоставить доступ к видео, фото и музыке для телевизора, который поддерживает DLNA. Запустить DLNA-сервер можно не только на маршрутизаторах фирмы TP-LINK и ASUS, но в этой статье я покажу на примере устройств именно этих производителей.

Давайте для начала разберемся как это работает. У нас есть маршрутизатор с USB портом, возможностью запуска медиа-сервера (если USB есть, значит, скорее всего поддержка DLNA Media Server так же есть). К этому маршрутизатору у нас подключен телевизор, в моем случае это телевизор Philips на Android TV. Снова же, телевизор может быть любой: Samsung, LG, SONY и т. д.

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

А если вы хотите на компьютере запустить DLNA сервер, и смотреть файлы на телевизоре, тогда вам нужны эти инструкции:

  • Как на телевизоре LG смотреть фильмы с компьютера (по wi-fi, или сети)? Настройка DLNA через Smart Share
  • Настройка DLNA сервера для телевизора Philips. Смотрим фильмы с компьютера на телевизоре

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

Установка MiniDLNA

Простейшим способом установки является, установка пакета из репозитория вашего дистрибутива:

sudo apt-get update sudo apt-get install minidlna

Установка Sudo

Если в вашей системе отсутствует команда sudo, желательно ее установить. Sudo нам потребуется в процессе настройки, для тестирования прав доступа к папкам с медиа-файлами.

Устанавливаем sudo:

apt-get install sudo

Добавляем пользователя в группу sudo:

usermod -aG sudo пользователь

Выходим из системы и входим заново, чтобы изменение группы вступило в силу.

Какие устройства поддерживают DLNA

Все сертифицированные устройства, которые поддерживают DLNA, условно разделяются на три основных класса:

  1. Сетевые приборы бытового назначения – это телевизоры, медиа и музыкальные центры, DVD-проигрыватели, устройства сетевого хранения, домашние кинотеатры и прочие.
  2. Устройства мобильного типа – в данную группу входят смартфоны и планшетные ПК, портативные плееры, видеокамеры и прочие.
  3. Многофункциональные приборы бытового назначения – в данную нишу входят устройства, которые поддерживают разнообразные стандарты связи и умеют конвертировать между собой разные файловые форматы. Они требуются для гарантирования совместимости между первым и вторым классом.

Невзирая на большую численность самой различной техники, главное, что сразу же вспоминается при упоминании технологии DLNA – это современные ЖК телевизоры. Более того, как раз таки с продвижением и тотальным распространением телевизоров с функцией Smart TV и возникло увеличение востребованности стандарта. Дело в том, что по сути своей «умный» телевизор является мультимедийным развлекательным центром в современных системах «Умный дом». По этой причине чаще всего DLNA применяется для передачи видеоконтента с ПК на телевизоры.

Вся электроника, которая поддерживает представленную технологию, на своём корпусе маркируется наклейкой » DLNA Certified». И хотя в ней применяются стандарты открытого типа, для получения права на подобную маркировку, устройства должны подвергнуться процедуре предварительной сертификации. На нынешний момент сертификация DLNA была получена уже больше чем 20 тысячами различных электроприборов. Касательно объёмов их реализации, то тут цифры уже давно перевалили за сотню миллионов.

Для применения DLNA требуется налаженная домашняя сеть. Она может быть создана как проводным способом, посредством Ethernet, так и беспроводным – при помощи сети Wi-Fi. Для использования второго способа требуется достаточный уровень пропускной способности. Комфортная работа возможно только при протоколе не ниже стандарта Wi-Fi 802.11n.

Настройка MiniDLNA

Правим файл конфигурации:

sudo nano /etc/minidlna.conf

Как минимум, потребуется задать путь к папке с медиа-файлами, параметр: «media_dir». Также можно задать имя сервера, отображаемое клиентом, параметр: «friendly_name».

В случае если наш DLNA-сервер по совместительству является интернет-шлюзом, также необходимо задать внутренний сетевой интерфейс, параметр: «network_interface».

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

# Порт сервера port=8200 # Сетевой интерфейс # Можно задать несколько интерфейсов # в формате network_interface=eth0,eth1
#network_interface=eth0 # Имя пользователя или UID, под которым будет работать служба # Добавлен в версии 1.1.0 # В Debian задается в параметрах init-скрипта #user=jmaggard # Путь к папке с медиа-файлами # Для сканирования нескольких папок, укажите несколько параметров media_dir # Чтобы сканировать файлы определенного типа, укажите соответствующий префикс: # A — аудио: media_dir=A,/home/jmaggard/Music # V — видео: media_dir=V,/home/jmaggard/Videos # P — изображения: media_dir=P,/home/jmaggard/Pictures # Начиная с версии 1.1.0, можно задать несколько типов: # PV — изображения и видео: media_dir=AV,/var/lib/minidlna/digital_camera # # При изменении параметра, потребуется повторное сканирование файлов. # Необходимо выполнить команду «service minidlna force-reload» от имени root [подробнее]. # Начиная с версии 1.1.0, при изменении параметра, сканирование выполняется автоматически. media_dir=/var/lib/minidlna # Объединять корневые папки # Параметр добавлен в версии 1.1.3 # Включаем, чтобы избавиться от лишнего уровня вложенности # Расположение видео файлов при значении «no»: Video/Folders/Video, при значении «yes»: Video/Folders # При изменении параметра, потребуется повторное сканирование файлов. merge_media_dirs=yes # Имя DLNA-сервера, отображаемое клиентом # По умолчанию: «$HOSTNAME:$USER» #friendly_name= # Путь к папке для хранения базы данных и кэша обложек альбомов db_dir=/var/lib/minidlna # Путь к папке с лог-файлами log_dir=/var/log # Уровень детальности лога # В формате log_level=источник1,источник2=значение1,источник3,источник4=значение2 … # Доступные источники: «general», «artwork», «database», «inotify», «scanner», «metadata», «http», «ssdp», «tivo» # Возможные значения: «off», «fatal», «error», «warn», «info» or «debug» #log_level=general,artwork,database,inotify,scanner,metadata,info,ssdp,tivo=warn # Перечень имен файлов-обложек альбомов, разделитель: «/» album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg # Автообнаружение новых файлов # Включено по умолчанию #inotify=yes # Поддержка устройств TiVo #enable_tivo=no # Строго следовать DLNA-стандарту # Использовать серверное масштабирование для очень больших JPEG-изображений # Что может снизить скорость их обработки. #strict_dlna=no # Адрес веб-страницы устройства # По умолчанию IP-адрес и заданный порт сервера #presentation_url=https://www.mylan/index.php # Интервал отправки SSDP-уведомлений, в секундах #notify_interval=895 # Серийный номер и номер модели DLNA-сервера, сообщаемый клиенту serial=12345678 model_number=1 # Путь к сокету MiniSSDPd, если установлен # Требуется для обеспечения работы нескольких DLNA/UPnP служб на одном сервере #minissdpdsocket=/run/minissdpd.sock # Контейнер, используемый в качестве корневой папки для клиентов # * «.» — стандартный контейнер # * «B» — «Обзор папки» # * «M» — «Музыка» # * «V» — «Видео» # * «P» — «Изображения» # Если задано «B» и клиент представится как аудиоплеер, в качестве корня будет использована папка «Music/Folders» #root_container=. # Всегда использовать заданный критерий сортировки, вместо значения, запрошенного клиентом #force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title # Максимальное число одновременных подключений # Учтите: многие клиенты открывают несколько подключений одновременно #max_connections=50
Проверяем параметры init-скрипта /etc/default/minidlna:

sudo nano /etc/default/minidlna

Обычно корректировка не требуется. Если файл отсутствует, при первичной установке из исходников, копируем листинг:

# Запускать демон, если задано «yes» START_DAEMON=»yes» # Путь к файлу конфигурации #CONFIGFILE=»/etc/minidlna.conf» # Путь к лог-файлу #LOGFILE=»/var/log/minidlna.log» # Запуск от имени заданного пользователя и группы # По умолчанию: minidlna #USER=»minidlna» #GROUP=»minidlna» # Дополнительные ключи запуска DAEMON_OPTS=»»

Поскольку служба работает под пользователем с ограниченными правами, публикуемые папки и файлы должны быть доступны на чтение для всех пользователей, следовательно, иметь разрешения 644: «rw- r— r—«, для файлов и 755: «rwx r-x r-x«, для папок.

Проверяем доступность для каждой папки, заданной в minidlna.conf, командой:

sudo -u minidlna ls -l папка

Если папка недоступна, задаем права доступа:

sudo chmod -R 755 папка

Вышестоящие папки также должны быть доступны на чтение всем пользователям. Проверяем доступность на чтение каждой папки, указанной в пути. Для вышестоящих папок используем chmod без ключа -R, если не требуется сброс разрешений для всех дочерних файлов и папок.

В качестве альтернативы смене разрешений, можно запустить MiniDLNA от имени пользователя или группы-владельца файлов. Для этого необходимо задать параметры USER и GROUP в /etc/default/minidlna, и сменить владельца папки /var/lib/minidlna командой:

sudo chown -R пользователь:группа /var/lib/minidlna

Запуск MiniDLNA

Перезапускаем службу:

sudo systemctl restart minidlna

Проверяем, работает ли служба, также смотрим параметры запуска:

systemctl status minidlna

Проверяем, слушается ли порт:

sudo ss -4lnp | grep minidlna

Проверяем лог:

cat /var/log/minidlna.log

В случае успешного старта, лог должен быть примерно следующим:

[2014/04/07 22:00:48] minidlna.c:1000: warn: Starting MiniDLNA version 1.1.2. [2014/04/07 22:00:48] minidlna.c:354: warn: Creating new database at /var/lib/minidlna/files.db [2014/04/07 22:00:48] minidlna.c:1039: warn: HTTP listening on port 8200 [2014/04/07 22:00:48] scanner.c:702: warn: Scanning /var/lib/minidlna [2014/04/07 22:00:55] scanner.c:789: warn: Scanning /var/lib/minidlna finished (25 files)! [2014/04/07 22:00:55] playlist.c:125: warn: Parsing playlists… [2014/04/07 22:00:55] playlist.c:256: warn: Finished parsing playlists. [2014/04/07 22:00:55] inotify.c:198: warn: WARNING: Inotify max_user_watches [8192] is low or close to the number of used watches [14] and I do not have permission to increase this limit. Please do so manually by writing a higher value into /proc/sys/fs/inotify/max_user_watches.

Если видим: «WARNING: Inotify max_user_watches [8192] is low.», необходимо увеличить число дескрипторов слежения inotify до 100 000. Для этого в файл /etc/sysctl.conf добавим строки:

#MiniDLNA warning fix fs.inotify.max_user_watches = 100000

Вручную редактором:

sudo nano /etc/sysctl.conf

Или копипастом команды:

sudo sh -c ‘printf «\n\n#MiniDLNA warning fix\nfs.inotify.max_user_watches = 100000\n» >> /etc/sysctl.conf && cat /etc/sysctl.conf’

Изменение параметра вступит в силу после перезагрузки системы.

Открываем в браузере https://адрес.сервера:8200, видим количество файлов в библиотеке, начиная с версии 1.1.2, также отображается список подключенных клиентов.

Настройка DLNA/UPnP-AV сервера завершена.

Если вместо сообщений и папок-контейнеров MiniDLNA отображаются знаки вопроса, отключаем локализацию.

Если был установлен пакет:

sudo mv /usr/share/locale/ru/LC_MESSAGES/minidlna.mo minidlna.mo.del

При установке из исходников:

sudo mv /usr/local/share/locale/ru/LC_MESSAGES/minidlna.mo minidlna.mo.del

Перезапускаем MiniDLNA с повторным сканированием библиотеки.

Порт 23 TCP или UDP?

Известные порты

ПортTCPОписание
21даУправление протоколом передачи файлов (FTP) (команда)
22даSecure Shell (SSH), безопасный вход, передача файлов (scp, sftp) и перенаправление портов
23даПротокол Telnet — незашифрованные текстовые сообщения
25даПростой протокол передачи почты (SMTP), используемый для маршрутизации электронной почты между почтовыми серверами.

Сканирование медиа-библиотеки MiniDLNA

При появлении ошибок в каталоге, необходимо выполнить повторное сканирование файлов.

Для этого удалим базу Minidlna и перезапустим службу:

sudo rm /var/lib/minidlna/files.db sudo systemctl restart minidlna

Для сканирования медиа-библиотеки при каждом старте системы можно задать ключ запуска: «-R» в параметре DAEMON_OPTS в файле /etc/default/minidlna. Сканирование большой медиа-библиотеки существенно нагружает диск, что может замедлить загрузку системы.

Полное формирование каталога может занять несколько минут. Сканирование папок выполняется в порядке их объявления в конфиге. Файлы из небольших папок, объявленных в конфиге выше, появятся в каталоге в самом начале процесса сканирования. Крупные папки с редко воспроизводимым контентом имеет смысл размещать в конфиге последними.

Преимущества и недостатки технологии

DLNA постоянно развивается в технологическом плане. Её поддерживают и продвигают ведущие мировые корпорации и разработчики компьютерного ПО, занимающиеся созданием и внедрением массовых цифровых устройств с обширными возможностями. Поддержку DLNA на сегодня реализовали в своих продуктах десятки глобальных компаний, таких как Google, Apple и Microsoft. Общая численность корпораций, состоящих в союзе производителей гаджетов с поддержкой данной технологии, превысила цифру в 250 членов.

Домашний медиа-сервер DLNA привнёс в мир обмена контентом простоту и удобство. За счёт этого стандарта различные устройства смогли взаимодействовать между собой внутри домашней сети. При всём этом процесс их настройки предельно облегчён.

Но стандарт DLNA, как и любая современная технология, обладает как своими достоинствами, так и некоторыми недостатками. Вот основные из них.

ПреимуществаНедостатки
Возможность тонкой настройки сервераФункция подсоединения по локальной сети не доработана
База данных хранится в облакеОбновления для софта больше не публикуются на официальном веб-ресурсе
Поддерживаются как проводные, так и беспроводные сети
Телевизоры можно подсоединять посредством Wi-Fi роутера

Отключение запроса способа отображения файлов: All Files, Folders

Настраиваем отображение содержимого папок Music, Pictures, Video без промежуточного запроса способа их отображения.

Частично вопрос можно решить установкой параметра: «root_container=B» в minidlna.conf. При этом сам запрос не отключается, но содержимое папок отображается непосредственно в корневом контейнере.

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

Отключение виртуальных папок в MiniDLNA версии 1.1.4 и выше

Для версии 1.1.4 применяем патч, и добавляем параметр disable_extended_directories=yes в minidlna.conf. Данный патч войдет в состав следующей версии MiniDLNA, для более поздних версий достаточно задать параметр в файле конфигурации.

Получаем и устанавливаем пакет с исходниками, как описано в разделе: «Установка или обновление MiniDLNA из исходников».

Переходим в папку с исходниками:

cd ~/src/minidlna/minidlna-1.1.4

Загружаем и применяем патч:

wget https://sourceforge.net/p/minidlna/feature-requests/101/attachment/diff.dif patch < diff.diff

Собираем и устанавливаем исправленную версию:

sudo make install

Редактируем файл конфигурации:

sudo nano /etc/minidlna.conf

Добавляем параметр:

# Отключить виртуальные папки disable_extended_directories=yes

Перезапускаем службу с повторным сканированием медиа-библиотеки:

sudo service minidlna force-reload

В системах на базе systemd для повторного сканирования потребуется удалить базу данных вручную:

sudo rm /var/lib/minidlna/files.db sudo systemctl restart minidlna Проверяем результат. Папки должны открываться без запроса способа отображения.

Отключение виртуальных папок в MiniDLNA версии 1.1.3 и ниже

Получаем и устанавливаем пакет с исходниками, как описано в разделе: «Установка или обновление MiniDLNA из исходников».

Переходим в папку с исходниками:

cd ~/src/minidlna/minidlna-1.1.3

Необходимые константы идентификаторов папок объявлены в scanner.h

#define MUSIC_ID «1» #define MUSIC_ALL_ID «1$4» #define MUSIC_GENRE_ID «1$5» #define MUSIC_ARTIST_ID «1$6» #define MUSIC_ALBUM_ID «1$7» #define MUSIC_PLIST_ID «1$F» #define MUSIC_DIR_ID «1$14» #define MUSIC_CONTRIB_ARTIST_ID «1$100» #define MUSIC_ALBUM_ARTIST_ID «1$107» #define MUSIC_COMPOSER_ID «1$108» #define MUSIC_RATING_ID «1$101» #define VIDEO_ID «2» #define VIDEO_ALL_ID «2$8» #define VIDEO_GENRE_ID «2$9» #define VIDEO_ACTOR_ID «2$A» #define VIDEO_SERIES_ID «2$E» #define VIDEO_PLIST_ID «2$10» #define VIDEO_DIR_ID «2$15» #define VIDEO_RATING_ID «2$200» #define IMAGE_ID «3» #define IMAGE_ALL_ID «3$B» #define IMAGE_DATE_ID «3$C» #define IMAGE_ALBUM_ID «3$D» #define IMAGE_CAMERA_ID «3$D2» // PlaysForSure == Keyword #define IMAGE_PLIST_ID «3$11» #define IMAGE_DIR_ID «3$16» #define IMAGE_RATING_ID «3$300»

Нам необходимо при запросе папок MUSIC_ID, VIDEO_ID и IMAGE_ID, перенаправить клиента в MUSIC_DIR_ID, VIDEO_DIR_ID и IMAGE_DIR_ID соответственно.

Обработка запросов клиента реализована в файле upnpsoap.c.

Сохраняем резервную копию файла:

cp upnpsoap.c upnpsoap.c.old

Запускаем редактор:

nano upnpsoap.c

Активируем поиск (F6), ищем процедуру: «BrowseContentDirectory».

static void BrowseContentDirectory(struct upnphttp * h, const char * action) {

В начале процедуры выполняется разбор SOAP/XML-запроса, затем его обработка и возврат результата.

Разбор запроса завершается формированием отладочного сообщения:

DPRINTF(E_DEBUG, L_HTTP, «Browsing ContentDirectory:\n» » * ObjectID: %s\n» » * Count: %d\n» » * StartingIndex: %d\n» » * BrowseFlag: %s\n» » * Filter: %s\n» » * SortCriteria: %s\n», ObjectID, RequestedCount, StartingIndex, BrowseFlag, Filter, SortCriteria);

Далее реализован выбор корневого контейнера в зависимости от конфигурационного параметра root_container:

// Если запрошен корневой контейнер if( strcmp(ObjectID, «0») == 0 ) { // Выставляем флаг корневого контейнера args.flags |= FLAG_ROOT_CONTAINER; // Если в конфиге задан корневой контейнер if( runtime_vars.root_container ) { // Если клиентом является аудио плейер и в конфиге задан обзор папок // Отправляем его в папку с музыкой if( (args.flags & FLAG_AUDIO_ONLY) && (strcmp(runtime_vars.root_container, BROWSEDIR_ID) == 0) ) ObjectID = MUSIC_DIR_ID; else // Иначе выставляем контейнер, заданный в конфиге ObjectID = runtime_vars.root_container; } else // Если контейнер в конфиге не задан { // Если клиентом является аудио плейер // Отправляем его в папку с музыкой if( args.flags & FLAG_AUDIO_ONLY ) ObjectID = MUSIC_ID; } }

Сразу после этого блока и перед блоком с запросами к БД добавляем код перенаправления папок для видео, музыки и изображений:

//Redirect video to folder if( strcmp(ObjectID, VIDEO_ID) == 0 ) { ObjectID = VIDEO_DIR_ID; } //Redirect music to folder if( strcmp(ObjectID, MUSIC_ID) == 0 ) { ObjectID = MUSIC_DIR_ID; } //Redirect images to folder if( strcmp(ObjectID, IMAGE_ID) == 0 ) { ObjectID = IMAGE_DIR_ID; }

В итоге правленный фрагмент должен выглядеть следующим образом:

if( strcmp(ObjectID, «0») == 0 ) { args.flags |= FLAG_ROOT_CONTAINER; if( runtime_vars.root_container ) { if( (args.flags & FLAG_AUDIO_ONLY) && (strcmp(runtime_vars.root_containe$ ObjectID = MUSIC_DIR_ID; else ObjectID = runtime_vars.root_container; } else { if( args.flags & FLAG_AUDIO_ONLY ) ObjectID = MUSIC_ID; } }
//Redirect video to folder if( strcmp(ObjectID, VIDEO_ID) == 0 ) { ObjectID = VIDEO_DIR_ID; } //Redirect music to folder if( strcmp(ObjectID, MUSIC_ID) == 0 ) { ObjectID = MUSIC_DIR_ID; } //Redirect images to folder if( strcmp(ObjectID, IMAGE_ID) == 0 ) { ObjectID = IMAGE_DIR_ID; } if( strcmp(BrowseFlag+6, «Metadata») == 0 ) { args.requested = 1; sql = sqlite3_mprintf(«SELECT %s, » COLUMNS «from OBJECTS o left join DETAILS d on (d.ID = o.DETAIL_ID$ » where OBJECT_ID = ‘%q’;», (args.flags & FLAG_ROOT_CONTAINER) ? «0, -1» : «o.OBJECT_I$ ObjectID); ret = sqlite3_exec(db, sql, callback, (void *) &args, &zErrMsg); totalMatches = args.returned; }
Собираем и устанавливаем исправленную версию:

sudo make install

Перезапускаем службу:

sudo service minidlna restart

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

Рейтинг
( 2 оценки, среднее 4.5 из 5 )
Понравилась статья? Поделиться с друзьями:
Для любых предложений по сайту: [email protected]