PureBasic - форум

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » PureBasic - форум » PureBasic для Windows » RTSP PureBasic


RTSP PureBasic

Сообщений 1 страница 14 из 14

1

Всем привет! Я чайник, но тут постараюсь делится опытом и наработками.
Есть необходимость создать двухстороннюю видео связь чтоб объединить людей и сделать мир счастливее.
Использовать USB WEB камеру не надёжно, сложная повторяемость конфигурации и в целом лучше всего и дешевле будет китайская IP камера, я взял в магазине (год назад) за 1000р. Digma DiVizion 100.

После вкуривания ссылки на просмотр видео из VLC плеер, был перехвачен через снифер SmartShiff синтаксис и тут есть вопросы.

Ссылка для VLC плеера: rtsp://192.168.43.138:10554/tcp/av0_0

Интересно то, что логина и пароля не надо было вообще, просмотр идёт без проблем.

https://forumupload.ru/uploads/0009/ae/28/591/t408821.png

Обратите внимание на символ 20 - "¶", я пробовал воссоздать в точности такой пакет, но ничего не вышло, как оказалось вот синтаксис для команды:

Код:
  command="OPTIONS rtsp://192.168.43.138:10554/tcp/av0_0 RTSP/1.0"+#CRLF$
  command+"CSeq: 2"  +#CRLF$
  command+"User-Agent: LibVLC/3.0.11 (LIVE555 Streaming Media v2016.11.28)"+#CRLF$
  command+#CRLF$
  SendNetworkString(rtsp,command , #PB_UTF8)  

Тестовая программа простая:

Код для теста
Код:
If InitNetwork() = 0
  MessageRequester("ОШИБКА", "Нет сети" ,0)
  End
EndIf

Port = 10554
command.s=""
rtsp = OpenNetworkConnection("192.168.43.138", Port, #PB_Network_TCP)
If rtsp
  
  command=""
  command="OPTIONS rtsp://192.168.43.138:10554/tcp/av0_0 RTSP/1.0"+#CRLF$
  command+"CSeq: 2"  +#CRLF$
  command+"User-Agent: LibVLC/3.0.11 (LIVE555 Streaming Media v2016.11.28)"+#CRLF$
  command+#CRLF$
  Debug "====================   ОТПРАВКА ДАННЫХ  ======================="
  Debug ">"+command+"<"
  Debug "====================    ПРИЁМ ДАННЫХ    ======================="

  SendNetworkString(rtsp,command , #PB_UTF8)  
*Buffer=AllocateMemory(10000)
  quit=0
  tm=0
  Delay(100)
  Repeat
    
      SEvent = NetworkClientEvent(rtsp) ;======== Проверка событий по TCPIP

  
      Select SEvent
      
        Case #PB_NetworkEvent_Connect
          MessageRequester("PureBasic - Server", "A new client has connected !", 0)
  
        Case #PB_NetworkEvent_Data
          ;MessageRequester("PureBasic - Server", "Client "+Str(rtsp)+" has send a packet !", 0)
          ReceiveNetworkData(rtsp, *Buffer, 10000)
          Debug ">"+PeekS(*Buffer, -1, #PB_UTF8)+"<"
          
          tm=tm+1
          Debug tm
          Select tm
            Case 1    
                command=""
                command+"DESCRIBE rtsp://192.168.43.138:10554/tcp/av0_0 RTSP/1.0"+#CR$+#LF$
                command+"CSeq: 3"  +#CRLF$
                command+"User-Agent: LibVLC/3.0.11 (LIVE555 Streaming Media v2016.11.28)"  +#CR$+#LF$
                command+"Accept: application/sdp"  +#CR$+#LF$
                command+#CRLF$+#CRLF$
                Debug "====================   ОТПРАВКА ДАННЫХ  ======================="
                Debug ">"+command+"<"
                Debug "====================    ПРИЁМ ДАННЫХ    ======================="
                SendNetworkString(rtsp,command , #PB_UTF8) 
                Delay(100)
            Case 2
              Quit = 1
          EndSelect
            
        Case #PB_NetworkEvent_Disconnect
          MessageRequester("Соединение закрыто ","Ответ сервера:" +Str(rtsp), 0)
          Quit = 1
    
      EndSelect
 
    
  Until Quit = 1 
 
  CloseNetworkConnection(rtsp)
   
Else
  MessageRequester("ОШИБКА", "Нет соединения", 0)
EndIf
  
End

Ответ от программы:

Картинка

На всякий случай общение VCL плеера до момента передачи кучи инфомрации:

От снифера
Код:
OPTIONS rtsp://192.168.43.138:10554/tcp/av0_0 RTSP/1.0
CSeq: 2
User-Agent: LibVLC/3.0.11 (LIVE555 Streaming Media v2016.11.28)


RTSP/1.0 200 OK
Cseq: 2
Date: Sat, Oct 10 2020 21:13:43 GMT
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, PLAY, PAUSE, GET_PARAMETER, SET_PARAMETER


DESCRIBE rtsp://192.168.43.138:10554/tcp/av0_0 RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.11 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp


RTSP/1.0 200 OK
Cseq: 3
Date: Sat, Oct 10 2020 21:13:43 GMT
Content-Type: application/sdp
Content-Length: 261

v=0
o=- 1602364423 1602364424 IN IP4 192.168.43.138
s=streamed by the RTSP server
t=0 0
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=control:track0
a=fmtp:96 packetization-mode=1;profile-level-id=64001F;sprop-parameter-sets=Z0IAH5WoFAFuQA==,aM48gA==


SETUP rtsp://192.168.43.138:10554/tcp/av0_0/track0 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/3.0.11 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=52724-52725


RTSP/1.0 200 OK
Cseq: 4
Date: Sat, Oct 10 2020 21:13:43 GMT
Session: 3035090777854325971
Transport: RTP/AVP;unicast;client_port=52724-52725;server_port=59752-59753


PLAY rtsp://192.168.43.138:10554/tcp/av0_0 RTSP/1.0
CSeq: 5
User-Agent: LibVLC/3.0.11 (LIVE555 Streaming Media v2016.11.28)
Session: 3035090777854325971
Range: npt=0.000-


RTSP/1.0 200 OK
Cseq: 5
Date: Sat, Oct 10 2020 21:13:43 GMT
Session: 3035090777854325971

.(.!.`.!9..|.dx'gB......n..........x..(...`."9..|.dx'h.<..71
Range: npt=0.000-

.-52725

.TSP server
t=0 0
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=control:track0
a=fmtp:96 packetization-mode=1;profile-level-id=64001F;sprop-parameter-sets=Z0IAH5WoFAFuQA==,aM48gA==

..............................................................................................................................................
...p.....w.............
Cseq: 5
Date: Sat, Oct 10 2020 21:13:43 GMT
Session: 3035090777854325971

.(.!.`.!9..|.dx'gB......n..........x..(...`."9..|.dx'h.<..71
Range: npt=0.000-

.-52725

.TSP server
t=0 0
.............................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................(...`.&9..|.dx'|.."B.KQ.y...GX}.{.............0y:..RT{.B,Ns..x...............W..4[.Q...$KBv.......,.....%_.A.*.....Oik..wn..!.....a..{.....FP..F....O.i...j..vNC.u.. .;.....D>6.....'h..i..[)7...7......`L..!Pbu.L..?Qs..M.Q....z&.
.*.....]....77x8...7.........*....N..........N...u.>*.D.O........e.>......B..<.^:......n.rQ.._.K.k..K.<...............:......|.P._.....b_k.~.e].....<
..X..'TTV...2v.....{j2j .?.FZ-DYW........f...'%...6t..Zn.h......KP.....g`m.vx....:.....*E.?...."....W...T.....|..
&...r.S.......<.B.u=9.%........ ....w`#Y.!(.q."R.g..18~1..>..x_.#...\.......Z5.".p...!..(=.Ld.i...>..........T...%:)..5..'..<._.c.=	............L....\T.x/_+P[.~c..B'.bF..qd.C.M.A.n...8j.....'..K...%P..r|....\....
~...e;...m.=w.2~C.1@p.v..3T.D.`...';W.r...;<......}

Сейчас цель получить много раз хотя-бы картинку, так как поверхностно курнув H.264 меня убило в хлам  %-)

Методы протокола:

describe — запрос описания содержимого, например, в формате SDP;
options — запрос поддерживаемых методов;
play — запрос начала вещания содержимого;
pause — запрос временной остановки вещания;
record — запрос на записывание содержимого сервером;
redirect — перенаправление на другое содержимое;
setup — запрос установки транспортного механизма для содержимого;
announce — обновление данных описания содержимого;
get_parameter — запрос указанных параметров у сервера;
set_parameter — установка параметров сервера;
teardown — остановка потока и освобождение ресурсов.

0

2

Не в курсе как из какой нибудь выделенной памяти направить поток звука вместо файла?
Поток я получу, создам буфер и наверно изучу RTS, возможно он по UDP работает.

0

3

Ev3658 написал(а):

направить поток звука вместо файла

Откуда и куда?

0

4

Пётр написал(а):

Откуда и куда?

Предполагаю я смогу получить закодированный поток видео и аудио.
Видео раскодировать точно не получится, делать свой декодер H.264 не посильная задача, но аудио поток по любому должен быть в каком нибудь PCM, типа PCMU 32kbps (AC3).
Может есть возможность как-то буфер выделенного звука пускать куда-то в систему?

0

5

Аудио и видео в одном потоке, т. е. их нужно разделить.
Звук возможно в MP3 чтобы уменьшить скорость потока.

Один из примеров воспроизведения звука - звуковой генератор.

Код:
; AudioGenerator.pb
; by BasicallyPure
; 11.22.2013
; windows only
; PB 5.20 LTS

EnableExplicit

;{ Constants
#MainWin = 0
#OutDevice_1 = 0
#PIx2 = 2 * #PI
#Mono = 1
#Stereo = 2
#ScopeBkgndColor = $276724
#LeftColor  = $27CF24
#RighttColor = $27E4D3
#SpinLostFocus = 512
#Input_Finished = #PB_EventType_FirstCustomValue

; gadgets
#BtnHop     = 0
#BtnPause   = 1
#SpinLeft   = 2
#SpinRight  = 3
#TrackLeft  = 4
#TrackRight = 5

; menus
#Menu_1 = 0
;}

;{ Procedure declarations
Declare WinCallback(hwnd, uMsg, wParam, lParam)
Declare StartSoundOutput()
Declare StopSoundOutput()
Declare MAKE_WAVE(*SBuf)
Declare Init_GUI()
Declare EventLoop()
Declare ProcessSpin(nGad,*Freq)
;}

;{ Global variables
Global SampleClock     = 44100   ; Sampling frequency in 'samples per second'
Global BlockSize       = 8192    ; Number of samples in block
Global BytesPerSample  = 2       ; Number of bytes needed for each sample, don't change this
Global Channels        = #Stereo ; Number of channels, 1 for mono, 2 for stereo.
Global nBuf            = 8       ; Number of buffers
Global DevOut          = 1       ; default audio output device
Global Frequency_Left  = 1000
Global Frequency_Right = 440
Global Volume_Left.f   = 0.25
Global Volume_Right.f  = 0.25
Global hWaveOut
Global Hop = #False
Global Pause = #False
Global NumOutDevs

Global PlayFormat.WAVEFORMATEX
Global MyOutDevs.WAVEOUTCAPS
Global Dim outHdr.WAVEHDR(nBuf)
;}

If Init_GUI()
  EventLoop()
  StopSoundOutput()
EndIf

End

Procedure Init_GUI()
  Protected n, result = 1
  
  If OpenWindow(#MainWin,0,0,350,100,"Audio generator",#PB_Window_SystemMenu |#PB_Window_ScreenCentered)
    
    ButtonGadget(#BtnHop,10,10,50,25,"Hop",#PB_Button_Toggle)
    ButtonGadget(#BtnPause,70,10,50,25,"Pause",#PB_Button_Toggle)
    SpinGadget(#SpinLeft,130,02,70,25,10,5000)
    SetGadgetState(#SpinLeft,Frequency_Left) : SetGadgetText(#SpinLeft,Str(Frequency_Left))
    SetGadgetColor(#SpinLeft,#PB_Gadget_BackColor,#LeftColor)
    SpinGadget(#SpinRight,235,02,70,25,10,5000)
    SetGadgetState(#SpinRight,Frequency_Right) : SetGadgetText(#SpinRight,Str(Frequency_Right))
    SetGadgetColor(#SpinRight,#PB_Gadget_BackColor,#RighttColor)
    TrackBarGadget(#TrackLeft,125,30,100,25,0,100) : SetGadgetState(#TrackLeft,Volume_Left * 100)
    TrackBarGadget(#TrackRight,230,30,100,25,0,100) : SetGadgetState(#TrackRight,Volume_Right * 100)
    
    CreateMenu(#Menu_1, WindowID(#MainWin))
    
    ; locate all sound output devices
    OpenSubMenu("Sound Output Devices")
    NumOutDevs = waveOutGetNumDevs_()
    If NumOutDevs <> 0
      For n = 0 To NumOutDevs - 1
        If waveOutGetDevCaps_(n,@MyOutDevs,SizeOf(WAVEOUTCAPS)) = 0
          MenuItem(n + #OutDevice_1,PeekS(@MyOutDevs\szPname))
        EndIf
      Next
      CloseSubMenu()
      SetMenuItemState(#Menu_1,#OutDevice_1,#True)
      SetWindowCallback(@WinCallback()) ; Handle Sound Output callback
      StartSoundOutput()
    Else
      MessageRequester("Error!","No audio output device found.")
      result = 0
    EndIf
  Else
    result = 0
  EndIf
  
  ProcedureReturn result
EndProcedure

Procedure EventLoop()
  Protected menuSelection, ActiveGadget, n, Quit = #False
  
  Repeat
    Select WaitWindowEvent()
      Case #PB_Event_CloseWindow
        Quit = #True
      Case #PB_Event_Gadget
        Select EventGadget()
          Case #BtnHop
            Hop = GetGadgetState(#BtnHop)
            Frequency_Left = GetGadgetState(#SpinLeft)
            Frequency_Right = GetGadgetState(#SpinRight)
          Case #BtnPause
            Pause = GetGadgetState(#BtnPause)
            If Pause
              waveOutPause_(hWaveOut)
            Else
              waveOutRestart_(hWaveOut)
            EndIf
          Case #SpinLeft
            ProcessSpin(#SpinLeft, @Frequency_Left)
          Case #SpinRight
            ProcessSpin(#SpinRight, @Frequency_Right)
          Case #TrackLeft
            Volume_Left = GetGadgetState(#TrackLeft) / 100
          Case #TrackRight
            Volume_Right = GetGadgetState(#TrackRight) / 100
        EndSelect
      Case #PB_Event_Menu
        menuSelection = EventMenu()
        If GetMenuItemState(#Menu_1,menuSelection) = #False
          Select menuSelection
            Case #OutDevice_1 To #OutDevice_1 + NumOutDevs - 1 ; Output device selection
              For n = #OutDevice_1 To #OutDevice_1 + NumOutDevs - 1
                If n = menuSelection
                  SetMenuItemState(#Menu_1,menuSelection,#True)
                Else
                  SetMenuItemState(#Menu_1,n,#False)
                EndIf
              Next
              DevOut = menuSelection - #OutDevice_1 + 1
              StopSoundOutput()
              StartSoundOutput()
          EndSelect
        EndIf
      Case #WM_KEYUP
        ActiveGadget = GetActiveGadget()
        Select ActiveGadget
          Case #SpinLeft To #SpinRight
            If EventwParam() = #VK_RETURN
              PostEvent(#PB_Event_Gadget,#MainWin,ActiveGadget,#Input_Finished)
            EndIf
        EndSelect
    EndSelect
  Until Quit = #True
  
EndProcedure

Procedure WinCallback(hwnd, uMsg, wParam, lParam)
  ; Window callback to service sound output message
  Static *hWaveO.WAVEHDR
  
  Select uMsg
    Case #MM_WOM_DONE           ; Sound output, a play buffer has been returned.
      *hWaveO.WAVEHDR = lParam  ; lParam has the address of WAVEHDR
      MAKE_WAVE(*hWaveO\lpData) ; send pointer where to write NEW data
      *hWaveO\dwBytesRecorded = BlockSize             ; Number of bytes written into buffer
      waveOutWrite_(hWaveOut,lParam, SizeOf(WAVEHDR)) ; Send to sound device => jack socket => cable =>
  EndSelect
  
  ProcedureReturn #PB_ProcessPureBasicEvents
EndProcedure

Procedure StartSoundOutput()
  Protected T,i, *P
  Static *OutBufMem
  
  With PlayFormat
    \wFormatTag      = #WAVE_FORMAT_PCM
    \nChannels       = Channels
    \wBitsPerSample  = BytesPerSample * 8
    \nSamplesPerSec  = SampleClock
    \nBlockAlign     = Channels * BytesPerSample
    \nAvgBytesPerSec = \nSamplesPerSec * \nBlockAlign
  EndWith
  
  If *OutBufMem : FreeMemory(*OutBufMem) : EndIf   ; Free a prior assignement
  *OutBufMem = AllocateMemory(BlockSize * nBuf)    ; Reserve memory for all the buffers
  
  T =  waveOutOpen_(@hWaveOut, #WAVE_MAPPER+DevOut, @PlayFormat, WindowID(#MainWin), #True, #CALLBACK_WINDOW | #WAVE_FORMAT_DIRECT)
  If T = #MMSYSERR_NOERROR
    
    *P = *OutBufMem                               ; Pointer to start of memory
    For i = 0 To nBuf-1                           ; For each buffer
      outHdr(i)\lpData         = *P               ; start of buffer
      outHdr(i)\dwBufferLength = BlockSize        ; size of buffer
      outHdr(i)\dwFlags        = 0
      outHdr(i)\dwLoops        = 0
      T | waveOutPrepareHeader_(hWaveOut, outHdr(i), SizeOf(WAVEHDR))
      *P + BlockSize
    Next
    
    For i = 0 To nBuf-1
      PostMessage_(WindowID(#MainWin),#MM_WOM_DONE,0,outHdr(i))
    Next 
    
  EndIf
  
  If T = #MMSYSERR_NOERROR : ProcedureReturn 1 : Else : ProcedureReturn 0 : EndIf
  
EndProcedure

Procedure StopSoundOutput()
  Protected i
  waveOutReset_(hWaveOut)
  For i = 0 To nBuf - 1
    waveOutUnprepareHeader_(hWaveOut, outHdr(i), SizeOf(WAVEHDR))
  Next
  waveOutClose_(hWaveOut)
EndProcedure

Procedure MAKE_WAVE(*SBuf)
  ; This routine generates Left and Right waveforms.
  
  Static.d Angle, Kl, Kr, La, Ra
  Static.i sample
  Static.l Vl, Vr
  
  If Hop
    Frequency_Left = Random(1220,220)
    Frequency_Right = Random(1220,220)
  EndIf
  
  ; Calculate the frequency scaling factors
  Kl = #PIx2 * Frequency_Left  / SampleClock
  Kr = #PIx2 * Frequency_Right / SampleClock
  
  sample = 1
  Repeat ; Generate waveform data
         ; Left sample
    Vl = Sin(La) * 32767 * Volume_Left
    La + Kl                            ; calculate angle for next time
    If La > #PIx2 : La - #PIx2 : EndIf ; limit to 2*PI radians
    PokeW(*SBuf,Vl)                    ; Put point in buffer
    *SBuf + BytesPerSample             ; move buffer pointer to next sample
    
    ; Right sample
    Vr = Sin(Ra) * 32767 * Volume_Right
    Ra + Kr
    If Ra > #PIx2 : Ra - #PIx2 : EndIf
    PokeW(*SBuf,Vr)
    *SBuf + BytesPerSample
    
    sample + PlayFormat\nBlockAlign
  Until sample > BlockSize
  
EndProcedure

Procedure ProcessSpin(nGad,*Freq)
  Select EventType()
    Case #PB_EventType_Up, #PB_EventType_Down
      SetGadgetText(nGad, Str(GetGadgetState(nGad)))
      PokeI(*Freq, GetGadgetState(nGad))
    Case #Input_Finished, #SpinLostFocus
      SetGadgetState(nGad,Val(GetGadgetText(nGad)))
      SetGadgetText(nGad, Str(GetGadgetState(nGad)))
      PokeI(*Freq, GetGadgetState(nGad))
  EndSelect
EndProcedure

0

6

Эх... всё-же решился добить эту тему до конца.

Наконец-то на просторах интернет стала появляться информация. Но к сожалению RTSP настолько сильно шаманский, что его невозможно стандартизировать под каждую IP камеру и видео регистратор.
Описание OnView протокола, который вроде как создан для стандартизации RTSP протокола пока нет и мало понятно, да и в целом представьте сколько труда у автора ушло чтооб хоть как-то создать описание неописуемого: https://efim360.ru/rfc-7826-potokovyj-p … ersiya-2-0

Вот, если кому потребуется, простой шаман код для китайского 4х канального видео регистратора:

Код:
EnableExplicit
Global RTSP.l
Global s_event
Global s.s
Global port.c
Global *buff
Global ClientID.l
Global quit.b
Global tx.b
Port = 6832
*Buff = AllocateMemory(65535)

If InitNetwork()
 RTSP=OpenNetworkConnection("192.168.0.10", 554,#PB_Network_TCP, 5000) 
 Debug "Отправлено========================================"
 
 Restore start_rtsp_0
 
 While s<>"ENDSEND"
   Read.s s   
   
   If s="ENDSEND"
     ;SendNetworkString(RTSP, #CRLF$,#PB_UTF8)
     Break
   Else
   
   SendNetworkString(RTSP, s+#CRLF$+#CRLF$,#PB_UTF8)
   Debug s
   EndIf
   
   
 Wend
 
 


 Repeat
      
    S_Event = NetworkClientEvent(RTSP)

    If S_Event 
      ClientID = EventClient()
      Debug "Ответ:=============================================="
      Select S_Event
        Case #PB_NetworkEvent_Connect
          
  
        Case #PB_NetworkEvent_Data
          
          ReceiveNetworkData(RTSP, *buff, 65535)
          Debug PeekS(*Buff, -1, #PB_UTF8)
          
           
            Select TX
              Case 0
                tx=1
                ;Delay(100)
                Restore start_rtsp_1
                s=""
                 Debug "Отправлено========================================"
                 
                 While s<>"ENDSEND"
                   Read.s s   
                   
                   If s="ENDSEND"
                     ;SendNetworkString(RTSP, #CRLF$,#PB_UTF8)
                     Break
                   Else
                     SendNetworkString(RTSP, s+#CRLF$+#CRLF$,#PB_UTF8)  
                     Debug s
                   EndIf
                 Wend
                 
                 
             EndSelect
             
   

 
        Case #PB_NetworkEvent_Disconnect
          MessageRequester("PureBasic - Server", "Client "+Str(ClientID)+" has closed the connection...", 0)
          Quit = 1
      EndSelect
  
    EndIf
  Until Quit = 1
  CloseNetworkConnection(RTSP)  
EndIf


DataSection
  ;Запрос поиска RTSP устройства
  start_rtsp_0:
  Data.s "OPTIONS rtsp://192.168.0.10:554/user=admin&password=3658&channel=1&stream=0.sdp RTSP/1.0"
  Data.s "CSeq: 2"
  Data.s "User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)"
  Data.s "ENDSEND"
  ;
  start_rtsp_1:
  Data.s "DESCRIBE rtsp://192.168.0.10:554/user=admin&password=3658&channel=1&stream=0.sdp RTSP/1.0"
  Data.s "CSeq: 3"
  Data.s "User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)"
  Data.s "Accept: application/sdp"
  Data.s "ENDSEND"
EndDataSection

А это листинг VLC плеера при организации связи (связь потока по другим портам):

RTSP/1.0 200 OK
Server: H264DVR 1.0
Cseq: 2
Public: OPTIONS, DESCRIBE, SETUP, TEARDOWN, GET_PARAMETER, SET_PARAMETER, PLAY, PAUSE

DESCRIBE rtsp://192.168.0.10:554/user=admin&password=3658&channel=1&stream=0.sdp RTSP/1.0
CSeq: 3
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Accept: application/sdp

RTSP/1.0 200 OK
Content-Type: application/sdp
Server: H264DVR 1.0
Cseq: 3
Content-Base: rtsp://192.168.0.10:554/user=admin&password=3658&channel=1&stream=0.sdp
Cache-Control: private
x-Accept-Retransmit: our-retransmit
x-Accept-Dynamic-Rate: 1
Content-Length: 380   (Это кол-во байт в следующих данных)

v=0
o=- 38990265062388 38990265062388 IN IP4 192.168.0.10
s=RTSP Session
c=IN IP4 192.168.0.10
t=0 0
a=control:*
a=range:npt=0-
m=video 0 RTP/AVP 96
a=rtpmap:96 H264/90000
a=range:npt=0-
a=framerate:0S
a=fmtp:96 profile-level-id=640020; packetization-mode=1; sprop-parameter-sets=Z2QAIK2EAQwgCGEAQwgCGEAQwgCEK1B2BE/KgA==,aO48sA==
a=framerate:25
a=control:trackID=3

SETUP rtsp://192.168.0.10:554/user=admin&password=3658&channel=1&stream=0.sdp/trackID=3 RTSP/1.0
CSeq: 4
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Transport: RTP/AVP;unicast;client_port=50322-50323

RTSP/1.0 200 OK
Server: H264DVR 1.0
Cseq: 4
Session: 18710430;timeout=60
Transport: RTP/AVP;unicast;mode=PLAY;source=192.168.0.10;client_port=50322-50323;server_port=40000-40001;ssrc=0
Cache-Control: private
x-Dynamic-Rate: 1

PLAY rtsp://192.168.0.10:554/user=admin&password=3658&channel=1&stream=0.sdp RTSP/1.0
CSeq: 5
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Session: 18710430
Range: npt=0.000-

RTSP/1.0 200 OK
Server: H264DVR 1.0
Cseq: 5
Range: npt=now-
Session: 18710430

TEARDOWN rtsp://192.168.0.10:554/user=admin&password=3658&channel=1&stream=0.sdp RTSP/1.0
CSeq: 6
User-Agent: LibVLC/3.0.16 (LIVE555 Streaming Media v2016.11.28)
Session: 18710430

Отредактировано Ev3658 (07.07.2022 16:04:10)

0

7

Основная цель передать видео по сети и воспроизвести его?
Не проще в приложение встроить плеер VLC и пусть он выполняет обмен по сети и воспроизводит видео, а приложение будет только управлять им?
Или сделать на DirectShow. В Codec Pack есть поддержка RTSP, а значит должно работать.

0

8

Пётр написал(а):

Основная цель

Получить mjpeg кадр и обработать в самопальной нейросети.
Вообще хоть что-то получить для обработки)))

0

9

Из видео можно вытаскивать кадры в виде фотографий, которые анализировать.

0

10

IP камеры и регистраторы по мимо видео потока вроде как поддерживают кадры.
Протокол RTSP вполне понятен и если реализовать его без внешних технологий, получится интересная технология.

0

11

https://forumupload.ru/uploads/0009/ae/28/591/t777296.jpg

Очень интересный ресурс, показан синтаксис протокола RTPS: https://russianblogs.com/article/6987400199/

0

12

Изучение протокола RTPS подразумевает также изучение иероглифов? :D  :dontknow:

0

13

Если прищуриться будет понятен синтаксис протокола  :blush:
https://forumupload.ru/uploads/0009/ae/28/591/t880548.jpg

0

14

Нашел информацию о буквах и параметров из describe: https://ru.m.wikipedia.org/wiki/Session … n_Protocol

v= (версия протокола, в данный момент версия всегда 0)
o= (идентификаторы создателя/владельца и сессии).
s= (имя сессии, не может быть пустым)
i=* (информация о сессии)
u=* (URI - адрес, используемый WWW-клиентами, с дополнительной информацией о сессии)
e=* (E-mail адрес лица, ответственного за конференцию)
p=* (номер телефона лица, ответственного за конференцию)
c=* (информация для соединения - не требуется, если есть в описании всех медиаданных)
b=* (информация о занимаемой полосе пропускания канала связи)
Одна и более строк с описанием параметров времени (Смотри ниже)
z=* (установка для временной зоны)
k=* (ключ шифрования)
a=* (одна или несколько строк с описанием атрибутов сессии, см. ниже)

Отредактировано Ev3658 (13.07.2022 10:34:11)

0


Вы здесь » PureBasic - форум » PureBasic для Windows » RTSP PureBasic