再次研究videocapX视频摄像头控件

By admin at 2018-10-06 • 2人收藏 • 4679人看过

上次想要调用这个控件来显示视频,当时失败了.就放弃了

10.1出去玩了一圈之后,突然觉得应该再研究一下,感觉思路清晰了,应该可以成功.

下面记录下自己一点一点是怎么想的和实现的过程, 给自己一个研究下去的动力.


首先,去百度上搜了破解版(这个是收费控件), 里面包含了一个破解的软件

1, 注册了原来文件夹里的videocapX.ocx . 

2,点开自带的示例app ,发现提示试用30已经过期...必须注册....

3,双击破解软件,破解完成后, 重新注册了破解之后的这个控件,

4,再次点开示例的app发现不提示了,而且也打开了视频设置界面, 勾选里面的time显示在视频那个选项之后,视频可以很好的显示了.


这样就可以开始用aardio调用ocx了.


下面的试验我上传到了网盘里:

链接:https://pan.baidu.com/s/1tbfK9ZUnK58cRLCETrhxQA 

提取码:nb1s


16 个回复 | 最后更新于 2022-04-25
2018-10-06   #1

对了,首先记录一下,怎么去查看com控件(ocx和dll)的GUID码的:

我这里利用了一个名字为ComRaider的工具, 使用方法很简单百度下即可.

言归正传↓


我的原则是先测试功能,再封装为库, 所以:

首先创建了一个winform窗口

然后调用控件的aboutbox()属性

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=897;bottom=675)
winform.add(
button={cls="button";text="Button";left=5;top=626;right=164;bottom=668;z=1};
button2={cls="button";text="Button";left=179;top=625;right=338;bottom=667;z=2}
)
/*}}*/

import console
console.open()

var cvx =  winform.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}");

winform.button.oncommand = function(id,event){
	cvx._object.AboutBox()
}

winform.button2.oncommand = function(id,event){
	
	console.log("音频数量:", cvx._object.GetAudioDeviceCount() )
	for(i=0;cvx._object.GetAudioDeviceCount()-1;1){
		console.log( cvx._object.GetAudioDeviceName(i) )
	
	}
	
}

winform.show() 
win.loopMessage();

image.png

可以看到运行后得到了想要的东西.

2018-10-07   #2

解决了.

群里大神提供了个测试代码, 在需要设置的属性名前面加上set关键词

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio form";right=759;bottom=469)
mainForm.add()
/*}}*/

mainForm.enableDpiScaling();
mainForm.show();
import console
var VideoCapX1 = mainForm.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}")
var cap = VideoCapX1._object
cap.GetVideoDeviceCount()
cap.GetVideoDeviceName(0)
cap.setVideoDeviceIndex(0)
cap.setPreviewScale(true)
cap.setConnected(true)
console.varDump(cap.GetVideoCaps()[1])
cap.setPreview(true)


return win.loopMessage();


我猜测:

image.png

2018-10-08   #3

今天测试sv4000这个摄像头,翻转是可以使用的.

下面是四通道显示 

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=897;bottom=675)
winform.add(
button={cls="button";text="about";left=5;top=626;right=164;bottom=668;z=1};
button2={cls="button";text="audio";left=179;top=626;right=276;bottom=668;z=2};
button3={cls="button";text="vedio";left=287;top=626;right=384;bottom=668;z=3};
button4={cls="button";text="version";left=783;top=623;right=880;bottom=665;z=4};
button5={cls="button";text="flip";left=411;top=626;right=508;bottom=668;z=6};
button6={cls="button";text="show";left=782;top=509;right=879;bottom=551;z=7};
button7={cls="button";text="show";left=783;top=559;right=880;bottom=601;z=8};
custom1={cls="custom";text="自定义控件";left=0;top=0;right=299;bottom=256;z=5};
custom2={cls="custom";text="自定义控件";left=343;top=0;right=642;bottom=256;z=9};
custom3={cls="custom";text="自定义控件";left=7;top=307;right=306;bottom=563;z=10};
custom4={cls="custom";text="自定义控件";left=343;top=310;right=642;bottom=566;z=11}
)
/*}}*/

import console
console.open()
var cvx = {};
for(i=1;4;1){
	cvx[i] =  winform["custom"++i].createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}");
}

winform.button.oncommand = function(id,event){
	cvx[1]._object.AboutBox()
}

winform.button2.oncommand = function(id,event){
	
	console.log("音频数量:", cvx[1]._object.GetAudioDeviceCount() )
	for(i=0;cvx[1]._object.GetAudioDeviceCount()-1;1){
		console.log( cvx[1]._object.GetAudioDeviceName(i) )
	
	}
	
}

winform.button3.oncommand = function(id,event){
	console.log("摄像头数量:", cvx[1]._object.GetVideoDeviceCount() )
	for(i=0;cvx[1]._object.GetVideoDeviceCount()-1;1){
		console.log( cvx[1]._object.GetVideoDeviceName(i) )
	
	}
	for(i=1;4;1){
		cvx[i]._object.setVideoDeviceIndex(i-1);
		cvx[i]._object.setPreviewScale(true)
		cvx[i]._object.setConnected(true);
		cvx[i]._object.setPreview(true);	
	
	}

}

winform.button4.oncommand = function(id,event){
	console.log( cvx[1]._object.getVideoFlip() )
}

winform.button5.oncommand = function(id,event){
	console.log( cvx[1]._object.setVideoFlip(-3) );
}

winform.button6.oncommand = function(id,event){
	cvx[1]._object.ShowVideoSourceDlg();
}

winform.button7.oncommand = function(id,event){
	cvx[1]._object.ShowVideoFormatDlg()
}

winform.show() 
win.loopMessage();

blob.png

2018-10-13   #4

利用网盘里那个1.6.0版本+lic那个文件,注册就可以变为已注册版本了

2018-10-24   #5

给视频控件加个蒙版: 实现蒙版上面画线 (给视频画线)

image.png

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=491;bottom=483;bgcolor=16777215)
winform.add(
button={cls="button";text="Button";left=283;top=368;right=473;bottom=447;z=3};
picturebox={cls="picturebox";left=57;top=69;right=380;bottom=318;bgcolor=15780518;db=1;dl=1;dr=1;dt=1;z=2};
plus={cls="plus";left=57;top=69;right=380;bottom=318;bgcolor=255;db=1;dl=1;dr=1;dt=1;notify=1;transparent=1;z=1}
)
/*}}*/

var VideoCapX1 = winform.picturebox.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}")
var cap = VideoCapX1._object
cap.GetVideoDeviceCount()
cap.GetVideoDeviceName(0)
cap.setVideoDeviceIndex(0)
cap.setPreviewAudio(0);
cap.setPreviewScale(true)
cap.setConnected(true)
cap.setPreview(true)

//自绘plus背景
winform.plus.onDrawBackground = function(graphics,rc,backgroundColor,clr){
    var pen = gdip.pen(backgroundColor,2);
	graphics.drawLine(pen,(rc.right-rc.left)/2,rc.top,(rc.right-rc.left)/2,rc.bottom);
	pen.delete()
	return true;//返回true阻止绘制默认背景
}

winform.plus.orphanWindow(true);

winform.show() 
win.loopMessage();


2018-10-25   #6

根据鼠标点击位置动态画线:

这里注意: 由于picturebox被videocapx使用了,鼠标左键单击信息貌似被屏蔽了,拦截不到, 但是下面的消息可以使用.

var xx,yy;
mainForm.picturebox.wndproc = function(hwnd,message,wParam,lParam){
		select(message) {
		case 0x210/*_WM_PARENTNOTIFY*/ {
			xx,yy = win.getMessagePos(lParam);
			//通知plus重画	
			mainForm.plus.redraw()
		}
		else {
			
		}
	}
}
//自绘plus背景
mainForm.plus.onDrawBackground = function(graphics,rc,backgroundColor,clr){
    var pen = gdip.pen(backgroundColor,2);
    if(xx){
    	graphics.drawLine(pen,xx,rc.top,xx,rc.bottom);
	
    }else {
    graphics.drawLine(pen,(rc.right-rc.left)/2,rc.top,(rc.right-rc.left)/2,rc.bottom);
	
    }
    
	pen.delete()
	return true;//返回true阻止绘制默认背景
}
mainForm.plus.orphanWindow(true);



画多重线方法:

var mtab = {};
var xx,yy;

