首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 嵌入开发 > WinCE >

wince 视频/图片 平添字幕

2013-07-16 
wince 视频/图片 添加字幕现在手头有个项目,需要在WINCE6.0的平台上,播放视频/图片等,并且要求可以插播滚

wince 视频/图片 添加字幕
现在手头有个项目,需要在WINCE6.0的平台上,播放视频/图片等,并且要求可以插播滚动字幕(如电视上的滚动新闻),要求是:透明滚动字幕,不能影响视频播放,不能闪烁,高清视频,分辨率为1280*720。
设备性能:300MHZ+128内存。
现在我第一步要实现的是在图片上添加字幕,思路如下:
在Static控件上实现该功能,为了实现功能,继承Static并创建自己的类CCreditStatic。
在CCreditStatic类中做一个Timer,在Timer中创建一个和控件兼容的CDC memDC,选入图像memDC.SelectObject(&m_BmpMain),设置透明并用背景色填充memDC.SetBkMode(TRANSPARENT);memDC.FillSolidRect(&m_ScrollRect,BackColor);在这个CDC上实现滚动字幕,每次滚动一个像素。
然后将滚动字幕的图片m_BmpMain(只有字幕,背景用背景色填充)覆盖到背景图片m_bitmap上,并使用bitblt将处理好的图片copy到控件的CClientDC *pDC中显示。
现在上诉功能已经实现,是我从一个windows应用程序上移植过来的,这些代码在windows下工作正常,但在CE下效率极其低下,我设置的Timer间隔为40ms,但实现测试发现刷新一次的时间接近1s,请教各位能否帮我看下有什么办法提高效率。。或者有其他高效率的实现方法。

代码如下:
参数说明:
pDC:控件的CClientDC指针,用来刷新控件显示
m_ScrollRect:控件的客户区域;
m_ClientRect:滚动字幕的区域
//设置背景
void CCreditStatic::AddBackGround(CDC* pDC, CRect& m_ScrollRect, CRect& m_ClientRect)
{
CDC memDC;
memDC.CreateCompatibleDC( pDC );

    if( m_bitmap.m_hObject == NULL )//背景图片m_bitmap为空,则直接显示字幕m_BmpMain
{
        CBitmap* pOldBitmap = memDC.SelectObject( &m_BmpMain );
        pDC->BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), 
                                        &memDC, 0, 0, SRCCOPY );
memDC.SelectObject(pOldBitmap);
return;
}
   // Draw bitmap in the background if one has been set
                // Now create a mask

if (!m_bShowScrollText)//如果不显示滚动字幕,则不需要做透明处理
{
CDC tempDC;
tempDC.CreateCompatibleDC(pDC);
CBitmap* pOldTempDCBitmap = tempDC.SelectObject( &m_bitmap );

CDC imageDC;
CBitmap bmpImage;
imageDC.CreateCompatibleDC( pDC );
bmpImage.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );
CBitmap* pOldImageDCBitmap = imageDC.SelectObject( &bmpImage );

imageDC.BitBlt( 0, 0, m_cxBitmap, m_cyBitmap, &tempDC, 0, 0, SRCCOPY );
pDC->BitBlt(0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), &imageDC, 0, 0, SRCCOPY);
imageDC.SelectObject(pOldImageDCBitmap);
tempDC.SelectObject(pOldTempDCBitmap);
}
else
{
CBitmap bitmap;


bitmap.CreateCompatibleBitmap( pDC, m_ClientRect.Width(), m_ClientRect.Height() );
CBitmap* pOldMemDCBitmap = memDC.SelectObject( &bitmap );

CDC tempDC;
tempDC.CreateCompatibleDC(pDC);
CBitmap* pOldTempDCBitmap = tempDC.SelectObject( &m_BmpMain );

memDC.BitBlt( 0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &tempDC, 
m_ClientRect.left, m_ClientRect.top, SRCCOPY );
CDC maskDC;
maskDC.CreateCompatibleDC(pDC);
CBitmap maskBitmap;

// Create monochrome bitmap for the mask
maskBitmap.CreateBitmap( m_ClientRect.Width(), m_ClientRect.Height(), 1, 1, NULL );
CBitmap* pOldMaskDCBitmap = maskDC.SelectObject( &maskBitmap );
memDC.SetBkColor(m_bTransparent? RGB(192,192,192): m_Colors[BACKGROUND_COLOR]);

// Create the mask from the memory DC
maskDC.BitBlt( 0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &memDC, 0, 0, SRCCOPY );

tempDC.SelectObject(pOldTempDCBitmap);
pOldTempDCBitmap = tempDC.SelectObject( &m_bitmap );

CDC imageDC;
CBitmap bmpImage;
imageDC.CreateCompatibleDC( pDC );
bmpImage.CreateCompatibleBitmap( pDC, m_ScrollRect.Width(), m_ScrollRect.Height() );
CBitmap* pOldImageDCBitmap = imageDC.SelectObject( &bmpImage );

// Get x and y offset
// Draw bitmap in tiled manner to imageDC
// for( int i = 0; i < m_ScrollRect.right; i += m_cxBitmap )
// for( int j = 0; j < m_ScrollRect.bottom; j += m_cyBitmap )
// imageDC.BitBlt( i, j, m_cxBitmap, m_cyBitmap, &tempDC, 0, 0, SRCCOPY );
imageDC.BitBlt( 0, 0, m_cxBitmap, m_cyBitmap, &tempDC, 0, 0, SRCCOPY );

if (m_ClientRect.Width() > 0 && m_ClientRect.Height() > 0)
{
DrawSemiTransparentRect(&imageDC, m_ClientRect, RGB(0, 0, 0));
// Set the background in memDC to black. Using SRCPAINT with black and any other
// color results in the other color, thus making black the transparent color
memDC.SetBkColor(RGB(0,0,0));
memDC.SetTextColor(RGB(255,255,255));


memDC.BitBlt(0, 0, m_ClientRect.Width(), m_ClientRect.Height(), &maskDC, 0, 0, SRCAND);

// Set the foreground to black. See comment above.
imageDC.SetBkColor(RGB(255,255,255));
imageDC.SetTextColor(RGB(0,0,0));
imageDC.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(), 
&maskDC, 0, 0, SRCAND);

// Combine the foreground with the background
imageDC.BitBlt(m_ClientRect.left, m_ClientRect.top, m_ClientRect.Width(), m_ClientRect.Height(), 
&memDC, 0, 0,SRCPAINT);
}
// Draw the final image to the screen   
pDC->BitBlt( 0, 0, m_ScrollRect.Width(), m_ScrollRect.Height(), 
&imageDC, 0, 0, SRCCOPY );

imageDC.SelectObject(pOldImageDCBitmap);
maskDC.SelectObject(pOldMaskDCBitmap);
tempDC.SelectObject(pOldTempDCBitmap);
memDC.SelectObject(pOldMemDCBitmap);
}

}
[解决办法]
1.不用系统标准控件、
2.直接使用DDraw 或者 映射FrameBuffer 写屏
[解决办法]
overlay ,directdraw相关的技术。你这么高分辨率的视频显示,用GDI肯定慢的
[解决办法]
http://download.csdn.net/source/2826029,上这边下载吧。这个是x86版本的dSHOW的字幕filter,改改就可以在CE下用了。
[解决办法]
建议用DirectDraw以及DirectShow技术。

热点排行