вторник, 16 августа 2011 г.

Поднимаем DLNA сервер.

Не так давно стал счастливым обладателем телевизора SONY BRAVIA. HD проигрывателя у меня нет, но в телевизоре есть usb порт, и понимает телевизор много видео форматов. Только вот постоянно таскать флэшку к телевизору не очень удобно. Тем более если речь идет об HD фильмах 1080p. Ни каких флэшек не хватит. Благо телевизор поддерживает DLNA протокол. Было решено расшарить мультимедиа контент через DLNA сервер под Linux.

Исследуем варианты



Судя по статье на elinux.org существует 3 реализации DLNA сервера под Linux:


1. uShare
2. Rygel
3. minidlna


Не буду писать много букв про преимущества и недостатки каждого. Скажу просто, Rygel у меня вылетел и высыпал в консоль кучу debug информации. uShare заработал, но остановился на сканировании первого же каталога. Не понимает он кириллицу. Проблема известная и вроде как не решена, впрочем я сильно не исследовал этот вопрос, потому могу ошибаться. Остался minidlna. И он у меня заработал на ура.

Настраиваем и поднимаем



Скачиваем последнюю версию сервера и распаковываем архив. Внутри не будет исходников, там лежит бинарник minidlna и файл конфигурации minidlna.conf. Файл конфигурации копируем в /etc, а бинарник в /usr/sbin.


Приступим к конфигурированию сервера. Ни чего сложного в этом нет. Приведу часть моего конфига, ту, которую я изменил.



media_dir=V,/media/hdd/Медиа/Видео
media_dir=A,/home/user/Моя музыка
media_dir=P,/home/user/Мои рисунки

notify_interval=60



То есть я указал путь для контента (media_dir=). При этом буквы V, A и P указывают на характер контента. V - видео, A - аудио и P - картинки. Можно без этих букв, просто после знака равно сразу указать путь. Обратите внимание, название некоторых каталогов у меня просто ужасны. Мало того, что там кириллица, так еще и пробелы. Но minidlna все кушает на ура, даже пробелы не нужно экранировать, и это приятно меня удивило.
Параметром notify_interval я указал интервал в секундах для автоматического обнаружения новых файлов. Тут по вкусу. Иногда, после копирования нового фильма, хочется сразу его посмотреть, и не ждать 900 секунд, которые установлены по умолчанию.

Запускаем



Все просто


minidlna -d -f /etc/minidlna.conf


и можно идти и смотреть фильмы. Но как быть с автозапуском? Можно конечно поместить команду в стандартный гномовский или кдешный автозапуск. Но на мой взгляд лучше воспользоваться init.d скриптом.



#! /bin/sh

# chkconfig: 345 99 10
# description: Fedora Startup/shutdown script for MiniDLNA daemon

# If you have chkconfig, simply:
# chkconfig --add minildna

# Proper init scripts on Linux systems normally require setting lock
# and pid files under /var/run as well as reacting to network
# settings, so you should treat this with care.

# Original author: Perry Clark

### BEGIN INIT INFO
# Provides: minidlna
# Required-Start: $local_fs $remote_fs $syslog $network
# Should-Start:
# Required-Stop: $local_fs $remote_fs $syslog $network
# Should-Stop:
# Default-Start: 3 4 5
# Default-Stop: 0 1 2 6
# Short-Description: Minidlna
# Description: DLNA Media Server
### END INIT INFO

## EDIT FROM HERE

# Installation details
MINIDLNA="/usr/sbin/minidlna"
ARGS="/etc/minidlna.conf"

# Where to keep a log file
MINIDLNA_LOG="/var/log/minidlna.log"

# Where the PID lives
PID_FILE="/var/run/minidlna.pid"

## STOP EDITING HERE

# The path that is to be used for the script
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin

set -e

# Only start if we can find the minidlna.conf.
test -x $MINIDLNA || exit 0

# Parse command line parameters.
case $1 in
  start)
    echo -n "Starting MiniDLNA: "
    $MINIDLNA -f $ARGS -P $PID_FILE >> $MINIDLNA_LOG 2>&1
    echo "ok"
    ;;
  stop)
   echo -n "Stopping MiniDLNA: "
     for pidf in `/bin/ls $PID_FILE 2>/dev/null`; do
      if [ -s $pidf ]; then
        kill `cat $pidf` >/dev/null 2>&1
      fi
          rm -rf $PIF_FILE
      done
   echo "ok"
   ;;
  restart|reload|force-reload)
   echo "Restarting MiniDLNA: "

   $0 stop
    sleep 2
    $0 start

    ;;
  *)
      # Print help
      echo "Usage: /etc/init.d/minidlna {start|stop|restart|       reload|force-reload}"
      exit 1
      ;;
esac

exit 0



Подглядел тут. Называем скрипт minidlna, копируем в /etc/init.d, присваиваем права 755 и добавляем в автозапуск.


chmod 755 minidlna
sudo chkconfig minidlna on



Запускать и останавливать minidlna вручную можно командами:


sudo /etc/init.d/minidlna start
sudo /etc/init.d/minidlna stop



После запуска minidlna будет сканировать каталоги с контентом. Это может занят несколько минут. За ходом сканирования можно следить в файле /tmp/minidlna/minidlna.log. Если после изменения путей в файле конфигурации телевизор не видит новых каталогов, попробуйте удалить /tmp/minidlna/files.db и перезапустить сервер.

3 комментария:

  1. Салют ,как успехи в постижение DLNA?

    ОтветитьУдалить
  2. Нормально. Я пробовал и под Линукс (minidlna) и под Винду(HomeMediaServer). Заработало сразу.

    ОтветитьУдалить
  3. У меня под FreeBSD 2 сервера Ushare и MediaTomb папки и файлы показывают,а вот воспроизвести любой файл не получается,пишет "не поддерживаемый формат файла".

    ОтветитьУдалить