mainForm.picturebox.wndproc = function(hwnd,message,wParam,lParam){
	select(message) {
		case 0x210 {
			xx,yy = win.getMessagePos(lParam)
			table.push(mtab,{xx;yy})
			if(#mtab >1){
				table.shift(mtab,1);
			}
			mainForm.plus.redraw()
		}
		else {
		}
	}
}
//自绘plus背景
mainForm.plus.onDrawBackground = function(graphics,rc,backgroundColor,clr){
    var pen = gdip.pen(backgroundColor,1);
   if(mtab){
       for(i=1;#mtab;1){
       	graphics.drawLine(pen,mtab[i][1],mtab[i][2],rc.right,mtab[i][2]+(rc.width()-mtab[i][1])*math.tan(math.rad(18)));
		graphics.drawLine(pen,mtab[i][1],mtab[i][2],rc.left,mtab[i][2]-mtab[i][1]*math.tan(math.rad(18)));
        graphics.drawLine(pen,rc.left,mtab[i][2],rc.right,mtab[i][2]);      
       
       }
   }
	pen.delete()
	return true;//返回true阻止绘制默认背景
}
mainForm.plus.orphanWindow(true);


2018-11-11   #7

鼠标点击画十字可调整角度线:

画板端代码:

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=740;bottom=684)
winform.add(
picturebox={cls="picturebox";left=0;top=0;right=741;bottom=685;db=1;dl=1;dr=1;dt=1;z=1};
plus={cls="plus";left=0;top=0;right=741;bottom=685;bgcolor=255;db=1;dl=1;dr=1;dt=1;z=2}
)
/*}}*/

arg={...};
parent = table.shift(arg);

var mtab = {};
var xx,yy;

try{
	var cvx =  winform.picturebox.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}");
	cvx._object.setVideoDeviceIndex(arg[1].index);
	cvx._object.setPreviewScale(true)
	cvx._object.setPreviewAudio(0);
	cvx._object.setConnected(true);
	cvx._object.setPreview(true);
	cvx._object.setVideoFlip(arg[1].flip);
	winform.text = arg[1].title;
}
catch(e){
	winform.msgboxErr("摄像头打开失败")
}


winform.picturebox.wndproc = function(hwnd,message,wParam,lParam){
    if(arg[1].Lineopen){
    	select(message) {
			case 0x210 {
				xx,yy = win.getMessagePos(lParam)
				table.push(mtab,{xx;yy})
				if(#mtab >1){
					table.shift(mtab,1);
				}
				winform.plus.redraw()
			}
			else {
			}
		
    	}
	}
}
//自绘plus背景
winform.plus.onDrawBackground = function(graphics,rc,backgroundColor,clr){
    if(arg[1].Lineopen){
    	var pen = gdip.pen(backgroundColor,arg[1].lineWidth);
   		if(mtab){
       		for(i=1;#mtab;1){
       			if((arg[1].angle == "90") or (arg[1].angle=="270")){
       				graphics.drawLine(pen,mtab[i][1],rc.top,mtab[i][1],rc.bottom);
       				graphics.drawLine(pen,rc.left,mtab[i][2],rc.right,mtab[i][2]);
       			}else {
       				graphics.drawLine(pen,mtab[i][1],mtab[i][2],rc.right,mtab[i][2]+(rc.width()-mtab[i][1])*math.tan(math.rad(arg[1].angle)));
					graphics.drawLine(pen,mtab[i][1],mtab[i][2],rc.left,mtab[i][2]-mtab[i][1]*math.tan(math.rad(arg[1].angle)));
        			graphics.drawLine(pen,rc.left,mtab[i][2],rc.right,mtab[i][2]);
       			}
       			
       			      
       		
       		}
   		}
		pen.delete()
    }

	return true;//返回true阻止绘制默认背景
}
winform.plus.orphanWindow(true);


winform.show();
win.loopMessage();
return winform;

主界面端代码:

import win.ui;
/*DSG{{*/
mainForm = win.form(text="摄像头V2";right=385;bottom=147)
mainForm.add(
button={cls="button";text="开启";left=255;top=23;right=371;bottom=97;z=1};
checkbox={cls="checkbox";text="开启画线";left=26;top=117;right=110;bottom=135;z=4};
edit={cls="edit";text="18";left=174;top=117;right=232;bottom=141;align="center";border=1;num=1;z=5};
flip={cls="combobox";left=24;top=71;right=232;bottom=97;edge=1;items={"不翻转";"上下翻转";"左右镜像";"全镜像"};mode="dropdown";z=3};
static={cls="static";text="画线角度:";left=109;top=116;right=167;bottom=140;align="right";center=1;transparent=1;z=6};
sxtlist={cls="combobox";left=26;top=23;right=232;bottom=49;edge=1;items={};mode="dropdown";z=2};
trackbar={cls="trackbar";left=248;top=107;right=371;bottom=137;max=8;min=1;z=7}
)
/*}}*/

