我将一副存储在单片机中的图片通过网线传到电脑上显示,没有用打时间戳,{etSyncSource(NULL);SetTime(NULL, NULL)}
确认所有的数据被传到电脑端了,视频不闪烁,移动,下面是我的视屏格式;
mPreferredMt.SetType(&MEDIATYPE_Video);
mPreferredMt.SetSubtype(&MEDIASUBTYPE_RGB565);
mPreferredMt.SetFormatType(&FORMAT_VideoInfo);
mPreferredMt.SetTemporalCompression(FALSE);
VIDEOINFO info;
ZeroMemory(&info, sizeof(VIDEOINFO));
info.AvgTimePerFrame = 40000;
info.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
info.bmiHeader.biWidth =160;
info.bmiHeader.biHeight = - 120;
info.bmiHeader.biBitCount = 16;
info.bmiHeader.biSizeImage = (192)*(120)*2; //
info.bmiHeader.biCompression = BI_BITFIELDS;
info.bmiHeader.biPlanes = 1;
info.bmiHeader.biClrImportant = 0;
info.bmiHeader.biClrUsed = 0; //Use max colour depth
info.bmiHeader.biXPelsPerMeter = 0 ;
info.bmiHeader.biYPelsPerMeter = 0 ;
info.dwBitMasks[0] =0xF800;
info.dwBitMasks[1] =0x7E0;
info.dwBitMasks[2] =0x1F;
SetRectEmpty(&(info.rcSource));
SetRectEmpty(&(info.rcTarget));
info.rcSource.bottom = 0;
info.rcSource.right = 0;
info.rcTarget.bottom = 120;
info.rcTarget.right = 160;
TRACE("VIDEOINFO%u",sizeof(VIDEOINFO));
mPreferredMt.SetFormat((BYTE*)&info, sizeof(VIDEOINFO));
mPreferredMt.SetSampleSize(info.bmiHeader.biSizeImage);
mPreferredMt.cbFormat = sizeof(VIDEOINFO);
DisplayType("MediaType",&mPreferredMt);
下面是我的数据接收函数,先接收一个同步标志,然后按行接收,一行320bytes的数据,把整幅图片120行接收完,在每行末尾加入64bytes,因为VMR9需要192*2=384bytes的STRIDE
void CStreamSocket::ReceivingLoop(void)
{
unsigned int bytes = 0;
int err;
char VideoBegin =0;
PBYTE pSampleBuffer;
SOCKET UDPReceiver,TCPReceiver;
TRACE("In Net Receiver Filter Loop");
char buffer[MAX_COMMAND_SIZE];
// Set up command listening
BOOL pass = mUDPReceiver->CreateReceiver();
if(pass)
UDPReceiver = mUDPReceiver->GetUDPReceiver();
else
TRACE("UDP SOCKET创建失败");
while(TRUE)
{
if(mIsConnected!=TRUE)
{
TCPReceiver = AcceptConnectform();
TRACE("连接到摄像头 %x",TCPReceiver);//建立连接
}
else
{
TRACE("Receive media data");
// Receive media data
BOOL pass = FALSE;
do
{
pass = mOwnerFilter->GetSampleBuffer(&pSampleBuffer);
if (!pass)
{
Sleep(100);
}
} while (mIsReceiving && !pass);
while (VideoBegin == 0) //同步主机和摄像头
{
bytes = recv(UDPReceiver, (char *)buffer, MAX_COMMAND_SIZE, 0);
TRACE("等待新的一帧图像 %X ",bytes);
TRACE("buffer%x",*(long *)buffer);
//long tem = *(long *)buffer;
//TRACE("TEM%X",tem);
TRACE("CMD%x",cmd_VideoBegin);
//ntohl(tem);
if ( *(long *)buffer == cmd_VideoBegin)
{
VideoBegin = 1;
}
}
unsigned int row = 320;
long received = 0;
while (mIsReceiving && received < (160 +32)*120*2)
{
bytes = recv(TCPReceiver, (char*)(pSampleBuffer+received), row, 0);
err=WSAGetLastError();
switch(err)
{
case 0 : TRACE("Bytes received: %d\n", bytes);VideoBegin = 0;break;
case WSAENOTCONN : mIsConnected=FALSE;TRACE("连接断开");break;
case WSAENETRESET : mIsConnected=FALSE;TRACE("连接断开");break;
case WSAESHUTDOWN : TRACE("连接被关闭");break;
case WSAECONNABORTED : mIsConnected=FALSE;TRACE("连接断开");break;
case WSAETIMEDOUT : mIsConnected=FALSE;TRACE("连接超时");break;
case WSAECONNRESET : mIsConnected=FALSE;TRACE("连接断开");break;
default:TRACE("recv failed: %d\n", err);
}
if(bytes == 320) //得到的数据正好是一行则直接添加STRIDE
{
received += (row +64);
TRACE("已经接收的数据 %d\n",received);
}
else
{
received += bytes;
row =320-received%384; //接收一行的下半部分
TRACE("已经接收的数据 %d\n",received);
TRACE("下半部分 %d\n", row);
if(row == 0) //凑齐了一行数据后插入STRIDE
{
received+=64;
row = 320;
}
}
}
TRACE("received %u",received);
// Deliver this sample
mOwnerFilter->DeliverHoldingSample(received);
Sleep(10);
}
}
}
调试到这里不知道怎么弄了,请大家说说可能是哪方面的问题?