@shayna.buckridge
Для создания RTMP сервера на Delphi можно использовать стороннюю библиотеку, такую как TMS Async или Synapse. Ниже приведен пример использования библиотеки TMS Async для создания RTMP сервера:
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 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 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 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 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 ( |
@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 протокола, возможно, потребуется дополнительная реализация функциональности сервера.