启动线程

这是一个C++实现的线程函数,用于根据特定条件转换YUV视频帧到MP4格式。它首先注册所有需要的AV库,然后根据目录结构和文件名规则进行文件操作,包括创建目录、读取文件、转换视频帧并重命名文件。最后,函数会调用压缩MP4文件的方法。
//启动线程
void CZRSCapDlg::StartScreen()
{
DWORD ThreadID;
    hThread=CreateThread(NULL,  0,  (LPTHREAD_START_ROUTINE)ThreadFunc,  this,  0,  &ThreadID);

}

//线程

UINT WINAPI CZRSCapDlg::ThreadFunc(LPVOID pParam)
{
CZRSCapDlg *pDlg = (CZRSCapDlg *)pParam;//使用pDlg引用全局的变量或函数,这些变量和函数最好的独有使用

}

本人的使用:

UINT WINAPI CZRSCapDlg::ThreadFunc(LPVOID pParam)
{
CZRSCapDlg *pDlg = (CZRSCapDlg *)pParam;
int yuv,mp4;


av_register_all();
avdevice_register_all();


char* yuvName = NULL;
char* mp4Name = NULL;


if(pDlg->m_Order == "orderStart")
{

CString strDir,strName;
strDir = pDlg->m_filePath;
if(strDir.Right(1) != "\\")
strDir += "\\";
strDir = strDir + pDlg->m_StudentID;
pDlg->m_StudentMP4Name = strDir;
if (!PathIsDirectory(strDir))
{
CreateDirectory(strDir, 0);//不存在则创建
}
strDir += "\\";
std::vector<CString> fileList;
CFileFind   f; 
BOOL   bFind=f.FindFile(strDir+pDlg->m_StudentID+"*.zrv");   
while(bFind)   
{
bFind   =   f.FindNextFile(); 
CString fileNum ,filename;
filename = f.GetFileName();
filename.Trim();
filename = filename.Left(filename.GetLength()-4);
fileNum = filename.Right(2);
fileList.push_back(fileNum); 

f.Close();
sort(fileList.begin(), fileList.end(), SortbyNumASC);
if(fileList.size()>0)
strName = fileList.at(fileList.size()-1);
if(strName != "")
{
CString strStuID;
CString yuvNameTemp, mp4NameTemp;
strStuID = strName;
int strStuNum = atoi(strStuID);
int i;
for(i=1;i<=pDlg->m_ScreenCounts;i++)
{
strStuNum++;
if(i!=pDlg->m_ScreenCounts)
{
pDlg->m_FreamCount = 300*10;//1分钟转换一次
}
else
{
pDlg->m_FreamCount = pDlg->m_Time%300*10;
}
pDlg->m_flagCount = i;
CString str;
if(strStuNum < 10)
str.Format("0%d",strStuNum);
else
str.Format("%d",strStuNum);

yuvNameTemp = pDlg->m_StudentID;
mp4NameTemp = pDlg->m_StudentID;
yuvNameTemp = yuvNameTemp + str + ".yuv";
mp4NameTemp = mp4NameTemp + str + ".mp4";
yuvNameTemp = strDir + yuvNameTemp;
mp4NameTemp = strDir + mp4NameTemp;
yuvName  =  (char*)(LPCTSTR)yuvNameTemp;
mp4Name  =  (char*)(LPCTSTR)mp4NameTemp;
yuv = pDlg->screen_to_yuv420p(yuvName);
if(yuv != 0)
{
return -1;
}
mp4 = pDlg->yuv420p_to_mp4(yuvName,mp4Name);
if(mp4 != 0)
{
return -1;
}
DeleteFile(yuvNameTemp);
//修改文件名
CFileFind find;
CString newName;
newName = mp4NameTemp.Left(mp4NameTemp.GetLength()-4);
newName = newName + ".zrv";
MoveFile(mp4NameTemp,newName);
}
//pDlg->m_FreamCount = 0;
//pDlg->m_ScreenCounts = 0;
pDlg->zipMP4File();
}
else
{
int i;
CString yuvNameTemp, mp4NameTemp;
for(i=1;i<=pDlg->m_ScreenCounts;i++)
{
if(i!=pDlg->m_ScreenCounts)
{
pDlg->m_FreamCount = 300*10;//5分钟转换一次
}
else
{
pDlg->m_FreamCount = pDlg->m_Time%300*10;
}
pDlg->m_flagCount = i;
CString str;
if(i < 10)
str.Format("0%d",i);
else
str.Format("%d",i);
yuvNameTemp = pDlg->m_StudentID;
mp4NameTemp = pDlg->m_StudentID;
yuvNameTemp = yuvNameTemp + str + ".yuv";
mp4NameTemp = mp4NameTemp + str + ".mp4";
yuvNameTemp = strDir + yuvNameTemp;
mp4NameTemp = strDir + mp4NameTemp;
yuvName  =  (char*)(LPCTSTR)yuvNameTemp;
mp4Name  =  (char*)(LPCTSTR)mp4NameTemp;
yuv = pDlg->screen_to_yuv420p(yuvName);
if(yuv != 0)
{
return -1;
}
mp4 = pDlg->yuv420p_to_mp4(yuvName,mp4Name);
if(mp4 != 0)
{
return -1;
}
//pDlg->m_StudentMP4Name = mp4NameTemp;
//pDlg->OnBnClickedZipButton();
DeleteFile(yuvNameTemp);
//DeleteFile(mp4NameTemp);
//修改文件名
CFileFind find;
CString newName;
newName = mp4NameTemp.Left(mp4NameTemp.GetLength()-4);
newName = newName + ".zrv";
//find.FindFile(mp4NameTemp);
//find.GetFileName();
MoveFile(mp4NameTemp,newName);
}
//pDlg->m_FreamCount = 0;
//pDlg->m_ScreenCounts = 0;
pDlg->zipMP4File();
}
}
return 0;
}


评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值