import com.activeX;

if(!io.exist("\res\videocapx.lic")){
    	string.save("\res\videocapx.lic",$"\res\videocapx.lic");	
	}
if(!io.exist("\res\videocapx.ocx")){
    string.save("\res\videocapx.ocx",$"\res\videocapx.ocx");	
}
com.activeX.regsvr32As("\res\videocapx.ocx")
var sxtobj = com.CreateObject("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}")

for(i=0;sxtobj.GetVideoDeviceCount()-1;1){
		 mainForm.sxtlist.add(sxtobj.GetVideoDeviceName(i))
	
}
mainForm.sxtlist.selIndex = 1;
//mainForm.trackbar.pos = 1;

mainForm.button.oncommand = function(id,event){
	var flipmode;
	select(mainForm.flip.text) {
		case "不翻转" {
			flipmode = 0;
		}
		case "上下翻转" {
			flipmode = -2;
		}
		case "左右镜像" {
			flipmode = -1;
		}
		case "全镜像" {
			flipmode = -3;
		}
		else {
		}
	}
    var frmChild = mainForm.loadForm("\dlg\sxt.aardio",{index=mainForm.sxtlist.selIndex-1;flip=flipmode;title=mainForm.sxtlist.text;Lineopen=mainForm.checkbox.checked;angle=mainForm.edit.text;lineWidth=mainForm.trackbar.pos});
	frmChild.show();	
}

mainForm.show();
return win.loopMessage();

image.png

2019-01-16   #8

摄像头上显示按键和图像:

不用.orphanWindow(true)方式

其实就类似于两个控件重叠了, 两个控件又都有自己的事件, 那么要显示另外一个控件的事件,就需要指定父窗体, 然后就可以自动调用事件了.


在aardio里创建工程选项里有一个[高级界面]->里面的[播放器] 那个里面其实就用到了这个,

可以看到右上角又个搜索框, 搜索框里又有个button这样的搜索图标, 这个图标可以点击进行搜索

 那么要想点击这个图标, 就需要指定这个搜索图标的父窗体为下面的那个控件

于是:

随便拖拉一个plus, 设置好按钮的点击样式, 什么都不要做, 然后设置,这个plus的parent为picturebox即可.

import fonts.fontAwesome;
import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=812;bottom=577;bgcolor=16777215)
winform.add(
picturebox={cls="picturebox";left=22;top=23;right=710;bottom=374;bgcolor=15780518;db=1;dl=1;dr=1;dt=1;z=1};
plus={cls="plus";left=370;top=305;right=527;bottom=362;bgcolor=65280;z=3};
plus2={cls="plus";text="预览按钮效果";left=559;top=308;right=701;bottom=363;bgcolor=-8355840;font=LOGFONT(h=-16;name='FontAwesome';charset=0);notify=1;z=2};
plus3={cls="plus";left=272;top=5;right=278;bottom=474;bgcolor=255;z=4}
)
/*}}*/

winform.plus2.skin({
	background={
		active=0xFFCF8E2D;
		default=0xFF008080;
		hover=0xFF00C2C2
	};

})

winform.plus.skin({
	background={
		active=0xFFCF8E2D;
		default=0xFF008080;
		hover=0xFF00C2C2
	};

})

var VideoCapX1 = winform.picturebox.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}")
var cap = VideoCapX1._object
cap.GetVideoDeviceCount()
cap.GetVideoDeviceName(0)
cap.setVideoDeviceIndex(0)
cap.setPreviewAudio(0);
cap.setPreviewScale(true)
cap.setConnected(true)
cap.setPreview(true)

//自绘plus背景
/*
winform.plus3.onDrawBackground = function(graphics,rc,backgroundColor,clr){
    var pen = gdip.pen(backgroundColor,2);
    graphics.drawLine(pen,(rc.right-rc.left)/2,rc.top,(rc.right-rc.left)/2,rc.bottom);
    pen.delete()
    return true;//返回true阻止绘制默认背景
}
*/

winform.plus2.oncommand = function(id,event){
	winform.msgbox("点击了")
}

winform.plus3.setParent(winform.picturebox)

winform.plus2.setParent(winform.picturebox)
winform.plus.setParent(winform.picturebox)

winform.show() 
win.loopMessage();

image.png


2019-05-24   #9

实现: 鼠标移动到摄像头区域 按钮 显示, 移出就隐藏功能

import win.ui;
/*DSG{{*/
mainForm = win.form(text="aardio工程37";right=959;bottom=591)
mainForm.add(
picturebox={cls="picturebox";left=94;top=38;right=854;bottom=508;bgcolor=12632256;db=1;dl=1;dr=1;dt=1;z=1};
plus={cls="plus";left=378;top=367;right=535;bottom=424;bgcolor=65280;db=1;dl=1;dr=1;z=3};
plus2={cls="plus";text="预览按钮效果";left=567;top=370;right=709;bottom=425;bgcolor=-8355840;db=1;dr=1;font=LOGFONT(h=-16;name='FontAwesome';charset=0);hide=1;notify=1;z=2}
)
/*}}*/

mainForm.plus2.skin({
    background={
        active=0xFFCF8E2D;
        default=0xFF008080;
        hover=0xFF00C2C2
    };
 
})
 
mainForm.plus.skin({
    background={
        active=0xFFCF8E2D;
        default=0xFF008080;
        hover=0xFF00C2C2
    };
 
})
 
var VideoCapX1 = mainForm.picturebox.createEmbed("{912FB007-DD9A-11D3-BD8D-DAAFCB8D9378}")
var cap = VideoCapX1._object
cap.GetVideoDeviceCount()
cap.GetVideoDeviceName(0)
cap.setVideoDeviceIndex(0)
cap.setPreviewAudio(0);
cap.setPreviewScale(true)
cap.setConnected(true)
cap.setPreview(true)

mainForm.plus2.oncommand = function(id,event){
	mainForm.msgbox("哈哈哈")
}

//显示按钮在摄像头之上
mainForm.plus2.setParent(mainForm.picturebox)
mainForm.plus.setParent(mainForm.picturebox)


mainForm.show();
//必须加载鼠标事件库
import mouse;
return win.loopMessage(
	//消息循环里判断鼠标位置
	function(){
            var x,y = mouse.getPos()
			if( ::PtInRect(mainForm.picturebox.getRect(true),x,y) ) mainForm.plus2.hide = false;
			else {
				mainForm.plus2.hide = true;
			}
	}
);

写在消息循环里不知道会不会影响界面刷新效率?


更新:

增加鼠标右键点击才能显示按钮, 移出摄像头就消失功能

mainForm.picturebox.wndproc = function(hwnd,message,wParam,lParam){
	console.log(hwnd,message,wParam,lParam)
	if(message == 123){
		var x,y = win.getMessagePos(lParam)
		var xx,yy = win.toClient(mainForm.picturebox.hwnd,x,y)
		mainForm.plus2.setPos(xx,yy);
		mainForm.plus2.hide = false;
	}
	
	//无返回值则继续调用默认回调函数
}

import mouse;
return win.loopMessage(
    //消息循环里判断鼠标位置
    function(){
            var x,y = mouse.getPos();
            if( !::PtInRect(mainForm.picturebox.getRect(true),x,y) )
            {
                mainForm.plus2.hide = true;
            }
    }
);


2021-05-26   #10

全屏功能:

cap.PreviewFullScreen = true

这样的全屏比custom直接全屏更好, 鼠标左键点击屏幕会自动退出全屏.

2021-05-26   #11

文字字幕:

cap. SetTextOverlay(0,"hello aardio video",0,0,"Consolas",14,0x7373C6,-1 )

image.png

2021-05-26   #12

图片贴图到摄像头: 支持jpg,gif,bmp

var bmp = com.picture.loadBitmap("C:\Users\Administrator\Desktop\2.gif");
cap.SetBitmapOverlay((tonumber(bmp)),100, 100, 0xffffff,0 );

image.png

2021-06-16   #13

2021-08-12   #14

高拍仪有玩过吗?


2022-04-25   #15

SetTextOverlay() 添加中文字幕乱码怎么解决?string.toUnicode  和string.fromto()几种编码转换都试了下,还是乱码

2022-04-25   #16

回复#16 @nod32 :

这里提供的是比较老的ocx , 下载最新版试试, 或者用官方例子, 如果官方的也不行, 那就是不支持中文 , 那么还可以变通下, 

  1. 自己动态生成也透明文字图片, 贴图片.

  2. aardio里贴个plus到摄像头上面,winform.plus.orphanWindow(true)透明,下面图片采用这个方式

  3. 采用其他摄像头ocx, 比如visio那个

image.png

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...