PDA

View Full Version : Using LibRTMP in VB or C# application


Elgero
02-14-2012, 08:12 AM
Hello, I'm trying to use LibRTMP in my VB application, but I can't get it to work. No matter what rtmp stream I use, it always fails to connect (RTMP_Connect). Using RTMPDump with the same rtmp stream works fine.

Does anybody have any idea what's wrong?

In the immediate window I always get either this message:

Parsing...
Parsed protocol: 0
Parsed host : rtmp.website.com
Parsed app : play
Problem accessing the DNS. (addr: rtmp.website.com)
or this message:

Parsing...
Parsed protocol: 0
Parsed host : rtmp.website.com
Parsed app : play
RTMP_Connect0, failed to create socket. Error: 10093

This is my form code.

Imports System.Runtime.InteropServices
Imports System.IO

Public Class Form1

Private m_LogCallback As New LibRTMP.LogCallback(AddressOf LogCallback)

Private Sub LogCallback(ByVal level As LibRTMP.LogLevel, ByVal message As String)
Debug.Print(message)
End Sub

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim b(1023) As Byte
Dim bytes_read As Integer
Dim r As IntPtr

LibRTMP.RTMP_LogSetLevel(LibRTMP.LogLevel.ALL)
LibRTMP.SetLogCallback(m_LogCallback)

r = LibRTMP.RTMP_Alloc

If r = IntPtr.Zero Then
MessageBox.Show("failed rtmp_alloc")
Return
End If

LibRTMP.RTMP_Init(r)

LibRTMP.RTMP_SetupURL(r, Marshal.StringToHGlobalAnsi("rtmp://whatever-stream.com"))

'// Always fails to connect here
If LibRTMP.RTMP_Connect(r, IntPtr.Zero) = 0 Then
MessageBox.Show("failed to establish RTMP connection")
Return
End If

If LibRTMP.RTMP_ConnectStream(r, 0) = 0 Then
MessageBox.Show("failed to establish RTMP session")
Return
End If

Using FS As New FileStream("C:\teststream.flv", FileMode.Create, FileAccess.Write)
Do
bytes_read = LibRTMP.RTMP_Read(r, b, b.Length)
If (bytes_read = 0) Then Exit Do
FS.Write(b, 0, bytes_read)
Loop
End Using

LibRTMP.RTMP_Close(r)
LibRTMP.RTMP_Free(r)
End Sub
End Class

This is my LibRTMP class.

Imports System.Runtime.InteropServices

Public Class LibRTMP

Public Enum LogLevel
CRIT = 0
[ERROR]
WARNING
INFO
DEBUG
DEBUG2
ALL
End Enum

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function RTMP_LibVersion() As Integer
End Function

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function RTMP_Alloc() As IntPtr
End Function

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Sub RTMP_Free(ByVal rtmp As IntPtr)
End Sub

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Sub RTMP_Init(ByVal rtmp As IntPtr)
End Sub

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Sub RTMP_Close(ByVal rtmp As IntPtr)
End Sub

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Sub RTMP_EnableWrite(ByVal rtmp As IntPtr)
End Sub

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function RTMP_SetupURL(ByVal rtmp As IntPtr, ByVal url As IntPtr) As Integer
End Function
'Intptr, because memory must remain valid so use StringToHGlobalAnsi

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Sub RTMP_LogSetLevel(ByVal lvl As Integer)
End Sub

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function RTMP_Connect(ByVal rtmp As IntPtr, ByVal cp As IntPtr) As Integer
End Function

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function RTMP_ConnectStream(ByVal rtmp As IntPtr, ByVal seekTime As Integer) As Integer
End Function

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function RTMP_Read(ByVal rtmp As IntPtr, ByVal buffer() As Byte, ByVal size As Integer) As Integer
End Function

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function RTMP_Pause(ByVal rtmp As IntPtr, ByVal DoPause As Integer) As Integer
End Function

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function RTMP_IsConnected(ByVal rtmp As IntPtr) As Boolean
End Function

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function RTMP_IsTimedout(ByVal rtmp As IntPtr) As Boolean
End Function

<DllImport("librtmp.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function RTMP_HashSWF(ByVal url As String, <System.Runtime.InteropServices.Out()> ByRef size As Integer, ByVal hash() As Byte, ByVal age As Integer) As Boolean
End Function

<DllImport("logstub.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Function InitSockets() As Integer
End Function

<DllImport("logstub.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Sub CleanupSockets()
End Sub

<DllImport("logstub.dll", CallingConvention:=CallingConvention.Cdecl)>
Public Shared Sub SetLogCallback(ByVal cb As LogCallback)
End Sub

Public Delegate Sub LogCallback(ByVal level As LogLevel, ByVal message As String)
End Class

KSV
02-14-2012, 10:28 AM
you need to initialize winsock before calling RTMP_Connect. first error is due to invalid rtmp url and second error is due to non initialized winsock.

Elgero
02-14-2012, 11:45 AM
Thank you very much. It works fine now.

Student
04-28-2012, 06:34 AM
Thank you very much. It works fine now.

Hi,

I´m trying to get this done too (in VB 6.0) and am right now not so good at it.
Would it be possible to get your Code (or a HowTo)?

Would be great if you could help me.
Thank you very much in advance.

Student

evol
04-29-2012, 04:45 AM
Hi,

I´m trying to get this done too (in VB 6.0) and am right now not so good at it.
Would it be possible to get your Code (or a HowTo)?

Would be great if you could help me.
Thank you very much in advance.

Student

The code wont work on VB 6.0 his using VB.NET. ;)

Get a copy its free VISUAL BASIC 2010 EXPRESS (http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-basic-express)

lorus
06-16-2013, 05:02 AM
Hi Elgero,

can you please post the code that was finally working for you?


cheerz lorus