1

Тема: Передача ссылки по DLNA на воспроизведение файла по сети

Как-то, в одной теме, задавали вопрос по поводу почему телевизор не отображает название отправившего ему файл устройства.
Мне вот самому было интересно разобраться бы как работает это всё DLNA и я даже начал пробовать всё это изучить на низком уровне, попробовать отсылать сообщение и вообще посмотреть - как это всё работает.
Я подключал свой телефон к Wi-Fi через прокси, который был Charles и там просматривал как общаются между собой устройства и телевизор.
Написал маленькую программку, которая бы в точности повторяла подобные действия и могла общаться с телеком, а именно посылать ему команды Stop, "Установить ссылку на файл" и Play. Также подключал свой телевизор к сети также через прокси и смотрел.

И у меня даже получилось. Начал читать LDNA спецификацию и прочее. Надо сказать, что мне пришлось умерить пыл и свои скачущие мысли от потуг написать что-то типа мини DLNA сервера, который бы мог быть виден телевизором, встроенным HTTP сервером, и вообще.. Но, подумал, что меня явно тут посчитают неадекватом, который из-за лени писать код скриптов пишет HMSEditor, а чтобы разобраться как работает DLNA, пишет медиа-сервер...

Так вот что мне стало интересно. Дело в том, что на моём телеке в программе Домашний медиа-сервер ну напрочь никак не получалось использовать возможности таких настроек, как  "Оригинальная ссылка", "Оригинальная ссылка (перенаправление)" и "Оригинальный поток".
При включении данных настроек у меня в телевизоре перестают отображаться ссылки на видео. Только папки.
Поэтому как-то давно я уже успокоился и решил, что мой телевизор данный режим просто не поддерживает и завидовал людям, которые этим пользуются.

Но тут, написав программку, которая может отсылать файл телеку, причём через себя никакого потока не передавая, а просто указав ссылку на сторонний http ресурс, понимаю - что мой телек прекрасно это воспроизводит! Т.е. по сути - эта самая фича - передача телевизору оригинальной ссылки. А он уже без участия кого-либо спокойно проигрывает файл из интернета.
Мне стало интересно и даже появилась надежда, что всё-таки можно настроить мой телек и HMS на такую работу.

Я написал маленькую программку, которая может отсылать телеку ссылку на файл и дать ему команду проиграть его.

+ Как это работает технически

Т.к. при включении устройства оно в сети создаёт свой http сервер, порт работы может устанавливаться разный и отличаться от случая к случаю.
Поэтому для начала посылается широковещательный UDP запрос в локальную сеть по адресу
239.255.255.250:1900 с определёнными заголовками:
M-SEARCH * HTTP/1.1
HOST:239.255.255.250:1900
MAN:"ssdp:discover"
ST:upnp:rootdevice
MX:3
USER-AGENT: unix/5.1 UPnP/1.0 testdlna/1.0

(Спецификация upnp)

В течении где-то 3-х секунд устройства в сети должны ответить и сообщить о своём существовании.
Где в заголовках ответа мы можем узнать их LOCATION - ссылку на xml с описанием устройства и его сервисов (типа может проигрывать файлы и проч). А также заодно и узнать по какому порту он в данный момент работает.

Сходив по этой ссылке узнаём всё о сервисах и какие параметры нужно передавать, чтобы отдавать команды.

В нашем случае, используется только сервис "AVTransport", который как раз отвечает за удалённую установку ссылки и команды Stop, Play, GetCurrentPosition или типа того.

Теперь при общении с устройством в заголовках запроса добавляем поле "SOAPACTION" с указанием сервиса и команды.
Также передаём дополнительную информацию в виде XML, где указывает параметры в зависимости от команды.
В случае указания файла, который ему нужно проиграть, также добавляется DIDL-Lite сообщение в формате xml, где описываются формат(ы) файла(ов) передаваемые телеку - его MIME-тип, имя, длительность, размер и проч.

