Как создать rtmp server на delphi?

Пользователь

от shayna.buckridge , в категории: Другие , 2 года назад

Как создать rtmp server на delphi?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от quinton.prosacco , 2 года назад

@shayna.buckridge 

Для создания RTMP сервера на Delphi можно использовать стороннюю библиотеку, такую как TMS Async или Synapse. Ниже приведен пример использования библиотеки TMS Async для создания RTMP сервера:

  1. Сначала необходимо создать новый проект в Delphi и добавить компоненты TMS Async (TAdvTCPClient, TAdvTCPServer и TAdvCustomHTTPServer) на форму.
  2. На форме добавьте кнопку "Start Server" и напишите обработчик события OnClick:
1
2
3
4
5
6
7
8
9
procedure TForm1.btnStartServerClick(Sender: TObject);
begin
  AdvTCPServer1.Active := False;
  AdvTCPServer1.Bindings.Clear;
  AdvTCPServer1.Bindings.Add;
  AdvTCPServer1.Bindings[0].Port := 1935; // RTMP port
  AdvTCPServer1.OnExecute := AdvTCPServer1Execute;
  AdvTCPServer1.Active := True;
end;


  1. Добавьте обработчик события OnExecute для TAdvTCPServer, чтобы обрабатывать входящие соединения и создавать экземпляры TAdvTCPClient для каждого клиента:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
procedure TForm1.AdvTCPServer1Execute(AContext: TIdContext);
var
  Client: TAdvTCPClient;
begin
  Client := TAdvTCPClient.Create(nil);
  try
    Client.IOHandler := TIdIOHandlerStack.Create(Client);
    Client.IOHandler.InputBuffer.Clear;
    Client.IOHandler.WriteBufferOpen;
    Client.Connect(AContext.Binding.IP, AContext.Binding.Port);
    AdvTCPServer1Read(Client);
  finally
    Client.Free;
  end;
end;


  1. Добавьте обработчик события OnRead для TAdvTCPClient, чтобы обрабатывать входящие сообщения RTMP:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
procedure TForm1.AdvTCPServer1Read(Client: TAdvTCPClient);
var
  Message: TRTMPMessage;
begin
  Message := ReadRTMPMessage(Client);
  try
    // Обработка сообщения RTMP
  finally
    FreeRTMPMessage(Message);
  end;
end;


  1. Добавьте функцию ReadRTMPMessage, которая будет считывать сообщения RTMP из буфера ввода TAdvTCPClient:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
function TForm1.ReadRTMPMessage(Client: TAdvTCPClient): TRTMPMessage;
var
  Header: TRTMPHeader;
  Body: TMemoryStream;
begin
  Header := ReadRTMPHeader(Client);
  Body := TMemoryStream.Create;
  try
    Body.CopyFrom(Client.IOHandler, Header.Length);
    Result := TRTMPMessage.Create(Header, Body);
  except
    FreeAndNil(Body);
    raise;
  end;
end;


  1. Добавьте функцию ReadRTMPHeader, которая будет считывать заголовок сообщения RTMP из буфера ввода TAdvTCPClient:
1
2
3
4
5
6
7
function TForm1.ReadRTMPHeader(Client: TAdvTCPClient): TRTMPHeader;
var
  RawHeader: array [0..15] of Byte;
  Timestamp: UInt32;
begin
  Client.IOHandler.ReadBytes(RawHeader, SizeOf(RawHeader));
  if (


Пользователь

от marshall.cummings , 6 месяцев назад

@shayna.buckridge 

кажется, мой предыдущий ответ был незавершенным. Продолжим создание RTMP сервера на Delphi с использованием библиотеки TMS Async:


Добавьте классы TRTMPMessage и TRTMPHeader для представления сообщений и заголовков RTMP:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
type
  TRTMPHeader = record
    TypeID: Byte;
    Length: UInt32;
    Timestamp: UInt32;
    StreamID: UInt32;
  end;

type
  TRTMPMessage = class
  private
    FHeader: TRTMPHeader;
    FBody: TMemoryStream;
  public
    constructor Create(const AHeader: TRTMPHeader; ABody: TStream);
    property Header: TRTMPHeader read FHeader;
    property Body: TMemoryStream read FBody;
  end;


В обработчике события OnExecute для TAdvTCPServer добавьте вызов ReadRTMPMessage для обработки входящих сообщений RTMP:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure TForm1.AdvTCPServer1Execute(AContext: TIdContext);
var
  Client: TAdvTCPClient;
begin
  Client := TAdvTCPClient.Create(nil);
  try
    Client.IOHandler := TIdIOHandlerStack.Create(Client);
    Client.IOHandler.InputBuffer.Clear;
    Client.IOHandler.WriteBufferOpen;
    Client.Connect(AContext.Binding.IP, AContext.Binding.Port);
    AdvTCPServer1Read(Client);
  finally
    Client.Free;
  end;
end;

procedure TForm1.AdvTCPServer1Read(Client: TAdvTCPClient);
var
  Message: TRTMPMessage;
begin
  Message := ReadRTMPMessage(Client);
  try
    // Обработка сообщения RTMP
  finally
    FreeRTMPMessage(Message);
  end;
end;


Теперь осталось реализовать функции ReadRTMPMessage и ReadRTMPHeader для считывания сообщений и заголовков RTMP из буфера ввода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
function TForm1.ReadRTMPMessage(Client: TAdvTCPClient): TRTMPMessage;
var
  Header: TRTMPHeader;
  Body: TMemoryStream;
begin
  Header := ReadRTMPHeader(Client);
  Body := TMemoryStream.Create;
  try
    Body.CopyFrom(Client.IOHandler, Header.Length);
    Result := TRTMPMessage.Create(Header, Body);
  except
    FreeAndNil(Body);
    raise;
  end;
end;

function TForm1.ReadRTMPHeader(Client: TAdvTCPClient): TRTMPHeader;
var
  RawHeader: array[0..15] of Byte;
  Timestamp: UInt32;
begin
  Client.IOHandler.ReadBytes(RawHeader, SizeOf(RawHeader));
  // Распаковка заголовка из RawHeader
end;


Это основа для создания простого RTMP сервера на Delphi с использованием библиотеки TMS Async. Для полноценной поддержки RTMP протокола, возможно, потребуется дополнительная реализация функциональности сервера.