要做一个视频录制的功能
使用的是opencv+vs2010,基于对话框的MFC
想要用一个按钮实现录制的开始和结束
就是点击该按钮,开始录制,再点击就结束录制。期间按钮的名字也要变化请问各位大大该怎么做呢?MFCOpenCV按钮事件
使用的是opencv+vs2010,基于对话框的MFC
想要用一个按钮实现录制的开始和结束
就是点击该按钮,开始录制,再点击就结束录制。期间按钮的名字也要变化请问各位大大该怎么做呢?MFCOpenCV按钮事件
CString str = (CButton*)GetDlgItem(BUTTON_ID)->GetWindowText();
if(str == "暂停")
GetDlgItem(BUTTON_ID)->SetWindowText(_T("继续"));
else
GetDlgItem(BUTTON_ID)->SetWindowText(_T("暂停"));
当按下开始录制后按钮可以变为save,但此时画面冻结,程序不响应
强制关掉后相应文件夹有录制的视频,但视频很慢并且播放器没有视频长度及进度条
int state=0;
CvVideoWriter* videoWriter; void CMytestDlg::OnBnClickedButtonTape()
{
if(state==0)
{
state=1;
CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
pWnd_video->SetWindowText(_T("Save"));
//指定视频中每一帧的大小
CvSize size = cvSize(width,height);
//需要初始化一个写视频文件的对象,这里注意使用的编解码器格式是MJPG 帧率设置为5
videoWriter =
cvCreateVideoWriter("../videotap/test.avi",CV_FOURCC('M','J','P','G'),5,size);
}
else
{
state=0;
CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
pWnd_video->SetWindowText(_T("Videotape"));
}
//每隔200ms,从摄像头中取出一帧
while(cvWaitKey(200))
{
if(state==0)
break;
//得到从摄像头中获取的帧
IplImage* frame = cvQueryFrame(capture1);
//将帧写入视频文件中
cvWriteFrame(videoWriter,frame);
}
}
保存时打开定时器,停止则关闭定时器
这样界面应该也不会卡死
step1:在XXXDlg.cpp文件中定义1个bool全局变量和子线程函数
UINT threadfun1(LPVOID lpParameter)
{
while (全局变量)
{
WaitForSingleObject(g_hEvent,INFINITE);
//--------音频录制代码放在这里---------//
SetEvent(g_hEvent);
} return 0;
}
step2:在你的按钮响应函数里面启动、关闭等线程管理功能
void XXXDlg::OnBnClickedButton1()
{
全局变量 = !全局变量;//逻辑控制
g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
SetEvent(g_hEvent); //设置对象为有信号状态
AfxBeginThread(threadfun1,this);
}
注:g_hEvent为全局Handle变量。
给分吧!
step1:在XXXDlg.cpp文件中定义1个bool全局变量和子线程函数
UINT threadfun1(LPVOID lpParameter)
{
while (全局变量)
{
WaitForSingleObject(g_hEvent,INFINITE);
//--------音频录制代码放在这里---------//
SetEvent(g_hEvent);
} return 0;
}
step2:在你的按钮响应函数里面启动、关闭等线程管理功能
void XXXDlg::OnBnClickedButton1()
{
全局变量 = !全局变量;//逻辑控制
g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
SetEvent(g_hEvent); //设置对象为有信号状态
AfxBeginThread(threadfun1,this);
}
注:g_hEvent为全局Handle变量。
给分吧!
你好,我对多线程不怎么了解,按你的方法依葫芦画瓢了下。但得到的视频似乎只有第一帧,能帮忙分析下么
bool state=false;
HANDLE g_hEvent;
CvVideoWriter* videoWriter;UINT threadfun1(LPVOID lpParameter)
{
while (state)
{
WaitForSingleObject(g_hEvent,INFINITE);
//指定视频中每一帧的大小
CvSize size = cvSize(width,height);
//需要初始化一个写视频文件的对象,这里注意使用的编解码器格式是MJPG 帧率设置为5
videoWriter =
cvCreateVideoWriter("../videotap/test.avi",CV_FOURCC('M','J','P','G'),5,size);
//得到从摄像头中获取的帧
IplImage* frame = cvQueryFrame(capture1);
//将帧写入视频文件中
cvWriteFrame(videoWriter,frame);
SetEvent(g_hEvent);
}
return 0;
}
void CMytestDlg::OnBnClickedButtonTape()
{
state=!state;
if(state)
{
CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
pWnd_video->SetWindowText(_T("Save"));
}
else
{
CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
pWnd_video->SetWindowText(_T("Videotape"));
}
g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
SetEvent(g_hEvent); //设置对象为有信号状态
AfxBeginThread(threadfun1,this);
}
step1:在XXXDlg.cpp文件中定义1个bool全局变量和子线程函数
UINT threadfun1(LPVOID lpParameter)
{
while (全局变量)
{
WaitForSingleObject(g_hEvent,INFINITE);
//--------音频录制代码放在这里---------//
SetEvent(g_hEvent);
} return 0;
}
step2:在你的按钮响应函数里面启动、关闭等线程管理功能
void XXXDlg::OnBnClickedButton1()
{
全局变量 = !全局变量;//逻辑控制
g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
SetEvent(g_hEvent); //设置对象为有信号状态
AfxBeginThread(threadfun1,this);
}
注:g_hEvent为全局Handle变量。
给分吧!
你好,我对多线程不怎么了解,按你的方法依葫芦画瓢了下。但得到的视频似乎只有第一帧,能帮忙分析下么
bool state=false;
HANDLE g_hEvent;
CvVideoWriter* videoWriter;UINT threadfun1(LPVOID lpParameter)
{
while (state)
{
WaitForSingleObject(g_hEvent,INFINITE);
//指定视频中每一帧的大小
CvSize size = cvSize(width,height);
//需要初始化一个写视频文件的对象,这里注意使用的编解码器格式是MJPG 帧率设置为5
videoWriter =
cvCreateVideoWriter("../videotap/test.avi",CV_FOURCC('M','J','P','G'),5,size);
//得到从摄像头中获取的帧
IplImage* frame = cvQueryFrame(capture1);
//将帧写入视频文件中
cvWriteFrame(videoWriter,frame);
SetEvent(g_hEvent);
}
return 0;
}
void CMytestDlg::OnBnClickedButtonTape()
{
state=!state;
if(state)
{
CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
pWnd_video->SetWindowText(_T("Save"));
}
else
{
CWnd* pWnd_video=GetDlgItem(IDC_BUTTON_TAPE);
pWnd_video->SetWindowText(_T("Videotape"));
}
g_hEvent = CreateEvent(NULL,FALSE,FALSE,NULL);//创建事件对象
SetEvent(g_hEvent); //设置对象为有信号状态
AfxBeginThread(threadfun1,this);
}设置断点检查一下:当state为真时候,看看你的程序是否一直停留在while()循环里面。如果是这样滴话,那就不是多线程的问题,而是你的音频录制代码的问题了。
CvSize size = cvSize(width,height)
videoWriter =
cvCreateVideoWriter("../videotap/test.avi",CV_FOURCC('M','J','P','G'),5,size);
一段,应该将它放进主函数里初始化。否则每次循环都将重新新建一个视频文件