Первым параметром в моей программке указывается IP адрес устройства, на который хотим послать файл.
Если никаких других параметров установлено не было, то будет послан файл, который зашит в самой программе (какая-то реклама)

Пример использования:
testdlna.exe 192.168.1.20
или
testdlna.exe 192.168.1.20 -f "http://pw22.poiuytrew.pw/s/44684c4f59a2 … 03_480.mp4"

Также есть ключ "-d". Если будет установлен - будет создаваться файл "testdlna.exe.log", где будут подробно запротоколированы все ответы от устройства.

Вместо 192.168.1.20 нужно указывать IP своего телевизора. Но можно и указать ключевое слово, которое точно его идентифицирует (ищет в ответах).
Например, в моём случае, можно даже так:
testdlna.exe sony -d

Первые несколько секунд в сети будут искаться устройства. Потом, если найдено нужное, ему будут отправлены три команды:
Stop, SetAVTransportURI и Play.

Также, для пущих экспериментов, сделал возможность указывать ссылку на youtube, например:
testdlna.exe sony -d -f "http://www.youtube.com/watch?v=25pzrnf8xyk"

Программка сама получить ссылку на реальный видео файл и попытается его отправиться телеку.

Но что с Sony?

А вот что. Если встроенная ссылка нормально показывается на моём телевизоре, то практически все другие - отказывается. Проанализировав заголовки запросов и ответов я пришёл и удивительным выводам.

Посылаем телеку ссылку:

http://cxz.to/get/dl/6fmpm2g2rmr6147s8u1ot8txa.0.1139013157.2185543202.1447516225/American.Ultra.2015.D.BDRip.1080p.360.mp4

Телек:

HEAD /get/dl/6fmpm2g2rmr6147s8u1ot8txa.0.1139013157.2185543202.1447516225/American.Ultra.2015.D.BDRip.1080p.360.mp4 HTTP/1.1
getcontentFeatures.dlna.org: 1
Pragma: getIfoFileURI.dlna.org
X-AV-Physical-Unit-Info: pa="BRAVIA KDL-32CX523";
X-AV-Client-Info: av=5.0; cn="Sony Corporation"; mn="BRAVIA KDL-32CX523"; mv="1.7";
Host: 54.194.29.154:80


HTTP/1.1 403 Forbidden
Server: nginx
Date: Sat, 14 Nov 2015 16:25:20 GMT
Content-Type: text/html
Content-Length: 162
Connection: keep-alive

Стоп! 54.194.29.154:80? Это он имя cxz.to зарезолвил в IP и по нему стал обращаться. Но обломался. А почему?
Сделаем запрос через браузер ссылке выше, ответ такой:

HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Sat, 14 Nov 2015 16:28:13 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: keep-alive
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: http://filecdn.to/fsuaget/MWUyZTgzZDlkY2U0NzhjMjY1ZGM4NzQ3MGYxOGFmOGFmc3RvfDM5NjgyMzg1fDEwMDAwfDB8MHx8NDE2YjM3ZWUxZjM5ZDZlODMwOTgyNTA3OGM2NWNmMDh8MXwxNDQ3NTE4NDkz/American.Ultra.2015.D.BDRip.1080p.360.mp4

Т.е. перенаправление на совсем другой ресурс с другой ссылкой.
А телек сделал тупо - перенаправление игнорирует (не умеет) и запрашивает по ip со старым значением запроса.

Ок. Сделаем это за него и посмотрим куда ведёт эта ссылка и отдадим телеку уже команду проиграть окончательную ссылку после всех перенаправлений:

http://n25.filecdn.to/ff/MWUyZTgzZDlkY2U0NzhjMjY1ZGM4NzQ3MGYxOGFmOGF8ZnN0b3wzOTY4MjM4NXwxMDAwMHwwfDB8bnwyNXxhZWJjNDVhZTJjMzc4ZmM0MzlmYzhmNmZkNDVkMWQxMXwxfDI2OnEuMzY6ZXwwfDgzMjUyNDU2OHwxNDQ3NTE5MDU3LjM4NDI,/American.Ultra.2015.D.BDRip.1080p.360.mp4

