Здравствуйте, уважаемые жители Хабры! Я счастливый обладатель телевизора 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