目录

  • 一、海思平台OSD理论学习
    • 1、OSD概述
    • 2、海思OSD的4种类型
    • 3、4种OSD类型各自支持的模块和功能
    • 4、海思OSD的几个重要概念
    • 5、海思平台OSD使用方法
    • 6、海思平台OSD的API和关键数据结构
  • 二、OSD实验演示和代码框架分析
    • 1、OSD实验演示
    • 2、OSD代码框架分析
  • 三、OSD代码实现分析
    • 1、SAMPLE_RGN_CreateVideoRegion()所做的事
    • 2、前景和背景透明
    • 3、RGN(region)通道属性分析
    • 4、RGN(region)内容填充
    • 5、动态刷新BMP
    • 6、小结——整体函数调用层次

一、海思平台OSD理论学习

本部分内容的学习重点参考《HiMPP IPC V2.0 媒体处理软件开发参考.pdf》

链接:https://pan.baidu.com/s/1R5KwdQxVPTXCNJUMCQCFJA
提取码:onoh
--来自百度网盘超级会员V5的分享

1、OSD概述

  OSD是on-screen display的简称,指屏幕菜单式调节方式。它通过显示在屏幕上的功能菜单达到调整各项参数的目的,不但调整方便,而且调整的内容也比以上的两种方式多,增加了失真、会聚、色温、消磁等高级调整内容。像以前显示器出现的网纹干扰、屏幕视窗不正、磁化等需要送维修厂商维修的故障,举手之间便可解决。

  另外在OSD选项里还可以调整显示的位置、无动作关闭显示的时间。OSD核心是利用字符发生芯片在显示器的屏幕上显示需要的字符。

  技术方式是:与图像实时同步附加或改变图像中某些像素的颜色,使之组合成人类可以在图像中辨识的数据。以固定或不固定的方式,改变某个特定的OSD控制暂存器,即可达到动态的效果。如:在荧幕上产生由左向右移动的OSD字形,只要将控制左右位置的OSD控制暂存器依序填入由小变大或由大变小的数值,OSD输出字形自然随更改的数值而做左右移动。

2、海思OSD的4种类型

− Overlay:视频叠加区域,其中区域支持位图的加载、背景色更新等功能。− OverlayEx:扩展视频叠加区域,功能与 Overlay 类似,支持位图加载、背景色
更新等。− Cover:视频遮挡区域,其中区域支持纯色块遮挡。− CoverEx:扩展视频遮挡区域,功能与 Cover 类似,支持纯色块遮挡。− OverlayEx/ CoverEx,分别相对于 Overlay/Cover,功能上类似,但是会引入额
外的系统带宽, OverlayEx/ CoverEx 由 VGS 叠加到图像上 , OverlayEx/
CoverEx 区域越大,占用 VGS 的性能就越大,当 VGS 性能不足时,会导致帧
率降低。建议只有当 Overlay/Cover 不支持,或者数量无法满足需求时,再使
用。VGS是视频图形子系统,全称为Video Graphics Sub-System。支持对一幅输入图像进行处理,
如进行缩放、格式转换、解压等处理。正常开发过程中,我们是不需要管vgs这个模块的,但是当我们在性能不是很充裕的时候,
为了节约芯片性能,我们需要用vgs来替代vpss的功能。具体的做法是将vpss组的属性能设置成flase的都设置成false,那么在vpss性能不够时
就会自动用VGA来替代VPSS

3、4种OSD类型各自支持的模块和功能



Argb:透明度、红、绿、蓝
alpha:透明度

4、海思OSD的几个重要概念

(1)区域层次
  区域层次表示区域的叠加级别,层次值越大,表示区域的显示级别越高。当发生重叠时,层次值大的将会覆盖层次值小的。如果是同一级别,则根据区域叠加的,先后顺序,后叠加的将显示在上层。将多个区域叠加到 VPSS 的同一 GROUP时,要求每个区域的层次值不能与叠加到该 GROUP 的其他区域层次值相同,否则区域层次值相同的多个区域中,只能将最后一个叠加的区域叠加到 VPSS 的GROUP 上。将多个层次值相同的区域叠加到同一个 VENC 的通道上时,没有此限制,都能叠加成功。

(2)位图填充(针对 Overlay 和 OverlayEx 有效)
  位图填充是指将位图的内存值填充到区域内存空间中,位图将会从区域的左上角开始填充

  当位图小于区域时,只能填充一部分内存,剩余部分保持原有值;位
图大小等于区域时,将刚好全部填充;当位图大于区域时,位图只能将自身和区
域一样大小的内存信息填充到区域中。

  位图填充支持两种实现方式:其一、用户通过HI_MPI_RGN_SetBitMap 接口将位图数据拷贝至内部显示画布;其二、用户通过 HI_MPI_RGN_GetCanvasInfo 获取内部备份显示画布的地址,直接对该地址数据进行更新,然后调用HI_MPI_RGN_UpdateCanvas 接口将备份显示画布更新为待显示画布,达到实现更新位图数据的目的。

(3)区域公共属性
  用户创建一个区域时,需要设置该属性信息,它包含公共的资源信息。例如,Overlay 包含像素格式,大小和背景色。

(4)通道显示属性
  通道显示属性表明区域在某通道的显示特征。例如, Overlay 的通道显示属性包含显示位置,层次,前景 Alpha,背景 Alpha,还有编码用到的 QP 信息。当通道显示属性中的区域是否显示(bShow)为 TRUE 时,表示显示在该通道中;反之,表示在该通道中存在,但处于隐藏状态。

(5)区域反色
  当区域叠加到视频上显示时,如果视频背景与叠加区域的亮度色度相近,往往会导致背景与区域很难进行区分。区域反色功能即针对这种场景,自适应背景的变化,对区域的亮度色度进行调整,实现区域清晰可见

  区域反色功能支持实现方式如下:通过 VPSS 提供的区域亮度和统计功能。用户可实时获取视频序列中每个待叠加区域背景的亮度统计,然后利用 TDE 的 ROP功能,对区域进行手动的反色处理,最后通过 VPSS 将该反色后的区域叠加到视频上。

(6)区域QP保护
  当区域叠加到视频上进行压缩编码时,为了保证叠加区域的清晰度不因为数据压缩而变模糊,可以单独设定叠加区域部分的压缩特性,即设定 QP 保护功能参数。 QP 保护功能是 Overlay 特有的功能,且仅针对 H.264/H.265 类型编码通道有效,对其它类型无效。

5、海思平台OSD使用方法

(1)用户填充区域属性并创建区域

(2)将该区域指定到具体通道中(如 VENC)

  以上步骤完成区域的创建和使用。用户还可以通过以下操作来控制区域属性以及在某通道的通道显示属性.

(3)通过 HI_MPI_RGN_GetAttr、 HI_MPI_RGN_SetAttr 获取和设置区域属性

(4)通过 HI_MPI_RGN_SetBitMap(仅针对 Overlay)设置区域的位图信息

(5)通过 HI_MPI_RGN_GetDisplayAttr 和 HI_MPI_RGN_SetDisplayAttr 获取和设置区域在某通道(如 VENC 通道)的通道显示属性。

(6)最后用户可以将该区域从通道中撤出(非必须操作),再销毁区域

6、海思平台OSD的API和关键数据结构

