C 基於UDP實現的P2P語音聊天工具

2022-09-26 07:12:08 字數 3024 閱讀 7738

語音獲取

要想傳送語音資訊,首先得獲取語音,這裡有幾種方法,一種是使用directx的directxsound來錄音,我為了簡便使用乙個開源的外掛程式naudio來實現語音錄取。 在專案中引用naudio.dll

//------------------錄音相關-----------------------------

private iw**ein w**ein;

private w**efilewriter writer;

private void loadwasapidevicescombo()

private void createw**eindevice()

void ondata**ailable(object sender, w**eineventargs e)

else

else

} }

void onrecordingstopped(object sender, stoppedeventargs e)

else

} void stoprecord()

private void cleanup()

finalizew**efile();

} private void finalizew**efile()

} //開始錄音

private void btn_luyin_click(object sender, eventargs e)

if (file.exists(soundfile))

writer = new w**efilewriter(soundfile, w**ein.w**eformat);

w**ein.startrecording();

} 上面的**實現了錄音,並且寫入檔案p2psound_a.w**

語音傳送

獲取到語音後我們要把語音傳送出去

當我們錄好音後點選傳送,這部分相關**是

msgtranslator tran = null;

ublic form1()

private void btn_sendsound_click(object sender, eventargs e)

if (t_port.text == "")

string ip = t_ip.text;

int port = int.parse(t_port.text);

string nick = t_nick.text;

string msg = "語音頻息";

ipendpoint remote = new ipendpoint(ipaddress.parse(ip), port);

msg m = new msg(remote, "zz", nick, commands.sendmsg, msg, "come from a");

m.isrequirereceive = true;

m.extendmessagebytes = filecontent(soundfile);

m.packageno = msg.getrandomnumber();

m.type = consts.message_binary;

tran.send(m);

} private byte filecontent(string filename)

catch (exception ex)

finally

} }

如此一來我們就把產生的語音檔案傳送出去了

語音的接收與**

其實語音的接收和文字訊息的接收沒有什麼不同,只不過語音傳送的時候是以二進位制傳送的,因此我們在收到語音後 就應該寫入到乙個檔案裡面去,接收完成後,**這段語音就行了。

下面這段**主要是把收到的資料儲存到檔案中去,這個函式式我的netframe裡收到訊息時所觸發的事件,在文章前面提過的那篇文章裡

void tran_messagereceived(object sender, messageeventargs e)

filestream fs = new filestream(recive_soundfile, filemode.create, fileaccess.write);

fs.write(msg.extendmessagebytes, 0, msg.extendmessagebytes.length);

fs.close();

//play_sound(recive_soundfile);

changebtn(true);

} else

}收到語音頻息後,我們要進行**,**時仍然用剛才那個外掛程式**

//--------**部分----------

private iw**eplayer w**eplayer;

private w**estream reader;

public void play_sound(string filename)

if (reader != null)

reader = new mediafoundationreader(filename, new mediafoundationreader.mediafoundationreadersettings() );

if (w**eplayer == null

w**eplayer.play();

} private void w**eplayeronplaybackstopped(object sender, stoppedeventargs stoppedeventargs)

if (w**eplayer != null)

btn_程式設計客棧luyin.enabled = true;

}private void btn_play_click(object sender, eventargs e)

在上面演示了接收和傳送一段語音頻息的介面

技術總結

主要用到的技術就是udp和naudio的錄音和**功能

本文標題: c#基於udp實現的p2p語音聊天工具

本文位址:

基於pjsip實現p2p語音對講

config file 大家先大致瀏覽上面的pjsua文件說明,對整個pjsua的選項有個了解。然後我們關注到最後的config file。this is a comment in the config file.id sip alice example.com registrar sip exam...

基於UDP的P2P聊天工具 0 1

簡介 1 這是乙個windows的p2p聊天工具 2 它支援區域網內1對1傳送文字訊息 3 它的介面是dos控制台介面 1 入門級udp套接字程式設計 2 udp的connect函式 3 入門級windows多執行緒 一 入門級udp套接字程式設計 m sockfd socket pf inet,s...

P2P之UDP穿透的簡單實現方式

full cone nat 內網主機建立乙個udpsocket localip localport 第一次使用這個socket給外部主機傳送資料時nat會給其分配乙個公網 publicip publicport 以後用這個socket向外面任何主機傳送資料都將使用這對 publicip public...