PureBasic - форум

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

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


Вы здесь » PureBasic - форум » Программирование на PureBasic » RTSP PureBasic


RTSP PureBasic

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

1

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

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

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

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

https://forumfiles.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


Вы здесь » PureBasic - форум » Программирование на PureBasic » RTSP PureBasic