区域管理模块主要提供区域资源的控制管理功能,包括区域的创建、销毁,获取与设
置区域属性,获取与设置区域的通道显示属性等。
该功能模块提供以下 MPI:HI_MPI_RGN_Create:创建区域。HI_MPI_RGN_Destroy:销毁区域。HI_MPI_RGN_GetAttr:获取区域属性HI_MPI_RGN_SetAttr:设置区域属性。HI_MPI_RGN_SetBitMap:设置区域位图。HI_MPI_RGN_SetAttachField:设置区域要叠加到的帧/场标志。HI_MPI_RGN_GetAttachField:获取区域要叠加到的帧/场标志。HI_MPI_RGN_AttachToChn:将区域叠加到通道上。HI_MPI_RGN_DetachFromChn:将区域从通道中撤出。HI_MPI_RGN_SetDisplayAttr:设置区域的通道显示属性。HI_MPI_RGN_GetDisplayAttr:获取区域的通道显示属性。HI_MPI_RGN_GetCanvasInfo:获取区域画布信息。HI_MPI_RGN_UpdateCanvas:更新区域画布信息。以上API具体参数及使用方法和一些关键数据结构参考:《HiMPP IPC V2.0 媒体处理软件开发参考.pdf》


二、OSD实验演示和代码框架分析

1、OSD实验演示


在画面中添加了四个水印。

2、OSD代码框架分析

使用SourceInsight软件创建工程,分析源码。源码链接如下:

链接:https://pan.baidu.com/s/1fV8TqpLtbH6YljoNKPRV3Q
提取码:67pc
--来自百度网盘超级会员V5的分享

以sample_venc.c文件为重点进行分心,main主函数也在该文件。

main()SAMPLE_VENC_720P_CLASSIC()SAMPLE_RGN_CreateVideoRegion();HH_OSD_Init(); //实现静态内容HH_OSD_All_Refresh();//实现动态内容


  只要绑定好,剩下的工作都是自动的,因为海思的mpp框架都已经实现好了,内部开启了多个线程进行工作。

三、OSD代码实现分析

1、SAMPLE_RGN_CreateVideoRegion()所做的事

执行该函数所产生的效果:

(1)函数调用关系

SAMPLE_RGN_CreateVideoRegionSAMPLE_RGN_CreateOverlayForVencHI_MPI_RGN_Create 创建区域HI_MPI_RGN_AttachToChn 将区域叠加到通道上SAMPLE_RGN_AddSAMPLE_RGN_CreateOverlayForVencpthread_create(&osd_ThreadId, NULL, SAMPLE_RGN_AddVideoTimestamp, NULL);SAMPLE_RGN_AddVideoTimestamp
HI_S32 SAMPLE_RGN_CreateVideoRegion(HI_VOID)
{HI_U32 u32ChnId        = 0;RGN_HANDLE Handle  = 0;//下面定义的四个变量均与OSD有关HI_U32 coordinate_x  = 0;//描述坐标的变量HI_U32 coordinate_y   = 0;HI_U32 region_with     = 0;//区域的宽HI_U32 region_height = 0;//区域的高u32ChnId     = VENC_RECORD_CHNID;//使用的通道的id,venc的通道0region_with      = 480;// 320 *3 / 2,3表示使用图像的bpp,显存是argb1555,2个字节,故除二region_height  = 320;// 320coordinate_x   = 0;coordinate_y   = 720 - 320;Handle             = VENC_RECORD_LOGO_OSD_HANDLE;//RGN:表示region,即区域SAMPLE_RGN_CreateOverlayForVenc(u32ChnId, Handle, coordinate_x, coordinate_y, region_with, region_height);SAMPLE_RGN_Add( Handle, VENC_RECORD_LOGO_OSD_HANDLE);//上边执行的两个函数实现了一个左下角的区域静态画面//下边的内容实现了一个右下角的动态画面Handle      = VENC_RECORD_TIME_OSD_HANDLE;//区域句柄号。必须是未使用的 Handle 号//取值范围: [0, RGN_HANDLE_MAX)。//24bit的bmp图片,一个像素点就是三字节。一个字节8bitregion_with       = 544;  //18个字体14*32+4*16+16=528, 预留16像素空间 region_height     = 24;  coordinate_x    = 1280-16-260;//根据需求调整位置coordinate_y   = 720 - 24-12;//下面预留12像素空间SAMPLE_RGN_CreateOverlayForVenc(u32ChnId, Handle, coordinate_x, coordinate_y, region_with, region_height);pthread_t osd_ThreadId = 0;pthread_create(&osd_ThreadId, NULL, SAMPLE_RGN_AddVideoTimestamp, NULL);//因为在SAMPLE_RGN_AddVideoTimestamp//中有while(1),如果不开启一个线程,程序将会卡在这里return HI_SUCCESS;
}

(2)RGN(region,区域)画布尺寸计算:以像素为单位。原始图像是bpp24的,每个像素3字节。而画布的图像是ARGB1555的,所以每个像素是2字节。所以画布每一行的像素数是图像宽度*3/2 。

(3)整个图像的坐标系是左上角是(0,0)点,宽度方向是x,高度方向是y

2、前景和背景透明

(1)所谓前景foreground,就是图片中显示的内容部分;所谓背景background,就是图片中没有内容的部分。

(2)前景和背景的透明度范围都是0-128,其中0代表全透明,128代表全不透明

(3)前景和背景透明度可以同时设置,各自起作用,互不影响。

(4)stRgnAttr.unAttr.stOverlay.u32BgColor是RGN的画布(canvas,等同于LCD显示时的显存fb)的背景颜色。也就是画布中没有被填充的部分默认显示的颜色。

3、RGN(region)通道属性分析

HI_S32 SAMPLE_RGN_CreateOverlayForVenc(HI_U32 u32ChnId, RGN_HANDLE Handle, HI_U32 u32X, HI_U32 u32Y, HI_U32 u32Width, HI_U32 u32Height)
{//printf("u32X  = %d u32Y = %d \n",u32X,u32Y);HI_S32 s32Ret = 0;MPP_CHN_S stChn;RGN_ATTR_S stRgnAttr;RGN_CHN_ATTR_S stChnAttr;/* Add cover to vpss group */stChn.enModId  = HI_ID_VENC;stChn.s32DevId = 0;stChn.s32ChnId = u32ChnId/*0*/;stRgnAttr.enType = OVERLAY_RGN;stRgnAttr.unAttr.stOverlay.enPixelFmt       = PIXEL_FORMAT_RGB_1555;//像素格式stRgnAttr.unAttr.stOverlay.stSize.u32Width  = u32Width; //16x, value=bmp's Widthx3/2stRgnAttr.unAttr.stOverlay.stSize.u32Height = u32Height; //16x//stRgnAttr.unAttr.stOverlay.u32CanvasNum = 4; //Max:6stRgnAttr.unAttr.stOverlay.u32BgColor       = 0xffffffff;//背景色s32Ret = HI_MPI_RGN_Create(Handle, &stRgnAttr);if (s32Ret != HI_SUCCESS){printf("--@@_1 HI_MPI_RGN_Create failed! s32Ret: 0x%x.\n", s32Ret);return s32Ret;}//    以下的内容是进行通道属性的设置stChnAttr.bShow  = HI_TRUE ; //region是否显示stChnAttr.enType = OVERLAY_RGN;//OSD类型stChnAttr.unChnAttr.stOverlayChn.stPoint.s32X = u32X; //区域的X坐标stChnAttr.unChnAttr.stOverlayChn.stPoint.s32Y = u32Y; //区域的y坐标stChnAttr.unChnAttr.stOverlayChn.u32BgAlpha   = 0; //背景透明度,透明度范围0-128stChnAttr.unChnAttr.stOverlayChn.u32FgAlpha   = 128;//前景透明度stChnAttr.unChnAttr.stOverlayChn.u32Layer     = 4 /*7 Handle*/;//区域层次// below para must keepstChnAttr.unChnAttr.stOverlayChn.stQpInfo.bAbsQp        = HI_FALSE ;//是否开启qp区域保护stChnAttr.unChnAttr.stOverlayChn.stQpInfo.s32Qp        = 0;stChnAttr.unChnAttr.stOverlayChn.stQpInfo.bQpDisable   = HI_FALSE ;// 区域反色功能相关的stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Height = 48/*16 * (Handle % 2 + 1)*/;stChnAttr.unChnAttr.stOverlayChn.stInvertColor.stInvColArea.u32Width  = 48/*16 * (Handle % 2 + 1)*/;stChnAttr.unChnAttr.stOverlayChn.stInvertColor.u32LumThresh = 128;stChnAttr.unChnAttr.stOverlayChn.stInvertColor.enChgMod = LESSTHAN_LUM_THRESH;stChnAttr.unChnAttr.stOverlayChn.stInvertColor.bInvColEn = HI_FALSE ;s32Ret = HI_MPI_RGN_AttachToChn(Handle, &stChn, &stChnAttr);//将区域叠加到通道上if (s32Ret != HI_SUCCESS){printf("HI_MPI_RGN_AttachToChn failed! s32Ret: 0x%x.\n", s32Ret);return s32Ret;}return HI_SUCCESS;
}