И что вы думаете? Это странное устройство стало запрашивать файл:

http://91.226.97.25/ff/MWUyZTgzZDlkY2U0NzhjMjY1ZGM4NzQ3MGYxOGFmOGF8ZnN0b3wzOTY4MjM4NXwxMDAwMHwwfDB8bnwyNXxhZWJjNDVhZTJjMzc4ZmM0MzlmYzhmNmZkNDVkMWQxMXwxfDI2OnEuMzY6ZXwwfDgzMjUyNDU2OHwxNDQ3NTE5MDU3LjM4NDI,/American.Ultra.2015.D.BDRip.1080p.360.mp4

где и обламывается. Потому как на одном IP могут находится много серверов и они, естественно смотрят, куда именно идёт запрос. И только редкие на уникальном ip, которым всё равно - будут правильно отдавать файл.


Итого, выводы:
Телек Sony - не умеет работать с перенаправлениями (ответы 301-303) и делает запрос всегда по IP, а не по доменному имени.
Отсюда великие обломы.
1) Почти любой сервер с хранением медиа-контента работает с CDN - распределением нагрузки и перенаправляет трафик - для Sony облом.
2) Почти никто из серверов не хочет отдавать контент по указанному конкретному адресу, а работает с доменным именем и смотрит на какой именно пришёл запрос - для Sony облом.

Грустно. Решил поделиться. Исходники проги.
Думаю, с другими телевизорами таких проблем нет.

Файл testdlna.exe прикреплён в сообщении ниже.

Sony Bravia KDL-32CX523

2 (2015.11.16 21:48:50 отредактировано PashaN65)

Re: Передача ссылки по DLNA на воспроизведение файла по сети

