http://hi.baidu.com/andorid/blog/item/b6496903080553723812bb0d.html
这个问题,当时浪费我不少时间,刚开始我是用SetPixel一个像素点一个像素点的描,速度可想而知,特别是在德赛M9的winmobile(400MHZ的CPU,64M内存)上,慢到1FPS,无法接受。当时还没意识到是SETPIXEL的问题,还以为是XVID解码太慢的问题,然后写了个LOG,发现速度瓶颈在SETPIXEL。于是查了些资料,说DirectShow速度很快,我便想用DIRECTSHOW,不过这个有些难,一时半会我也搞不懂,后来放弃了,后来偶然找到了些资料,发现可以直接在"设备"上显示RGB数组,即用SetDIBitsToDevice这个API,贴上我的代码来,这个API终于解决了那个问题
void CClientDlg::PostDecHandler(unsigned char *picbuffer, int used_bytes, int channel)
{
static long frame_count = 0;
static long time_start = 0;
static long video_total = 0;
static long time_total = 0;
static bool firstframe = true;
if (firstframe == true)
{
firstframe = false;
time_start = GetTickCount();
}
video_total += used_bytes;
BITMAPINFO bmi;
ZeroMemory(&bmi, sizeof(BITMAPINFO));
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmi.bmiHeader.biWidth = m_Width[channel];
bmi.bmiHeader.biHeight = m_Height[channel]; //当图像是倒立显示的时候,把biHeight改为对应的负值
bmi.bmiHeader.biPlanes = 1;
bmi.bmiHeader.biBitCount = 24;
bmi.bmiHeader.biCompression = BI_RGB;
SetDIBitsToDevice(cur_dc[channel]->m_hDC, m_nLeft[channel],m_nTop[channel],m_Width[channel],m_Height[channel],0,0,0,m_Height[channel],picbuffer,&bmi,DIB_RGB_COLORS);
if (++frame_count%int(m_fFps[channel]) == 0)//显示比特率和帧率
{
time_total = GetTickCount()-time_start;
time_start = GetTickCount();
m_fRealFps[channel] = m_fFps[channel]*1000/time_total;
m_nRealSpeed[channel] =((video_total/1024.0)/(time_total/1000.0))*8;
CString info;
info.Format("%.1f FPS",m_fRealFps[channel]);
GetDlgItem(IDC_EDIT_FRAMERATE)->SetWindowText(info);
info.Format("%.1f Kbit/s",m_nRealSpeed[channel]);
GetDlgItem(IDC_EDIT_SPEED)->SetWindowText(info);
video_total = 0;
time_total = 0;
}
}