Search     or:     and:
 LINUX 
 Language 
 Kernel 
 Package 
 Book 
 Test 
 OS 
 Forum 
 iakovlev.org 
      Languages 
      Kernels 
      Packages 
      Books 
      Tests 
      OS 
      Forum 
      Математика 
NEWS
Последние статьи :
  Тренажёр 16.01   
  Эльбрус 05.12   
  Алгоритмы 12.04   
  Rust 07.11   
  Go 25.12   
  EXT4 10.11   
  FS benchmark 15.09   
  Сетунь 23.07   
  Trees 25.06   
  Apache 03.02   
 
TOP 20
 Secure Programming for Li...6610 
 Linux Kernel 2.6...5372 
 Trees...1244 
 Максвелл 3...1171 
 Go Web ...1153 
 William Gropp...1145 
 Clickhouse...1033 
 Ethreal 4...1032 
 Ethreal 3...1030 
 Ethreal 1...1029 
 Rodriguez 6...1021 
 Ext4 FS...1020 
 Gary V.Vaughan-> Libtool...1008 
 Steve Pate 1...998 
 Assembler...975 
 C++ Patterns 3...964 
 Ulrich Drepper...940 
 DevFS...887 
 MySQL & PosgreSQL...872 
 Стивенс 9...847 
 
  01.01.2024 : 3621733 посещений 

iakovlev.org

Протокол RTMP

Материал взят из ВИКИ отсюда и отсюда
Спецификация самого протокола лежит тут

Real Time Messaging Protocol - протокол , придуманный Adobe , предназначен для передачи флеш-обьектов и видео по сети. В качестве серверов могут выступать : MacroMedia Media sever, Open Source Red5 , и другие. Это упрощенный протокол , оптимизированный для сетей со слабой пропускной способностью. Один коннект может поддерживать до 64 потоков. Каждый пакет должен включать в себя id потока. Пакеты бьются на фиксированные части одинакового размера, называемые chunk.

Для коннекта используется Tcp/ip port 1935. Коннект инициируется клиентом.
1. Вначале клиент посылает 1 байт - 0x3. Затем посылает блок данных размером 1536 байт.
2. Сервер получает эти данные , затем также в свою очередь посылает сначала байт 0x3 , затем произвольный блок 1536 байт, затем повторно тот же клиентский блок данных размером 1536 байт.
3. Клиент получает этот блок , отсылает еще раз те же 1536 байт, после чего устанавливается коннект - handshake выполнен.

Далее клиент посылает серверу 3 стандартных пакета : первый пакет - это пакет , подтверждающий коннект. Во втором пакете клиент посылает обьект NetConnection. В третьем пакете клиент посылает обьект NetStream.

RTMP-пакет состоит из хидера фиксированной длины и тела переменной длины, последняя по умолчанию равна 128 байт. Рассмотрим формат RTMP хидера , возьмем его первый байт. Первые 2 бита определяют размер самого хидера. Тут возможны всего 4 варианта для комбинации из двух бит:

 0 - в этом случае размер хидера = 12 байтам
 1 - в этом случае размер хидера = 8  байтам
 2 - в этом случае размер хидера = 4  байта
 3 - в этом случае размер хидера = 1  байт
 
 В оставшихся 6 битах байта прописывается id-шник потока, что ограничивает число потоков в одном коннекте до 64.
 
Если размер хидера 8 и более байт, 3 следующих байта используется для записи размера самого пакета. Если размер хидера 4 байта и менее, размер пакета будет стандартным: 128 байт для видео и 64 байта для аудио.

Для 8-байтных и выше хидеров , следующий - пятый байт - указывает тип обьекта :

 0x3 - start rtmp connection
 0x4 - ping packet
 0x5 - server response
 0x6 - client request
 0x8 - audio
 0x9 - video
 0x12 - notify
 0x13 - shared object
 0x14 - rpc
 
Типы данных :
 0x0 - numeric value
 0x1 - boolean value
 0x2 - ASCII string
 0x3 - Flash object
 0x4 - Flash movie
 0x5 - NULL
 0x6 - undefined
 0x7 - reference
 0x8 - ECMA array
 0x9 - end of an object 
 0xa - Strict array
 ...
 
Пример RTMP - хидера (16-ричный расклад):
 03 000019 0000c9 14 00000000
 
 Первый байт :
   первые 2 бита - нули - говорят о том , что размер хидера - 12 байт
   следующие 6 бит - три  - id-шник потока
 Следующие 3 байта :
   000019 - timestamp относительно предыдущего пакета
 Следующие 3 байта :
   0000c9 - размер самого пакета - 201 байт
 Следующий  байт :
   14 - content type - в данном случае rpc
 Следующие 4 байта :
   00000000 - NetConnection object
 
Рассмотрим еще один пример RTMP-пакета , посылаемого клиентом после handshake - это результат работы флешового NetConnection.Connect :
 03    
 00 00 01     
 00 01 05
 14
 00 00 00 00
 02 00 07 63
 ...
 
 03 - первый байт , в двоичной форме это выглядит так :
      0000 0011 -> 0x03  
      первые 2 бита равны нулю - значит хидер равен 12 байтам
 
 
 00 00 01 - следующие 3 байта всегда имеют место быть , когда мы имеем дело с видео/аудио данными
 
 
 00 01 05 - следующие 3 байта указывают размер самих данных пакета : 256 + 5 = 261 байт
 
 
 14 - этот байт указывает тип обьекта - function call
 
 
 00 00 00 00 - NetStream обьект
 
 
 02 00 07 63 - дальше идут сами данные в форме chunks по 128 байт , каждый последующий chunk
               имеет свой однобайтный хидер - 0xc3
 
 
     
 
В случае, когда размер хидера равен 4 байтам, внутри пакета поле - длина - может присутствовать, а может и нет, во втором случае размер пакета берется таким же, как у предыдущего пакета.

Рассмотрим случай, когда клиент посылает запрос CreateStream. При этом происходит следующий диалог:
1. Client -> Server : посылает CreateStream запрос.
2. Server -> Client : посылает streamIndex число
3. Client -> Server : проверка publish
4. Server -> Client : посылает аудио и видео-пакеты
RTMP protocol использует следующую разрядность при идентификации потока:

 64-bit floats 
 32-bit little-endian integers
 32-bit big-endian integers
 
Рассмотрим пример , когда имеются 4 порции аудио-данных по 32 байта каждая :
 123   8   1000    32
 123   8   1020    32
 123   8   1040    32
 123   8   1060    32
 
 123 - это Message Stream ID
 8   - это Message TYpe ID 
 В 3-м столбце стоит timestamp
 В 4-м - размер данных.
 
 Получаем четыре chank-а :
 
    3     0        32        44      
    3     2        32        36      
    3     3        32        33      
    3     3        32        33      
 
 В 3-м столбце - размер данных , в 4-м - суммарный размер
 В первом чанке в хидере будет полная информация - хидер будет размером в 11 байт :
  delta: 1000
  length: 32
  type: 8
  stream ID: 123
 
 Во втором чанке хидер будет 3-байтовый - там будет delta=20
 Начиная с 3-го чанка , хидер будет размером в 1 байт - в нем будет id потока и тип самого чанка : 3 и 3 
 
 
Еще один пример - с видео-данными , имеется одна порция :
 456    9 (video)     1000     307 
 
 Здесь идет разбиение на 3 чанка :
  4     0   128          140      
  4     3   128          129      
  4     3    51          52       
   
 В первом чанке хидер будет 11-байтный
 Начиная со второго - однобайтные .
 
 
 
 
Оставьте свой комментарий !

Ваше имя:
Комментарий:
Оба поля являются обязательными

 Автор  Комментарий к данной статье