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;
}
这是一个C++实现的线程函数,用于根据特定条件转换YUV视频帧到MP4格式。它首先注册所有需要的AV库,然后根据目录结构和文件名规则进行文件操作,包括创建目录、读取文件、转换视频帧并重命名文件。最后,函数会调用压缩MP4文件的方法。
558

被折叠的 条评论
为什么被折叠?



