最新更新:格式工厂也可以。。。。
在网上寻找转换工具未果,所幸自己写一个,这个办法不是最好的但比较快捷。
1 首先使用大华SDK获取视频的帧率和每一帧的大小,这在后面转换的时候要用。
2 其次参照大华sdk手册,播放dav视频,在解码回调函数中保存每一帧图片。
3 最后使用python的VideoWriter类将图片写入avi视频
dav视频转jpg代码:
//在mfc中的测试代码
LONG nPort = -1;
void CALLBACK DecCBFun(LONG nPort, char * pBuf, LONG nSize, FRAME_INFO * pFrameInfo, void* pUserData, LONG nReserved2)
{
CtestDahuaDlg *pCTestDahuaDlg = (CtestDahuaDlg*)pUserData;
if(pFrameInfo->nType == 3) //视频数据
{
Mat yuvImg;
yuvImg.create(pFrameInfo->nHeight*3/2, pFrameInfo->nWidth, CV_8UC1);
memcpy(yuvImg.data, pBuf, nSize*sizeof(unsigned char));
cv::cvtColor(yuvImg, pCTestDahuaDlg->m_mtFrame, CV_YUV2RGB_YV12);
//static int iIndex = 0;
char str[128] = {0};
sprintf_s(str, "frame_%d.jpg", PLAY_GetCurrentFrameNum(nPort));
OutputDebugStringA(str);
OutputDebugStringA("\n");
CString path ;
path.Format("%s\\%s", pCTestDahuaDlg->m_dir, str);
OutputDebugStringA(path.GetBuffer());
cv::imwrite(path.GetBuffer(), pCTestDahuaDlg->m_mtFrame);
}
else if(pFrameInfo->nType == T_AUDIO16)
{
}
else
{
}
return;
}
void CtestDahuaDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//打开待播放的文件
BOOL bFlag = FALSE;
//获取播放库端口号
bFlag = PLAY_GetFreePort(&nPort);
CString fileName = "2_2019-03-24_09_40_28";
CString playerName = fileName + ".dav";
bFlag = PLAY_OpenFile(nPort, playerName.GetBuffer());
if(bFlag == FALSE)
{
char str[128]={0};
sprintf_s(str, "Open file failed %d", PLAY_GetLastErrorEx());
OutputDebugStringA(str);
return;
}
CString str = ".\\" + fileName;
CreateDirectory(str, NULL);
m_dir = str;
PLAY_SetDecCallBackEx(nPort, DecCBFun, (void*)this);
int iFrames = PLAY_GetFileTotalFrames(nPort);
//开始播放文件
PLAY_Play(nPort, this->m_hWnd);
//播放声音
//PLAY_PlaySound(nPort);
//Sleep(PLAY_GetFileTime(nPort)* 1000);
Sleep(12000000);
//停止播放
PLAY_Stop(nPort);
//停止播放声音
PLAY_StopSound();
//关闭文件
PLAY_CloseFile(nPort);
CDialogEx::OnOK();
}
jpg图片转avi格式代码:
import os
import cv2
import numpy as np
path = './2_2019-03-22_11_36_31/'
filelist = os.listdir(path)
filelist.sort(key = lambda x:int(x[6:-4]))#自定义对图片名称中的数字部分进行排序
fps = 25 #视频每秒25帧
size = (1920, 1080) #需要转为视频的图片的尺寸
#可以使用cv2.resize()进行修改
video = cv2.VideoWriter("2_2019-03-22_11_36_31.avi", cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), fps, size)
#视频保存在当前目录下
for item in filelist:
if item.endswith('.jpg'):
#找到路径中所有后缀名为.png的文件,可以更换为.jpg或其它
item = path + item
print(item)
img = cv2.imread(item)
video.write(img)
video.release()
cv2.destroyAllWindows()
大华SDK播放文件流程: