Правильная Настройка Dlna-Сервера Для Телевизоров Samsung

Здравствуйте, уважаемые жители Хабры! Я счастливый обладатель телевизора Samsung с AllShare. Для удобства просмотра видео по сети с домашнего сервера я установил minidlna. Однако за несколько месяцев мне так и не удалось добиться стабильной работы связки Samsung+minidlna: воспроизведение по сети внезапно прерывалось с разными интервалами, а сам сервер не всегда и не сразу определялся телевизором.

Перерыв кучу форумов и перепробовав множество разных вариантов и опций (включая сервер mediatomb), я наконец нашел рабочее решение.



1. Проблема с недоступностью сервера

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

Однако в моем случае tcpdump честно выдавал кучу ssdp-пакетов при включении телевизора, но сервер телевизором не определялся.

Погуглив, я обнаружил, что на сетевом интерфейсе, на котором установлена минидлна, нужно включить мультикаст и задать широковещательный адрес, что я и сделал:

  
  
  
   

ip link set br0 multicast on ip link set br0 broadcast 192.168.1.255

Вуаля! После перезапуска сети телевизор спокойно обнаружил минидлну!

2. Проблема с прерыванием видео по сети

И здесь notify_interval пригодится.

Только ее следует не уменьшать, а увеличивать.

Все дело в том, что, насколько я понимаю, протокол SSDP предполагает отправку сервером живых пакетов, в заголовке которых передается параметр max-age. И если по истечении времени, указанного в max-age, не приходит новый живой пакет, телевизор разрывает соединение.

Отрывок кода из файла minissdp.c от minidlna, из которого видно, что параметр max-age взят как notify_interval+10: Скрытый текст

l = snprintf(buf, sizeof(buf), "HTTP/1.1 200 OK\r\n" "CACHE-CONTROL: max-age=%u\r\n" "DATE: %s\r\n" "ST: %s%s\r\n" "USN: %s%s%s%s\r\n" "EXT:\r\n" "SERVER: " MINIDLNA_SERVER_STRING "\r\n" "LOCATION: http://%s:%u " ROOTDESC_PATH "\r\n" "Content-Length: 0\r\n" "\r\n", (runtime_vars.notify_interval<<1)+10, szTime, known_service_types[st_no], (st_no>1?"1":""), uuidvalue, (st_no>0?"::":""), (st_no>0Эknown_service_types[st_no]:""), (st_no>1?"1":""), host, (unsigned int)port);

Таким образом, если по какой-то причине новый активный пакет не дойдет до телевизора за время, указанное в max-age, трансляция будет прервана.

Используем простой обходной путь — увеличиваем notify_interval до нескольких часов:

notify_interval=10000

После этого лично у меня перерывов больше не было.

Я надеюсь, что эта информация будет полезна кому-то еще.

P.S. Для mediatomb вам необходимо настроить параметр live в config.xml. УПД: Нашёл в интернете отличный совет : для решения проблем с мультикастом рекомендуется отключить multicast_snooping:

echo 0 > /sys/devices/virtual/net/$BRIDGE/bridge/multicast_snooping

Возможно, это решит все проблемы, и установка огромного notify_interval станет ненужной.

Я проверю это и отчитаюсь.

Теги: #linux #*nix #Samsung #dlna #mediatomb #minidlna

Вместе с данным постом часто просматривают: