PDA

View Full Version : Ai biết dùng công nghệ VOIP áp dụng vào VB



Mic
17-09-2002, 08:43
Mình cần làm 1 chương trình vioce chat bằng VB nhưng vẫn chưa nghĩ ra giải pháp.
Mình đã làm thành công chat thường bằng Winsock của VB.
Có ai biết đọc file nhị phân ko ? V/d đọc 1 file ảnh dưới dạng code bằng VB á !:)

vuminhphan
17-09-2002, 13:15
Bài viết được gửi bởi Mic
Mình cần làm 1 chương trình vioce chat bằng VB nhưng vẫn chưa nghĩ ra giải pháp.
Mình đã làm thành công chat thường bằng Winsock của VB.

Vậy câu hỏi của bạn là gì????


Có ai biết đọc file nhị phân ko ? V/d đọc 1 file ảnh dưới dạng code bằng VB á !:)

có.....nhiều người lém :-D

Mic
17-09-2002, 16:09
Thứ 1 mình hỏi cách nào để làm voice chat bằng VB
thứ 2 mình hỏi làm sao để đọc 1 pic hay 1 file bất kì. Cắt và ghép nó.

JackPhan
17-09-2002, 17:45
cậu làm được chương trình chat thường qua Internet rồi à, cho tớ xem thử với. được không?

vth_bk
17-09-2002, 21:15
tôi có code của chương trình đọc file nhị phân và chương trình đọc file gif... Tôi sẽ đưa lên diễn đàn vào lần sau, nếu bạn cần gấp hãy mail cho tôi để lấy trước...

vth_bk
17-09-2002, 21:20
tôi cũng có sourcecode của nhiều chương trình chat bằng winsock, nhưng hiện đang tìm hiểu về MAPI, bạn nào có tài liệu chỉ giúp với

Mic
18-09-2002, 02:31
Private Sub txtSend_KeyPress(KeyAscii As Integer)
If txtSend.Text = "/cls" Then
txtChat.Text = "Screen Cleared"
txtSend.Text = ""
Exit Sub
End If
If KeyAscii = vbKeyReturn Then
Send "@ADMIN: " & txtSend.Text
AddText "@ADMIN: " & txtSend.Text
txtSend.Text = ""
End If
End Sub

Private Sub Winsock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
TotalC = TotalC + 1
Load Winsock1(TotalC)
Winsock1(TotalC).Accept requestID
DoEvents
Winsock1(TotalC).SendData txtWelcome.Text
End Sub

Private Sub Winsock1_DataArrival(Index As Integer, ByVal bytesTotal As Long)
On Error Resume Next
Winsock1(Index).GetData Data
Data1$ = Data
LData = Len(Data)
D$ = Mid(Data$, 1, 2)
TheRest$ = Mid$(Data1$, 4, LData - 3)
If Data1$ = "REQUESTUSERS" Then
SendNames (Index)
Exit Sub
ElseIf InStr(1, Data1$, "/@", vbTextCompare) > 0 Then
AddText "PRIVATE - " & Data$
Exit Sub
End If
Select Case Mid(Data$, 1, 2)
Case "/a"
List1.AddItem TheRest$ 'hj
Case ""
Case Else
AddText Data1$
Send Data1$
End Select
'AddText Data1$
End Sub

Sub Send(Send As String)
On Error Resume Next
For i = 1 To TotalC
Winsock1(i).SendData Send
DoEvents
Next i
End Sub

Sub SendNames(Index As Integer)
On Error Resume Next
Winsock1(Index).SendData "/GR"
DoEvents
List1.ListIndex = 0
For i = 1 To List1.ListCount
Winsock1(Index).SendData "/AC " & List1.Text
List1.ListIndex = List1.ListIndex + 1
DoEvents
Next i
End Sub

Private Sub Command1_Click()
On Error Resume Next
TOSEND$ = KSB$ & Name1$
If List1.ListIndex <> -1 Then
For i = 1 To frmMain.Winsock1.Count + 1
If frmMain.Winsock1(i).State = 7 Then
frmMain.Winsock1(i).SendData KSB$ & Name1$
End If
Next i
frmMain.txtChat.Text = frmMain.txtChat.Text & vbNewLine & KSB$ & Name1$
End If
Unload Me
End Sub

Private Sub Command2_Click()
Unload Me
End Sub

Private Sub Form_Load()
On Error Resume Next
frmMain.List1.ListIndex = 0
For i = 1 To frmMain.List1.ListCount
List1.AddItem frmMain.List1.Text
frmMain.List1.ListIndex = frmMain.List1.ListIndex + 1
Next i
End Sub

Private Sub List1_Click()
Name1$ = List1.Text
End Sub

Private Sub List1_GotFocus()
Name1$ = List1.Text
End Sub

Private Sub Option1_Click(Index As Integer)
Command1.Caption = Option1(Index).Caption
If Option1(0).Value = True Then
KSB$ = "/SI "
ElseIf Option1(1).Value = True Then
KSB$ = "/KI "
ElseIf Option1(2).Value = True Then
KSB$ = "/BN "
End If
End Sub

Private Sub Option1_GotFocus(Index As Integer)
Command1.Caption = Option1(Index).Caption
If Option1(0).Value = True Then
KSB$ = "/SI "
ElseIf Option1(1).Value = True Then
KSB$ = "/KI "
ElseIf Option1(2).Value = True Then
KSB$ = "/BN "
End If
End Sub

Sub AddText(Text As String)
frmMain.txtChat.Text = frmMain.txtChat.Text & vbNewLine & Text
End Sub

--------------------------------------------------------------------
Đoạn code của file server ne`

quaitieutu
18-09-2002, 13:32
thanks

vuminhphan
19-09-2002, 07:08
Bài viết được gửi bởi Mic
Thứ 1 mình hỏi cách nào để làm voice chat bằng VB
thứ 2 mình hỏi làm sao để đọc 1 pic hay 1 file bất kì. Cắt và ghép nó.

1> Mình biết làm voice chát, nhưng không phải là voice của mình, mà là voice của system vậy có được không hả bạn? còn dùng VOIP thì.........thua :-D

2> Để đọc hoặc sử lí file bất kì, bạn dùng các hàm về binary như: lenB, AscB, ChrB, InstrB, MidB (nếu bạn đọc file từ system) hoặc dùng các method như append... để xử lí nó theo ý mình muốn á. (Trên lý thuết là vậy). Nhưng trên thực tế thì còn phụ thuộc bạn.

Sau đây là ví dụ đọc 1 file wave rồi vẽ spectrum của nó trên picture box.

'-----------------------------------------------------------------------
Option Explicit

Private Sub Command1_Click()
Dim FileNumber As Integer
Dim I As Single
Dim Min As Single
Dim Max As Single
Dim Temp As Integer
Dim XZoomrate As Single
Dim YZoomrate As Single
Dim LastX As Single
Dim LastY As Single
On Error GoTo ErrorHandler
' Enable Cancel error


With Picture1
CommonDialog1.CancelError = True
CommonDialog1.Filter = "Wave files (*.wav)|*.wav"
CommonDialog1.ShowOpen

' Change the caption of the form
Me.Caption = CommonDialog1.FileName

I = 44 ' Set I To 44, since the wave sample is begin at Byte 44.
' Open file to get the length of the wav
'
' get free file number
FileNumber = FreeFile
Open CommonDialog1.FileName For Random As #FileNumber

Do
Get #FileNumber, I, Temp
I = I + 1
' Get the smallest and largest number.
' then from this value -> adjust the
' vertical bars of the file
If Temp < Min Then Min = Temp
If Temp > Max Then Max = Temp
Loop Until EOF(FileNumber)
Close #FileNumber
' Adjust values and reset values
XZoomrate = (.Width / I)
YZoomrate = (Max - Min) / (.Height / 2)
.CurrentX = 100
.CurrentY = .Height / 2
LastX = 100
LastY = .Height / 2
.AutoRedraw = True
I = 44
' Reopen file using a different FileNumber

FileNumber = FileNumber + 1
.Cls
Open CommonDialog1.FileName For Random As #FileNumber


Do
Get #FileNumber, I, Temp
' Set CurrentX and CurrentY
.CurrentX = .CurrentX + XZoomrate
.CurrentY = (Temp / YZoomrate) + .Height / 2
' Plot graph
Picture1.Line (LastX, LastY)-(.CurrentX, .CurrentY), vbBlack
' Reset values
LastX = .CurrentX
LastY = .CurrentY
I = I + 1
If .CurrentX > .Width Then Exit Do
Loop Until EOF(FileNumber)
Close #FileNumber
End With

ErrorHandler:
' Do nothing
End Sub


Private Sub Form_Resize()
On Error Resume Next
' Resize control
With Picture1
.BackColor = vbWhite
.ForeColor = vbBlack
.Move 50, 500, Width - 200, Height - 800
End With
End Sub

'-----------------------------------------------------------------------

Còn dưới đây là 1 file sample dùng để vẽ map, save map và load map. Đây là 1 ví dụ rất hay về binary file (not my work :-)).

Mic
21-09-2002, 17:31
Cha, cái này được á.
Mình làm chương trình chat nhưng chưa áp dụng gửi Attach file được. Nếu xử lí binary rùi cắt ra thành từng đoạn nhỏ send dạng text rồi sau đó ghép lại. Ý kiến này được không ? Ai có ý kiến khác cho nghen :)

buaxua123
24-11-2003, 12:39
Bạn có thể nói rỏ hơn được không, biết đây cái này tui biết

LMTruong
24-11-2003, 13:09
Đoạn code trên cu~ng được á. Nhưng ma` có thử chạy nó trên Internet chưa. Hay chỉ chạy trên Lan thui. Theo mình nhận xét thì đoạn code này sẽ không chạy trên Internet được. Cho dù bạn có IP Wan thì cũng chỉ có thể chát một chiều thôi, có nghĩa là chỉ có Server nhận được Message của Client chứ Client không thể nào nhận được Message của Server. Và cho dù có chat được đi nữa thì nó cu~ng là một cơ chế đồng bộ. Vì Winsock trên VB là winSock đồng bộ. Vì vậy Client và Server không thể gửi Message cùng một lúc được mà phải có sự phản hồi.

