大华.dav视频格式转avi的一种办法

本文介绍了一种使用大华SDK将Dav视频转换为JPG图片的方法,并提供了将JPG图片序列转换为AVI视频的Python代码。通过自定义解码回调函数保存视频帧,再利用OpenCV的VideoWriter类进行视频重组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最新更新:格式工厂也可以。。。。

在网上寻找转换工具未果,所幸自己写一个,这个办法不是最好的但比较快捷。

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播放文件流程:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值