Здравствуйте, уважаемые хабравчане! Я являюсь счастливым обладателем телевизора Samsung с функцией AllShare. Для удобства просмотра видео по сети со своего домашнего сервера я поднял minidlna. Однако за несколько месяцев мне так и не удавалось добиться стабильной работы связки Samsung+minidlna: проигрывание по сети внезапно прерывалось через разные промежутки времени и сам сервер далеко не всегда и не сразу обнаруживался телевизором. Перерыв кучу форумов и перепробовав множество различных опций и вариантов (в том числе сервер mediatomb), я таки нашел рабочее решение.
В этом посте уже приводилось решение обозначенной проблемы: автор предлагает уменьшить notify_interval, потому как телевизор не хочет сам опрашивать сеть на наличие DLNA-серверов. Однако в моем случае tcpdump честно выводил кучу ssdp пакетов при включении телевизора, но сервер телевизором не обнаруживался. Погуглив, я обнаружил, что на сетевом интерфейсе, на котором висит minidlna, нужно включить мультикаст и задать бродкаст адрес, что я и сделал:
Вуаля! После перезапуска сети телевизор спокойно обнаружил minidlna!
А вот тут нам и пригодится notify_interval. Только его нужно не уменьшать, а увеличивать. Все дело в том, что, насколько я понял, протокол SSDP подразумевает отправку сервером alive-пакетов, в заголовке которого передается параметр max-age. И если по истечении времени, указанного в max-age, новый alive-пакет не приходит, телевизор разрывает соединение.
Отрывок кода из файла minissdp.c из состава minidlna, из которого видно, что параметр max-age берется как notify_interval+10:
Таким образом, если по какой-то причине новый alive пакет не дошел до телевизора за заданное в max-age время, то вещание прервется. Используем простой workaround — увеличиваем notify_interval до нескольких часов:
После этого лично у меня разрывов больше не наблюдалось. Надеюсь, что данная информация пригодится кому-нибудь еще.
P.S. Для mediatomb нужно поправить параметр alive в config.xml.
UPD: Нашел в сети отличный совет: для решения проблем с мультикастом советуют отключить multicast_snooping:
Возможно это решит все проблемы, и задавать огромный notify_interval окажется лишним. Потестирую — отпишусь.
1. Проблема с недоступностью сервера
В этом посте уже приводилось решение обозначенной проблемы: автор предлагает уменьшить notify_interval, потому как телевизор не хочет сам опрашивать сеть на наличие DLNA-серверов. Однако в моем случае tcpdump честно выводил кучу ssdp пакетов при включении телевизора, но сервер телевизором не обнаруживался. Погуглив, я обнаружил, что на сетевом интерфейсе, на котором висит minidlna, нужно включить мультикаст и задать бродкаст адрес, что я и сделал:
ip link set br0 multicast on
ip link set br0 broadcast 192.168.1.255
Вуаля! После перезапуска сети телевизор спокойно обнаружил minidlna!
2. Проблема с прерыванием видео по сети
А вот тут нам и пригодится notify_interval. Только его нужно не уменьшать, а увеличивать. Все дело в том, что, насколько я понял, протокол SSDP подразумевает отправку сервером alive-пакетов, в заголовке которого передается параметр max-age. И если по истечении времени, указанного в max-age, новый alive-пакет не приходит, телевизор разрывает соединение.
Отрывок кода из файла 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);
Таким образом, если по какой-то причине новый alive пакет не дошел до телевизора за заданное в max-age время, то вещание прервется. Используем простой workaround — увеличиваем notify_interval до нескольких часов:
notify_interval=10000
После этого лично у меня разрывов больше не наблюдалось. Надеюсь, что данная информация пригодится кому-нибудь еще.
P.S. Для mediatomb нужно поправить параметр alive в config.xml.
UPD: Нашел в сети отличный совет: для решения проблем с мультикастом советуют отключить multicast_snooping:
echo 0 > /sys/devices/virtual/net/$BRIDGE/bridge/multicast_snooping
Возможно это решит все проблемы, и задавать огромный notify_interval окажется лишним. Потестирую — отпишусь.