Возможна ли реализация RTMP в nodejs?

Я пытаюсь реализовать RTMP в Node.js, но, увидев документацию и попытавшись, я не могу, и я подозреваю, что это невозможно, чтобы увидеть, как node.js обрабатывает потоки данных.

я разветвляю этот код: https://github.com/timwhitlock/node-amf/tree/master/node-rtmp

судя по коду и коряво написанной документации adobe, после подключения запускается процесс рукопожатия, клиенты отправляют поток из 1537 октетов, где первый - rtmp версия (должно быть всегда 3), следующие 4 - временная метка а остальные 4 должны быть 0 (0000), все остальные данные являются случайными символами.

теперь связанная библиотека делает все это, но ломается в момент проверки 4 нулей. он использует модуль Net для создания сервера и прослушивания события подключения. используя объект сокета, предоставленный событием, установите кодировку на «бинарную» (этот тип кодировки не существует, насколько я вижу в документации http://nodejs.org/api/stream.html).#stream_stream_setencoding_encoding ), а затем попробуйте проверить наличие четырех нулей

я подозреваю, что сокет в любом случае кодируется в «utf8», и есть место, где поток испортится, так как печать первых байтов никогда не бывает одними и теми же данными. изменив на шестнадцатеричное кодирование сокета, я нашел совпадения, которые указывали бы на четыре нуля, которые я ищу:

V | TIME   |4 ZEROS |RANDOM DATA
03|0091c3ee|80000702|3e904115
03|0091ea60|80000702|f6e2d38a
03|00921a47|80000702|f2e21db3

03|0092eaeb|80000702|15834dbf
03|00931e0d|80000702|5f0b7891
03|00933c68|80000702|b4980c5d

даже я мог бы заставить это работать так, когда мне нужно передавать реальные данные, такие как видео, аудио и т. д., на сервер (я знаю, что я могу писать из двоичных данных сокета, передавая Буферизируйте объект и используйте это: https://github.com/substack/node-binary ) и сокет не может обрабатывать двоичные данные, у меня будут поврежденные данные, верно?

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


person shadow_of__soul    schedule 09.08.2012    source источник
comment
Пожалуйста, посмотрите мой вопрос, если сможете. stackoverflow.com/ вопросы/16241044/   -  person Marcelo Rodovalho    schedule 26.04.2013


Ответы (2)


ну, мой ответ был в той же документации, если я вообще не вызываю setEncoding () в объекте сокета, возвращаемом модулем Net, я могу получить простой двоичный буфер, который я могу анализировать по своему желанию, так что это кажется возможным.

тем не менее, полученные данные не равны 0 (в байтах 5,6,7 и 8 есть 128 0 7 2), поэтому мне нужно знать, как правильно анализировать двоичные данные, но, по крайней мере, на данный момент это кажется возможным.

С уважением, Тень.

person shadow_of__soul    schedule 10.08.2012

Это не проблема кодировки (вы не ошибаетесь). Самое близкое объяснение, которое я смог найти, находится в источнике Red5:

OutboundHandshake.java:96

Каким-то образом это поле используется для передачи версии реализации.

person vbence    schedule 23.07.2015