ITbaby
24-11-2003, 13:32
Anh nói rõ thêm về cái vụ này đi anh LMtruong. Vụ gì mà đồng bộ với không đồng bộ. Mong Reply

LMTruong
25-11-2003, 13:07
Ca`i MSDN va`o, chay le^n, va`o tab Index, go~ Winsock, ra wa' cho`i. Do.c go`i se~ hie^~u. :D

ITbaby
25-11-2003, 13:24
Cám on anh nhiều nhiều

dtt_vn
26-11-2003, 08:00
Có gì đâu mà đồng bộ với không đồng bộ?? Mình không hiểu? Khi đã connect vào nhau thì Server và Client đều nhận được IP của nhau, muốn gửi dữ liệu thì send, chứ sự kiện Nhận được Data của WS dùng để làm gì??? Nhưn gkhông thể làm được một trình chat trên INternet như YM hiệu quả được, bởi vì nếu làm thế, bạn cần có một server riêng quản lý IP của cả hai. Nếu làm như YM thì chẳng có anh nào là server cả, hai người chat đều là client, còn Yahoo! là server. Em nói vậy có đúng không?
Nếu bạn muốn làm một ct VOIP thì có lẽ bạn cần tìm hiểu cấu trúc ký âm trên máy trước, làm sao để nhận âm thanh từ mic, tìm hiểu giải thuật để lưu trữ chúng (dĩ nhiên là gọn, nhẹ), làm sao nén chúng lại, rồi làm sao để ct mình muốn gửi đến hiểu là mình muốn gửi voice hay là text... Nếu muốn dễ hơn thì bạn hãy sử dụng trình SAPI4 của M$ để phát âm được (OCX), lúc đó thì chỉ cần gửi text. Nhưng lưu ý là chỉ có thể phát được một số ngôn ngữ có sẵn như E,C,.. chắc đợi đến năm 2000000 mới có tiếng việt

Nói chung, để truyền tải tối ưu trên Net, tốt nhất là ZIP chúng lại, thí dụ từ 10KB(s) => 2-3KB(s) thì thời gian chúng sẽ giảm nhanh chóng. Giải thuật Zip có rất nhiều.

LMTruong
26-11-2003, 13:03
Cái đó thì chưa chắc đâu.Tại vì mấy you chưa thử trên IP Wan nên mới tưởng là vậy. Chứ thử gùi sẽ biết. Lúc trước mình cũng nghĩ như vậy á. Còn chuyện đồng bộ có nghĩa là 2 bên không thể send Message cùng một lúc được. Phải đợi bên này send xong bên kia mới send được. :D