日期:2014-05-19  浏览次数:20703 次

新手提问,望高手帮忙!~感激不尽,分不够可以再加!
问题1:QQ的聊天框显示聊天内容,也就是上半部份是用什么控件实现在,能给个例子吗?他的容器可以放文字,也可以是图片;
问题2:当消息来时,,怎样实现如QQ一样的头像晃动效果,我是用的LISTVIEW控件,不知是不是应该用其它控件来做。
问题3:怎样实现视频聊天及语音聊天功能。

------解决方案--------------------
1.RichTextbox
2.晃动头像是交换图片实现
3.这个问题比较复杂
------解决方案--------------------
2.头像闪动的问题:
private void timer1_Tick(object sender, System.EventArgs e)
{
this.timer2.Stop();
this.pictureBox1.Image = this.imageList1.Images[0];
this.timer2.Start();
}

private void timer2_Tick(object sender, System.EventArgs e)
{
this.timer1.Stop();
this.pictureBox1.Image = this.imageList1.Images[1];
this.timer1.Start();
}
其中:imageList1中放有2张图片,这用线程做比较好
两个timer1初始时都设置为500,true
------解决方案--------------------
我给你解答第三个问题:
首先实现语音不是很复杂的问题,C#,delphi里面应该就有处理这个问题的方法不需要第三方实现,至少C#是这样
视频实现起来有点复杂,不过你是完全有可能实现的(指的是你不需要付费支付专门控件)
最后一个关键的效率问题,语音,视频实现的了,可效果可能是大相径庭,差别很大的。
目前包括QQ在内的在线语音视频使用的核心技术都是花钱购买第三方的。
现在的TM软件很多实现的核心技术也不太一样
------解决方案--------------------
我分析过一个C++局域网视频软件(VideoNet version 1.1)的源码
里面有一个VideoCapture类 下面是捕获视频用的二个关键函数
BOOL VideoCapture::Initialize()
{
char devname[100],devversion[100];
char str[200];
int index=0;

m_capwnd = capCreateCaptureWindow( "Capture ",WS_POPUP,0,0,1,1,0,0);


if(m_capwnd==NULL)
{
log.WriteString( "\n Unable to create capture window ");
return FALSE;
}



//connect callback functions
capSetUserData(m_capwnd,this);


//Change destroy functions also........

capSetCallbackOnVideoStream(m_capwnd,OnCaptureVideo);

capGetDriverDescription(index,devname,100,devversion,100);

sprintf(str, "\n Driver name = %s version = %s ",devname,devversion);
log.WriteString(str);

// Connect to webcam driver
if( ! capDriverConnect(m_capwnd,index) )
{

// Device may be open already or it may not have been
// closed properly last time.
AfxMessageBox( "Unable to open Video Capture Device ");
log.WriteString( "\n Unable to connect driver to the window ");
m_capwnd=NULL;
return FALSE;
}

// Set the capture parameters
if(SetCapturePara()==FALSE)
{
log.WriteString( "\n Setting capture parameters failed ");
capDriverDisconnect(m_capwnd);
return FALSE;
}


return TRUE;
}


/**
* Start capturing frames from webcam
*
*/

BOOL VideoCapture::StartCapture()
{
// Start live capturing ...
if(capCaptureSequenceNoFile(m_capwnd)==FALSE)
{
log.WriteString( "\n Failed to capture Sequence .. ");
return FALSE;
}


return TRUE;

}

以cap开关的都是windows提供的函数 查下MSDN都有
我把这个类抠了出来 自己做了个视频捕获的小程序(C++)

我也见过有人把上面见个API导到C#中做捕获的
也就是说捕获很容易

关键是传输时的编码

源程序好像用的是一种叫 h.263 的编码,有一大堆文件

发送和接收就是用的一般的Socket
就知道这么多了