語音獲取
要想傳送語音資訊,首先得獲取語音,這裡有幾種方法,一種是使用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...