C#怎样实现语音聊天视频功能(要具体代码)

C#怎样实现语音聊天视频功能(要具体代码),第1张

给你一个winform 的例子,对你可能有用!

涉及技术

动态调用Com对象(全反射、没有引用com ocx)

取得系统存在的各种语言引擎

使用引擎进行朗读

使用引擎进行保存声音

程序图列:

主要功能描述

实列变量等,构造函授等

取得所有的 识别对象模块集合,放入下拉框

代码

object _spVoiceCls =

null //保存朗读用的 SAPI.SpVoice

const

int SpFlags =

1//SpeechVoiceSpeakFlags.SVSFlagsAsyn

object _oISpeechObjectTokens =

null//保存 SAPI.ISpeechObjectTokens 就是系统有团档伏的语音引擎集合

int TokensCount =

0// 语音引擎集合 数

DictionaryEntry[] _deTokens=null//榜定下拉框用的

public MainForm()

{

InitializeComponent()

this.HandleDestroyed +=

new EventHandler(Form1_HandleDestroyed)

}

private

void Form1_Load(object sender, EventArgs e)

{

InitSAPI()

}

系统事件:程序加载

取得所有的 识别对象模块集蠢困合,放入下拉框

代码

void InitSAPI()

{

//创建语音对象朗读用

_spVoiceCls = CreateComObject("SAPI.SpVoice")

if (_spVoiceCls == null)

{

MessageBox.Show("您的系统没有,微软语音组件")

Application.Exit()

}

else

{//取得所有的 识别对象模块集合

_oISpeechObjectTokens = CallComMethod("GetVoices", _spVoiceCls)//取得SAPI.ISpeechObjectTokens

//识别对象集合 Count

object r = GetComPropery("Count", _oISpeechObjectTokens)

if (r is int)

{

TokensCount = (int)r

if (TokensCount >0)

{

//取得全部语音识别对象模块,及名称,以被以后使塌携用

_deTokens = new DictionaryEntry[TokensCount]

for (int i = 0i <TokensCounti++)

{

//从集合中取出单个 识别对象模块

object oSpObjectToken = CallComMethod("Item", _oISpeechObjectTokens, i)//返回 SAPI.SpObjectToken

//取名称

string Description = CallComMethod("GetDescription", oSpObjectToken) as string

//放到 DictionaryEntry 对象中,key 是 识别对象模块,value 是名称

_deTokens= new DictionaryEntry(oSpObjectToken, Description)

}

//邦定到 下拉框

cboxTokens.DisplayMember = "Value"

cboxTokens.ValueMember = "Key"

cboxTokens.DataSource = _deTokens

cboxTokens.SelectedIndex = 0

}

}

}

}

用户事件:朗读

朗读输入的文本信息

代码

private void btnSynthesis_Click(object sender, EventArgs e)

{

string msg = rTxtMsg.Text.Trim()

if (msg.Length != 0)

{

if (_spVoiceCls != null)

{

//设置语言引擎

SetComProperty("Voice", _spVoiceCls, cboxTokens.SelectedValue)

//调用Speak 函数,msg 是要播放的文本,1 是异步播放,因为是异步的 com 对象不立刻释放

CallComMethod("Speak", _spVoiceCls, msg, SpFlags)

}

}

}

用户事件:保存声音

将输入的文本信息生成音频文件保存到文件

代码

private void Save()