4、RGN(region)内容填充

HI_S32 SAMPLE_RGN_Add(unsigned int Handle,int Type)
{//printf("-------------------%s add rgn %d --------------------\n",__func__,Type);HI_S32 s32Ret = HI_SUCCESS;RGN_ATTR_S stRgnAttrSet;RGN_CANVAS_INFO_S stCanvasInfo;BITMAP_S stBitmap;SIZE_S stSize;/* Photo logo */s32Ret = HI_MPI_RGN_GetAttr(Handle/*VencOsdHandle*/, &stRgnAttrSet);//获取区域属性if (HI_SUCCESS != s32Ret){printf("HI_MPI_RGN_GetAttr failed! s32Ret: 0x%x.\n", s32Ret);return s32Ret;}s32Ret = HI_MPI_RGN_GetCanvasInfo(Handle/*VencOsdHandle*/, &stCanvasInfo);//获取区域画布信息if (HI_SUCCESS != s32Ret){printf("HI_MPI_RGN_GetCanvasInfo failed! s32Ret: 0x%x.\n", s32Ret);return s32Ret;}stBitmap.pData   = (void*)stCanvasInfo.u32VirtAddr;//位图数据stSize.u32Width  = stCanvasInfo.stSize.u32Width;//位图宽度stSize.u32Height = stCanvasInfo.stSize.u32Height;//位图高度s32Ret = SAMPLE_RGN_UpdateCanvas(Type, &stBitmap, HI_TRUE , 0x0000, &stSize, stCanvasInfo.u32Stride,stRgnAttrSet.unAttr.stOverlayEx.enPixelFmt);if (HI_SUCCESS != s32Ret)//将要显示的内容丢到备份的内存中,等待使用{printf("SAMPLE_RGN_UpdateCanvas failed! s32Ret: 0x%x.\n", s32Ret);return s32Ret;}s32Ret = HI_MPI_RGN_UpdateCanvas(Handle/*VencOsdHandle*/);//更新区域画布信息if (HI_SUCCESS != s32Ret)//将备份内存中的数据直接刷到画布去显示{printf("HI_MPI_RGN_UpdateCanvas failed! s32Ret: 0x%x.\n", s32Ret);return s32Ret;}return HI_SUCCESS;
}

(1)程序中会有一个RGB888向ARGB1555转的过程。
(2)BMP图片中存储图像的像素顺序,和RGN的canvas里像素顺序是不同的。

这部分内容涉及到了bmp图片的解析以及如何显示,若是之前未了解过该方面的知识,可参考我的《BMP图片显示原理》

5、动态刷新BMP


  将上图中这些带有数字的图片不断切换显示,形成数字变化的效果。

