因为项目需要,需要在当电视在播放视频的时候,使用OSD把电脑上生成的图像,动态地显示到电视屏幕上。请教如下:
1。C# 使用OSD显示电视图像的类库或者控件。
2。动态在电视机上显示图像的思路。
3。希望能提供一个示例。
因为对这方面第一次涉及,所以很多地方缺乏经验,
希望各位能不吝赐教。
我的现有思路,就是从电脑上生成图像,然后使用OSD模式在电视上绘制。
如果除了OSD有更好的方法,请指教。谢谢各位。

解决方案 »

  1.   

    因为osd,不太懂,别人说我白写程序了。郁闷呵呵  
    ------------------
     #region 3.7.1信息叠入视频编码(OSD、LOGO、MASK)
            //注意:使用此部分函数时,在录像文件中,包含所叠加的信息
            #region 3.7.1.1 OSD
            /// <summary>
            /// 3.7.1.1.1设置OSD显示模式
            /// 函 数:  int __stdcall SetOsdDisplayMode(HANDLE hChannelHandle, int Brightness,  BOOL Translucent, int parameter, USHORT *Format1, USHORT *Format2) 
            /// </summary>
            /// <param name="hChannelHandle">通道句柄</param>
            /// <param name="Brightness">OSD显示亮度。0最暗,255最亮</param>
            /// <param name="Translucent">OSD图像是否做半透明处理</param>
            /// <param name="parameter">Bit0:是否自动进行颜色翻转 Bit16-23垂直放大倍数 Bit24-31水平 </param>
            /// <param name="Format1">描述字符叠加的位置和次序的格式</param>
            /// <param name="Format2"></param>
            #region USHORT    *Forma1, *Format2
            //USHORT    *Forma1, *Format2 
            //描述字符叠加的位置和次序的格式串,具体定义如下: 
            //USHORT X, USHORT Y, CHAR0, CHAR1, CHAR2,… CHARN,  NULL 
            //  其中X,Y 是该字串在标准4CIF图象的起始位置,X必须是16的倍数,Y可以在图
            //象高度内取值即(0-575)PAL 、(0-479)NTSC;CHARN也是USHORT型的参数,可以
            //是ASCII码也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值
            //如下: 
            //_OSD_YEAR4   四位的年显示,如2004 
            //_OSD_YEAR2   两位的年显示,如02 
            //_OSD_MONTH3   英文的月显示,如 Jan  
            //_OSD_MONTH2   两位阿拉伯数字的月显示,如07 
            //_OSD_DAY     两位的阿拉伯数字的日显示,如31 
            //_OSD_WEEK3   英文的星期显示,如Tue 
            //_OSD_CWEEK1   中文的星期显示,如星期二 
            //    _OSD_HOUR24   24小时的时钟显示,如18 
            //_OSD_HOUR12   12小时的时钟显示,如AM09或PM09 
            //_OSD_MINUTE   两位分钟的显示 
            //_OSD_SECOND   两位秒的显示 
            //在格式字符串的最后必须以NULL(0)结尾,否则会显示错误的内容。 
            //字符串和时间显示可以在FORMAT1 也可以在FORMAT2,也可以混合在一起,但不得超
            //过一行4CIF 图象的宽度。 
            //例如: 
            //要显示位置在16,19的字符串“办公室”的格式字符串如下: 
            //  USHORT Format[] = {16, 19, ‘办’,’公’,’室’, ‘’}; 
            //要显示位置在8, 3的时间字符串可以如下: 
            //  USHORT Format[]={8, 3, _OSD_YEAR4, ‘年’,_OSD_MONTH2,’月’,_OSD_DAY, 
            //‘日’,_OSD_HOUR24,’:’, _OSD_MINUTE, ‘:’, _OSD_SECOND, ‘’}; 
            //如果只想显示其中一行,则将起始的字符串定义如下: 
            //  USHORT FormatNoDisplay[]={0, 0, ‘’}; 
            //返回值:  成功返回0;失败返回错误号 
            //说 明:  OSD字符中,ASCII字符的标准分辨率为8×16,汉字的标准分辨率为16×16。 
            //由于在编码之前需要对原始图像进行缩小才能产生编码所需的分辨率,此时为了保证在
            //缩小后的编码图像上能够看清OSD字符,就需要先把OSD字符放大以后再叠加在4CIF的
            //原始图像上。 
            //如果不指定放大倍数(采用默认设置),则系统会根据该通道录像的分辨率自动设置,
            //这样在任何分辨率下都可以保证回放时能够看清OSD内容,但是这会导致OSD的大小和位
            //置在原始图像中不固定。 
            //为了避免上面的现象,用户可以指定OSD的大小。例如,如果应用程序想以CIF、DCIF、
            //2CIF、4CIF的分辨率录像,这时候可以将放大系数设为2、2,此时OSD的位置始终固定,
            //但在不同的编码分辨率下,OSD字符的分辨率也不同,所以需要特别注意。如果此时使用
            //QCIF录像,则OSD字符会变得模糊不清(因为QCIF要对图像进行1/4缩小,而对OSD
            //字符只进行了2倍的放大)。具体配置详见下表: 
            //水平放大倍数  垂直放大倍数  适合的录像分辨率  说明 
            //1  1  4CIF  其它分辨率下会模糊 
            //1  2  2CIF  小于2CIF时无法分辩 
            //2  2  CIF、DCIF  QCIF时无法分辩 
            //4  4  QCIF  在其它分辨率下字符会很大 
            //任意系数为0  自动设置(默认值)  
            //其它无效值  按水平2、垂直2处理  
            //注意:因为字符的位置会随着不同的录像分辨率而改变,在位置改变后,某些OSD字符的
            //位置可能会超出图像的范围,此时这些字符将无法显示,但系统并不会返回错误。 
            #endregion
            /// <returns></returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int SetOsdDisplayMode(IntPtr hChannelHandle, int Brightness, bool Translucent, int parameter, ushort[] Format1, ushort[] Format2);        /// <summary>
            /// 3.7.1.1.2设置OSD显示模式(扩展)
            ///     说 明:  此函数为SetOsdDisplayMode的扩展,SetOsdDisplayModeEx函数支持最多8行OSD字符串的显示。
            /// 
            /// int __stdcall SetOsdDisplayModeEx(HANDLE hChannelHandle,int color, BOOL Translucent,int param,int nLineCount,USHORT **Format) 
            /// </summary>
            /// <param name="hChannelHandle">通道句柄</param>
            /// <param name="Brightness">OSD显示亮度。0最暗,255最亮</param>
            /// <param name="Translucent">OSD图像是否做半透明处理</param>
            /// <param name="param">Bit0:是否自动进行颜色翻转 Bit16-23垂直放大倍数 Bit24-31水平放大倍数</param>
            /// <param name="nLineCount">OSD显示的行数,最多为8行</param>
            /// <param name="Format">多行字符显示
            /// USHORT **Format;多行字符显示,描述字符叠加的位置和次序的格式串,  
            /// 其中每一行的第一元素X和第二元素Y 是该字串在标准4CIF图象的起始位置,X必须是
            /// 16的倍数,Y可以在图象高度内取值即(0-575)PAL 、(0-479)NTSC;可以是ASCII码
            /// 也可以是汉字,当想要显示当前时间时,可以指定为固定的时间定义值,其值如下: 
            /// _OSD_YEAR4   四位的年显示,如2004 
            /// _OSD_YEAR2   两位的年显示,如02 
            /// _OSD_MONTH3   英文的月显示,如 Jan  
            /// _OSD_MONTH2   两位阿拉伯数字的月显示,如07 
            /// _OSD_DAY     两位的阿拉伯数字的日显示,如31 
            /// _OSD_WEEK3   英文的星期显示,如Tue 
            /// _OSD_CWEEK1   中文的星期显示,如星期二 
            /// _OSD_HOUR24   24小时的时钟显示,如18 
            /// _OSD_HOUR12   12小时的时钟显示,如AM09或PM09 
            /// _OSD_MINUTE   两位分钟的显示 
            /// _OSD_SECOND   两位秒的显示 
            /// 在格式字符串的每一行最后一个元素必须以NULL(0)结尾,否则会显示错误的内容。 
            /// 返回值:  成功返回0;失败返回错误号。 
            /// 说 明:  此函数为SetOsdDisplayMode的扩展,SetOsdDisplayModeEx函数支持最多8行
            /// OSD字符串的显示。 
            /// </param>
            /// <returns>成功返回0;失败返回错误号</returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int SetOsdDisplayModeEx(IntPtr hChannelHandle, int Brightness, bool Translucent, int param, int nLineCount, char[] Format);
            /// <summary>
            /// 3.7.1.1.3设置OSD显示
            ///     说 明:  设置OSD显示,将当前的系统时间年月日星期时分秒等信息叠加在视频之上,并可作透明处理。
            /// 
            /// int __stdcall SetOsd(HANDLE hChannelHandle, BOOL Enable) 
            /// </summary>
            /// <param name="hChannelHandle">通道句柄</param>
            /// <param name="Enable">OSD是否显示</param>
            /// <returns>成功返回0;失败返回错误号</returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int SetOsd(IntPtr hChannelHandle, bool Enable);
            #endregion
           #region 3.7.1.2 LOGO
      

  2.   

     /// <summary>
            /// 3.7.1.2.1数据格式转换
            ///     说 明:  将24位bmp格式图像转换为yuv422格式图像。
            ///     注意:bmp位图的长宽必须为16的倍数,图像尺寸最大支持128*128,4.3版本SDK图像尺寸扩大为256*128
            /// 函 数:  int __stdcall LoadYUVFromBmpFile(char *FileName, unsigned char *yuv,  int BufLen, int *Width, int *Height) 
            /// </summary>
            /// <param name="FileName">文件名</param>
            /// <param name="yuv">YUV422图像指针 </param>
            /// <param name="BufLen">YUV422图像缓存大小</param>
            /// <param name="Width">返回的YUV422图像的宽度</param>
            /// <param name="Height">返回的YUV422图像的高度</param>
            /// <returns>成功返回0;失败返回错误号</returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int LoadYUVFromBmpFile(string FileName, string yuv, int BufLen, ref int Width, ref int Height);
           /// <summary>
            /// 3.7.1.2.2设置LOGO显示模式
            ///     说 明:  设置LOGO显示模
            /// 函 数:  int __stdcall SetLogoDisplayMode(HANDLE hChannelHandle,  COLORREF ColorKey, BOOL Translucent, int TwinkleInterval) 
            /// <param name="hChannelHandle">通道句柄</param>
            /// <param name="ColorKey">LOGO图像中该颜色在显示时将会全透明</param>
            /// <param name="Translucent">LOGO图像是否作半透明处理</param>
            /// <param name="TwinkleInterval">闪烁的时间设置,由16进制数表示为0xXXYY,其中XX为显示的秒数,YY为停止的秒数,XXYY均为0时正常显示。</param>
            /// <returns>成功返回0;失败返回错误号</returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int SetLogoDisplayMode(IntPtr hChannelHandle, Color ColorKey, bool Translucent, int TwinkleInterval);
            /// <summary>
            /// 3.7.1.2.3设置LOGO显示位置及数据
            ///     说 明:  设置LOGO图像位置及数据,用户程序可先调用LoadYUVFromBmpFile将24
            ///     位bmp文件中转化为YUV422格式数据,,透明处理由DSP完成。
            ///     注意:HS卡的x,w需要按照32对齐,y,h仍为8对齐。
            /// 函 数:  int __stdcall SetLogo(HANDLE hChannelHandle, int x, int y, int w, int h,  unsigned char *yuv) 
            /// </summary>
            /// <param name="hChannelHandle">通道句柄</param>
            /// <param name="x">LOGO左上角x坐标位置,取值范围0-703,需按16对齐</param>
            /// <param name="y">LOGO左上角y坐标位置,取值范围0-575,需按8对齐</param>
            /// <param name="w">LOGO宽度,最大值为256,需按16对齐,此宽度必须和LOGO图片的宽度相一致</param>
            /// <param name="h">LOGO高度,最大值为128,需按8对齐</param>
            /// <param name="yuv">LOGO图片指针(yuv422格式)</param>
            /// <returns>成功返回0;失败返回错误号 </returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int SetLogo(IntPtr hChannelHandle, int x, int y, int w, int h, string yuv);
            /// 3.7.1.2.4停止LOGO显示
            ///     说 明:  停止LOGO显示
            /// int __stdcall StopLogo(HANDLE hChannelHandle)
            /// </summary>
            /// <param name="hChannelHandle">通道句柄</param>
            /// <returns>成功返回0;失败返回错误号</returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int StopLogo(IntPtr hChannelHandle);
            #endregion
            #region 3.7.1.3视频遮挡MASK
            /// <summary>
            /// 3.7.1.3.1设置屏幕遮挡
            ///     说 明:  设置屏幕遮挡,最多可以设置32个
            /// 
            /// int __stdcall SetupMask(HANDLE hChannelHandle, RECT *RectList, int iAreas) 
            /// </summary>
            /// <param name="hChannelHandle">通道句柄</param>
            /// <param name="RectList">矩形框数组,宽度范围0-704,按16对齐;高度范围0-576,按</param>
            /// <param name="iAreas">矩形框个数</param>
            /// <returns>成功返回0;失败返回错误号</returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int SetupMask(IntPtr hChannelHandle, ref Rectangle RectList, int iAreas);        /// <summary>
            /// 3.7.1.3.1停止屏幕遮挡
            ///     说 明:  停止屏幕遮挡
            /// 
            /// int __stdcall StopMask(HANDLE hChannelHandle) 
            /// </summary>
            /// <param name="hChannelHandle">通道句柄</param>
            /// <returns>成功返回0;失败返回错误号</returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int StopMask(IntPtr hChannelHandle);
            #endregion
            #endregion
            #region 3.7.2仅在预览画面上叠加信息
            //        注意:当采用overlay预览模式时,可在overlay表面上直接叠加字符或画图,当采用offscreen
            //预览模式时,需要调用画图回调函数进行信息叠加,所叠加信息仅在预览屏幕上显示,不进
            //入编码。
            //Offscreen预览模式下画图回调函数
            /// <summary>
            /// 3.7.2.1注册画图回调函数
            ///     说 明:  获取当前offscreen表面的device context,HC系列板卡采用创建offscreen的方 
            ///     式,所以在窗口客户区中的DC中无法画图或者鞋子,必须使用DirectDraw里的offscreen表面的DC。
            ///     注意:如果采用overlay预览模式,则直接在overlay表面画图即可,无需调用此函数
            /// 
            /// int __stdcall RegisterDrawFun(DWORD nport, DRAWFUN(DrawFun),LONG nUser)
            /// </summary>
            /// <param name="nport">通道号索引</param>
            /// <param name="df">画图回调函数</param>
            /// <param name="nUser">用户数据</param>
            /// <returns>成功返回0;失败返回错误号</returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int RegisterDrawFun(ulong nport, DrawFun df, long nUser);
            //public static extern int RegisterDrawFun(ulong nport, DrawFun df, IntPtr nUser);
            /// <summary>
            /// 3.7.2.2停止画图回调
            ///     说 明:  停止画图回调。在某些显卡上进行画图回调,会使得CPU的利用率变高,所以可以在适当的时候(画图回调结束)停止调用。 
            /// int __stdcall StopRegisterDrawFun(DWORD nport) 
            /// </summary>
            /// <param name="nport">通道索引</param>
            /// <returns>成功返回0;失败返回错误号</returns>
            [DllImport("DS40xxSDK.dll")]
            public static extern int StopRegisterDrawFun(ulong nport);
      

  3.   

    实例 在csdn 里下载处 有几个,你自己找把。