{

string msg = rTxtMsg.Text.Trim()

if (msg.Length != 0)

{

using (SaveFileDialog sfd = new SaveFileDialog())

{

sfd.Filter = "wav 文件 (*.wav)|*.wav"

sfd.RestoreDirectory = true

if (sfd.ShowDialog() == DialogResult.OK)

{

/*

Enum SpeechStreamFileMode

SSFMOpenForRead = 0

SSFMOpenReadWrite = 1

SSFMCreate = 2

SSFMCreateForWrite = 3

*/

int SpFileMode = 3// SpeechStreamFileMode.SSFMCreateForWrite

object oSpFileStream = CreateComObject("SAPI.SpFileStream")//创建 SAPI.SpFileStream

object oSpVoice = CreateComObject("SAPI.SpVoice")//创建 SAPI.SpVoice

try

{

CallComMethod("Open", oSpFileStream, sfd.FileName, SpFileMode, false)//打开流

SetComProperty("Voice", oSpVoice, cboxTokens.SelectedValue)//设置 Voice 属性,让谁朗读

SetComProperty("AudioOutputStream", oSpVoice, oSpFileStream)//设置流

CallComMethod("Speak", oSpVoice, msg, SpFlags)//调用 Speak

CallComMethod("WaitUntilDone", oSpVoice, Timeout.Infinite)//等

CallComMethod("Close", oSpFileStream)//关闭流

MessageBox.Show("保存成功")

}

finally

{

Marshal.ReleaseComObject(oSpVoice)

Marshal.ReleaseComObject(oSpFileStream)

}

}

}

}

}

private void btnSave_Click(object sender, EventArgs e)

{

try

{

btnSave.Enabled = false

Save()

}

catch (Exception ex)

{

MessageBox.Show(ex.Message)

}

finally

{

btnSave.Enabled = true

}

}

调用com组件,功能函数

自己写的一些帮助函数可以方便调用反射,要不太郁闷(如果是VB 就不用如此费尽了)

#region 调用com组件,功能通用函数

/// <summary>

/// 设置属性

/// </summary>

/// <param name="name"></param>

/// <param name="o"></param>

/// <param name="vlaue"></param>

private static void SetComProperty(string name, object o, object vlaue)

{

Type t = o.GetType()

t.InvokeMember(name, BindingFlags.Instance | BindingFlags.SetProperty, null, o, new

object[] { vlaue })

}

/// <summary>

/// 取得属性

/// </summary>

/// <param name="name"></param>

/// <param name="o"></param>

/// <returns></returns>

private static object GetComPropery(string name, object o)

{

Type t = o.GetType()

return t.InvokeMember(name, BindingFlags.Instance | BindingFlags.GetProperty, null, o, null)

}

/// <summary>

/// 调用方法函授

/// </summary>

/// <param name="name"></param>

/// <param name="o"></param>

/// <param name="parms"></param>

/// <returns></returns>

private static object CallComMethod(string name, object o, params object[] parms)

{

Type t = o.GetType()

return t.InvokeMember(name, BindingFlags.Instance | BindingFlags.InvokeMethod, null, o, parms)

}

/// <summary>

/// 创建 com 对象

/// </summary>

/// <param name="FromProgID"></param>

/// <returns></returns>

private static object CreateComObject(string FromProgID)

{

Type comType = Type.GetTypeFromProgID(FromProgID)

object rVar = null

if (comType != null)

rVar = System.Activator.CreateInstance(comType)

return rVar

}

#endregion

释放com对象

很简单的就一行即可

代码

void Form1_HandleDestroyed(object sender, EventArgs e)

{

//释放com对象

Marshal.ReleaseComObject(_spVoiceCls)

}

这个程序的代码。

因为和平精英中的u代表这个程序的代码桐烂。还有序列号。如果是id里出现这个u,那就是因为玩家的名字违规了,所以是这个程序的代码。

《和平精英》是腾讯光子工作室群局局漏自研打造的军事竞赛体验手游。虚幻引擎4研发,次腊大世代完美画质,极致视听感受。

我找到的。

1

中文:一个C#的语音聊天程序

英文凯物:A Voice Chat Application in C#

来自:Codeproject

2.

中文:C#,socket网络,音频,网络流

英文:Voice Chat,Audio Streaming &socket

来自:MSDN Forum

3.

中文:点对点语音聊天源代码

英文:Peer-to-peer voice chat source

来自:VCX

4.

中文:怎样进行语音聊天传输

英文:how to perform voice chat ?

来自盯派液:Experts-Exchange

感羡余兴趣的话百度HI我,我整理后发给你


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/12350021.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-22
下一篇2023-05-22

发表评论

登录后才能评论

评论列表(0条)

    保存