HI_VOID* SAMPLE_RGN_AddVideoTimestamp(HI_VOID* p)//真正网络摄像机一般会从服务器获取时间而非本地
{HI_S32 s32Ret = HI_SUCCESS;time_t timep;struct tm *pLocalTime;HI_U8 seconds = 80;RGN_HANDLE Handle;Handle = VENC_RECORD_TIME_OSD_HANDLE;while (1){time(&timep);pLocalTime = localtime(&timep);//转换成当前时间if (seconds == pLocalTime->tm_sec){usleep(150*1000);//增加循环的时间,屏幕上的内容是每过一秒刷新一次的continue;} else {seconds = pLocalTime->tm_sec;}s32Ret = SAMPLE_RGN_Add( Handle, VENC_RECORD_TIME_OSD_HANDLE);//关键在这if (HI_SUCCESS != s32Ret){printf("SAMPLE_RGN_Add line %d  failed! s32Ret: 0x%x.\n",__LINE__, s32Ret);break;}}pthread_detach(pthread_self());//分离线程return 0;
}

总结:左下角的就是单bmp图片OSD,静态的;右下角是多BMP图片组合,且动态刷新显示。

6、小结——整体函数调用层次

SAMPLE_RGN_CreateVideoRegionSAMPLE_RGN_CreateOverlayForVencHI_MPI_RGN_Create //创建一个区域HI_MPI_RGN_AttachToChn //将区域叠加到通道上SAMPLE_RGN_AddHI_MPI_RGN_GetAttr //获取区域属性HI_MPI_RGN_GetCanvasInfo //获取区域画布信息SAMPLE_RGN_UpdateCanvas //将要显示的内容丢到备份的内存中,等待使用SAMPLE_RGN_CreateSurfaceByCanvas //解析BMP数据,创建要显示的内容SAMPLE_RGN_LoadCanvasEx 加载数据SAMPLE_RGN_LoadBMPCanvas_Logo//获取要显示的logo数据GetBmpInfo //得到bmp图片的信息mallocfseekfreadOSD_MAKECOLOR_U16 //RGB888向ARGB1555转的过程              HI_MPI_RGN_UpdateCanvas //更新区域画布信息SAMPLE_RGN_CreateOverlayForVencpthread_create(&osd_ThreadId, NULL, SAMPLE_RGN_AddVideoTimestamp, NULL);SAMPLE_RGN_AddVideoTimestampSAMPLE_RGN_AddHI_MPI_RGN_GetAttr //获取区域属性HI_MPI_RGN_GetCanvasInfo //获取区域画布信息SAMPLE_RGN_UpdateCanvas //将要显示的内容丢到备份的内存中,等待使用SAMPLE_RGN_CreateSurfaceByCanvas //解析BMP数据,创建要显示的内容SAMPLE_RGN_LoadCanvasEx //加载数据SAMPLE_RGN_LoadBMPCanvas_TimeSmap//通过动态刷新bmp图片显示时间

注:本文章参考了《朱老师物联网大讲堂》课程笔记,并结合了自己的实际开发经历以及网上他人的技术文章,综合整理得到。如有侵权,联系删除!水平有限,欢迎各位在评论区交流。

海思平台OSD的实现(1)相关推荐

  1. 第8季1:海思平台OSD的理论基础

    以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除. 一.OSD概述 1.区域管理模块 "OSD"是"on screen display"的缩写,即在 ...

  2. 海思平台OSD的实现(2)

    目录 一.字库字符实现OSD 1.原理讲解 2.代码框架分析 二.字库字符实现OSD源码解析 一.字库字符实现OSD 1.原理讲解   位图填充支持两种实现方式:其一.用户通过HI_MPI_RGN_S ...

  3. 【交叉编译】海思平台和安霸平台交叉编译

    海思平台 板端编译首先需要配置系统的NFS,挂载NFS服务器:然后安装ubuntu下的交叉编译环境(3516A和3518为例):登录板端:板端编译(需要修改相关的makefile文件):板端运行: 一 ...

  4. c++ opencv mat_海思平台OpenCV编译与进一步裁剪

    OpenCV是计算机视觉算法开发常用的工具.如果我们需要在嵌入式设备上运行opencv,那么就需要交叉编译,将它移植到对应平台上.但是有些嵌入式平台的存储空间有限,能节省1MB也有相当大的作用.Ope ...

  5. Android STB 海思平台调试

    文章目录 一.产品参数 1.1 Hi3798MV100 1.2 Hi3798MV300 二.网络类&播放类 三.系统类 3.1 输出相关 3.2 CEC 3.3 杜比 3.4 IGMP 3.5 ...

  6. 海思平台HI35XX系列内存设置

    海思平台的内存分为两部分,一部分给系统使用,另外的一部分给多媒体使用.可以通过cat /proc/meminfo查看系统内存和cat /proc/media-mem 查看多媒体内存使用情况. /pro ...

  7. 海思平台gpio模拟spi驱动总结

    1. 海思平台gpio如何映射到编号 #define GPIO_TO_PIN(bank, gpio) (8 * (bank) + (gpio)) 海思gpio引脚每组总是从0~7,而且引脚从头都有唯一 ...

  8. YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(中)

    YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(上) YOLO系列(v1~v3)的学习及YOLO-Fastest在海思平台的部署(中) YOLO系列(v1~v3)的学习及Y ...

  9. 海思平台的视频输入(VI)模块的介绍(以hi3559av100为例)

    当前是从海思平台的mpp角度理解VI这一部分的. 视频输入(VI)模块实现的功能:通过 MIPI Rx(含 MIPI 接口.LVDS 接口和 HISPI 接口),SLVS-EC,BT.1120,BT. ...

最新文章

  1. 如何理解Memory leak
  2. 贪吃蛇游戏(java)
  3. Chrome浏览器兼容性 检测工具 (chrome插件)
  4. python rgb led控件_用树莓派实现RGB LED的颜色控制——Python版本
  5. HTML5超链接和多媒体,IT兄弟连 HTML5教程 多媒体应用 创建图像和链接
  6. Linux lame无法识别WAV,Lame框架 MP3与WAV互转
  7. Java学习个人备忘录之文档注释
  8. 格雷码与二进制之间转换及VHDL实现
  9. the JDBC Driver has been forcibly unregistered.
  10. 功率因素校正(PFC)技术!
  11. Kali-WIFI攻防(三)----wifite自动化WEP/WPA破解工具
  12. un-app部署h5项目到普通云服务器--域名解析--OOS对象存储
  13. php错误测试,对 PHP 错误进行测试
  14. 【1 - 决策树 - 原理部分】菜菜sklearn机器学习
  15. 加入域时提示“不能访问网络位置” 域
  16. 【Shell 脚本速成】01、编程语言与 Shell 脚本介绍
  17. Qomo OpenProject Field Test 3发布!
  18. DHCPv6原理与配置
  19. 网络高手看过来:为什么我用htons转换网络节序时会发生错误?200元大洋伺候...
  20. 论文图表配色小技巧和excel图表如何导出高清色彩不失真tiff格式图片方法分享

热门文章

  1. Symantec Backup Exec 2012 Agent For Linux安装
  2. 百度AI图像处理—人体分析(人像切割—AI抠图)调用教程(基于Python3-附Demo)
  3. 《Java 后端面试经》Java 基础篇
  4. node.js调试 BY:色拉油啊油
  5. Android太太太太太卷了,累了,android开发入门与实战体验
  6. Sleep()简析 和Sleep(0)的妙用
  7. 【Unity】DnSpy断点调试Unity已发行游戏的dll
  8. 大V吐槽微信电脑版:视频、表情占满C盘
  9. mac上如何将python2.7修改为python3
  10. php 5 php.ini中文注释