Привет WendyH!
Решил протестировать эту программку на саоем телевизоре, получил 2 результата:
1) при запуске testdlna.exe 192.168.0.2 -d на телевизор пошел ролик, лог добавлен в архиве testdlna.exe.log_1.7z
2) при запуске testdlna.exe 192.168.0.2 -d -f "http://fs.to/get/dl/673tbd2uihbhcb7k5qy … SATRip.avi" выдало на телевизор, что формат файла не поддерживается и все, лог в архиве testdlna.exe.log_2.7z
  Хтоя это-же через ХМС (оргинальный поток(http://,rtmp://)) показывает на телевизоре нормально - без транскодирования.
  Так что это не СОНЯ виновата.

Вот такой результат теста.
Спасибо за настойчивость!!!!

Прикреплённые файлы сообщения

testdlna.exe.log_1.7z 2.71 kb, скачивалось 471 раз, начиная с 2015.11.16

testdlna.exe.log_2.7z 2.4 kb, скачивалось 454 раза, начиная с 2015.11.16

Samsung SMART TV 8 серии UE55TU8500RW + LAN
Xiaomi Redmi Note 9
DIR-825ACG1

3

Re: Передача ссылки по DLNA на воспроизведение файла по сети

Если вы не против, то вот новая версия, проверьте с ней. Я увидел косяк в своей программе по вашим логам - он выставлял для avi неправильный MIME тип и, скорее всего, телек не понимал формата. У меня Сони до этого момента даже не доходила - писала, что файл не доступен или типа того.
И я старался подсовывать ей только mp4, которые она любит.
Исправил программку, попробуйте заново. Интересно ведь.
А он у вас ничего при старте телек не пишет? Типа "Неизвестное устройство 0".

Sony Bravia KDL-32CX523

4 (2015.11.17 20:32:35 отредактировано PashaN65)

Re: Передача ссылки по DLNA на воспроизведение файла по сети

При запуске второго варианта программы
testdlna.exe 192.168.0.2 -d
выскакивает ошибка:

Необработанное исключение: System.TypeInitializationException: Инициализатор типа "testdlna.DLNA" выдал исключение. --->
 System.ArgumentException: Элемент с тем же ключом уже был добавлен.
   в System.Collections.Generic.Dictionary`2.Insert(TKey key, TValue value, Boolean add)
   в testdlna.DLNA..cctor()
   --- Конец трассировки внутреннего стека исключений ---
   в testdlna.DLNA..ctor()
   в testdlna.Program.Main(String[] args)
Samsung SMART TV 8 серии UE55TU8500RW + LAN
Xiaomi Redmi Note 9
DIR-825ACG1

5

Re: Передача ссылки по DLNA на воспроизведение файла по сети

Кстати, по поводу MIME-типов у телеков SONY встречаются свои нестандартные заморочки. Просто вспомнил, что давно на каком то форуме человек не мог заставить свою SONYU показывать MKV по DLNA, пока не поменял "video/x-matroska" то ли на "video/x-msvideo" то ли на "video/x-mkv".
Т.Е. единого стандарта для всех телеков здесь нет, и если для моего LG чтобы он понял что это видеофайл достаточно на подкаст выставить Video/mpeg, то возможно для других телеков надо конкретно указывать MIME-тип который они точно понимают.

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

6

Re: Передача ссылки по DLNA на воспроизведение файла по сети

Блин, какое позорище, отправить не проверив. Извините. Исправил.

Leshiy71 пишет:

Кстати, по поводу MIME-типов у телеков SONY встречаются свои нестандартные заморочки. Просто вспомнил, что давно на каком то форуме человек не мог заставить свою SONYU показывать MKV по DLNA, пока не поменял "video/x-matroska" то ли на "video/x-msvideo" то ли на "video/x-mkv".
Т.Е. единого стандарта для всех телеков здесь нет, и если для моего LG чтобы он понял что это видеофайл достаточно на подкаст выставить Video/mpeg, то возможно для других телеков надо конкретно указывать MIME-тип который они точно понимают.

Да, именно это в последней версии я и исправляю. Взял таблицу определения MIME типов в интернете и думал что стандартно. А посмотрев тип avi - сравнил с тем, как выставляет HMS - различается:
HMS - video/avi
а было - video/x-ms-video
Вот этим вот и подправленная версия и отличается. И там вообще всю таблицу в соответствии как в HMS сделал. Даже добавил audio и image MIME типы, но не проверял отправку музыки и фото.

Sony Bravia KDL-32CX523

7

Re: Передача ссылки по DLNA на воспроизведение файла по сети

Ещё надо учитывать, что в HMS для разных телеков выставляются разные MIME- типы для одного и того же формата видео. Например у меня изначально был выставлен профиль от LG-BD Player и с ним никогда не показывали с компа FLV без транскода. А когда сравнил с профилем LG-TV, то оказалось что всё дело в указанном по другому MIME-типе.
Конкретные модели телеков могут по разному один и тот же формат обзывать.

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

8

Re: Передача ссылки по DLNA на воспроизведение файла по сети

Leshiy71 пишет:

Ещё надо учитывать, что в HMS для разных телеков выставляются разные MIME- типы для одного и того же формата видео. Например у меня изначально был выставлен профиль от LG-BD Player и с ним никогда не показывали с компа FLV без транскода. А когда сравнил с профилем LG-TV, то оказалось что всё дело в указанном по другому MIME-типе.
Конкретные модели телеков могут по разному один и тот же формат обзывать.

Вот же ж жесть то. У меня были смутные предположения, и вот вы подтвердили.

Сделал ещё новую версию программки. Добавил ключ -m.
Теперь можно ещё для кучи указывать и MIME тип:

testdlna.exe <IP адрес устройства> -m "video/avi" -f "http ссылка на фильм.avi"

Если кому захочется поэкспериментировать.

PashaN65, Leshiy71 - так и не проигрываются фильмы, например, со ссылкой из подкаста cxz.to (fs.to)? Там могут быть и avi и mkv. Лично у меня не хотят, но по другой причине.
А с youtube?
testdlna.exe <IP адрес устройства> -d -f "http://www.youtube.com/watch?v=25pzrnf8xyk"

Хоть Sony и отказался играть, а вот запущенный на телефоне BubbleUPnP нормально начал воспроизводить.
Но с BubbleUPnP другая проблема, он часто его не находит при опросах. По карйней мере, у меня. Может только с 5-го раза его среди устройст обнаружить. Я так понимаю он не торопится отвечать на широковещательные запросы.
Кстати, MIME тип можно указывать почти любой, главное чтобы виде или аудио было понятно. Например, если отправить на
testdlna.exe bubble -m "audio/xxx" -f "http://www.youtube.com/watch?v=25pzrnf8xyk"

то он начнёт играть только звук.

Также эспериментировал с отправкой музыки. Например, получается отправить ссылку на интернет радио:
testdlna.exe sony -m "audio/mpeg" -f "http://s5.deb1.scdn.smcloud.net/t004-1.mp3"

А вот так, почему-то мой телек напрочь долго крутит и ничего не воспроизводит:
testdlna.exe sony -m "audio/mpeg" -f "http://pub1.diforfree.org:8000/di_indiedance_hi"

Хотя BubbleUPnP норм воспроизводит.

Прикреплённые файлы сообщения

testdln (4).zip 12.86 kb, скачивалось 576 раз, начиная с 2015.11.18

Sony Bravia KDL-32CX523

9

Re: Передача ссылки по DLNA на воспроизведение файла по сети

Протестировал. Все также.
testdlna.exe <IP адрес устройства> -d - показывает
testdlna.exe <IP адрес устройства> -m "video/avi" -f "http ссылка на фильм.avi" - не показывает (неподдерживаемый тип файла)

Samsung SMART TV 8 серии UE55TU8500RW + LAN
Xiaomi Redmi Note 9
DIR-825ACG1

10

Re: Передача ссылки по DLNA на воспроизведение файла по сети

В упор не соображу, куда и как вписать IP телека. EXE файл блокнотом не открывается.

LG 42LM640T
Профиль  Универсальный
Видишь суслика ? Нет ! И я нет ! А он есть !!!

11 (2015.11.20 21:34:37 отредактировано PashaN65)

Re: Передача ссылки по DLNA на воспроизведение файла по сети

Leshiy71 пишет:

В упор не соображу, куда и как вписать IP телека. EXE файл блокнотом не открывается.

Его нужно в командной стороке прописывать (запустив cmd например, или Total Commander или FAR)

+ открыть спойлер

http://s019.radikal.ru/i620/1511/6f/3ae7a75af368.png

Ну как-то так!

Samsung SMART TV 8 серии UE55TU8500RW + LAN
Xiaomi Redmi Note 9
DIR-825ACG1

12

Re: Передача ссылки по DLNA на воспроизведение файла по сети

На Samsung UE32D5000PW
testdlna.exe <IP адрес устройства> -d

+ открыть спойлер

http://s020.radikal.ru/i704/1511/9d/477c469464df.jpg

Прикреплённые файлы сообщения

testdlna.exe.log 30.34 kb, скачивалось 766 раз, начиная с 2015.11.20

13 (2017.11.27 20:37:04 отредактировано xpenn)

Re: Передача ссылки по DLNA на воспроизведение файла по сети

Подскажите, а сложно исходники откомпилировать на arm linux для raspberry? Ума не приложу как это сделать.

Или сделать тоже самое на php.

Искал подобные проекты на php, но находил кучу замороченных серверов только.

Задача - встроить в систему умного дома MAJORDOMO https://majordomo.smartliving.ru/forum/ … amp;t=4156