海康威视SDK控制台程序consoleDemo将实时码流保存为视频文件mp4

news/2024/7/8 8:35:47 标签: c++, 海康威视SDK, Linux, 控制台程序, 视频回放

陈拓 2021/08/28-2020/08/29

 

1. 概述

在《海康威视SDK控制台程序consoleDemo》

https://zhuanlan.zhihu.com/p/403903892

https://blog.csdn.net/chentuo2000/article/details/119939573

一文中我们已经编译成功了海康威视SDK控制台程序consoleDemo。

在《海康威视SDK控制台程序consoleDemo获取视频通道参数》

https://zhuanlan.zhihu.com/p/404390272

https://blog.csdn.net/chentuo2000/article/details/119963580

一文中我们获取到了NVR的视频通道号。

在《海康威视SDK控制台程序consoleDemo获取码流》

https://zhuanlan.zhihu.com/p/404556277

https://blog.csdn.net/chentuo2000/article/details/119971526

一文中我们获取到了实时视频的码流。

本文我们码流数据保存为视频文件。

2. 重写GetStream.cpp

将GetStream.cpp原来的全部代码删除,替换成下面的代码:

#include <unistd.h> 
#include "HCNetSDK.h"
#include "public.h"
#include <stdio.h>
#include <time.h>
#include <string.h>
#include <iostream>
using namespace std;

void CALLBACK g_RealDataCallBack_V30(LONG lRealHandle, DWORD dwDataType, BYTE *pBuffer,DWORD dwBufSize,void* dwUser) {
    printf("pyd---(private_v30)Get data,the size is %ld,%d.\n", time(NULL), dwBufSize);
}

int Demo_GetStream_V30(LONG lUserID) {
    long lRealPlayHandle;
    NET_DVR_PREVIEWINFO struPlayInfo = {0};
    struPlayInfo.hPlayWnd     = 0;  // 仅取流不解码。这是Linux写法,Windows写法是struPlayInfo.hPlayWnd = NULL;
    struPlayInfo.lChannel     = 33; // 通道号
    struPlayInfo.dwStreamType = 0;  // 0- 主码流,1-子码流,2-码流3,3-码流4,以此类推
    struPlayInfo.dwLinkMode   = 0;  // 0- TCP方式,1- UDP方式,2- 多播方式,3- RTP方式,4-RTP/RTSP,5-RSTP/HTTP
    struPlayInfo.bBlocked     = 1;  // 0- 非阻塞取流,1- 阻塞取流
    //struPlayInfo.dwDisplayBufNum = 1;

    //lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, g_RealDataCallBack_V30, NULL); // NET_DVR_RealPlay_V40 实时预览(支持多码流)。
    lRealPlayHandle = NET_DVR_RealPlay_V40(lUserID, &struPlayInfo, NULL, NULL); // NET_DVR_RealPlay_V40 实时预览(支持多码流)。
    //lRealPlayHandle = NET_DVR_RealPlay_V30(lUserID, &ClientInfo, NULL, NULL, 0); // NET_DVR_RealPlay_V30 实时预览。
    if (lRealPlayHandle < 0) {
        printf("NET_DVR_RealPlay_V40 error, %d\n", NET_DVR_GetLastError());

        return HPR_ERROR;
    }
    cout << "取流成功!" << endl;

    if (!NET_DVR_SaveRealData(lRealPlayHandle, (char *)"./test.mp4")) {
        printf("保存到文件失败 错误码:, %d\n", NET_DVR_GetLastError());
    }
    printf("保存到文件test.mp4\n");

    sleep(5); // 取流时间长度 秒
    NET_DVR_StopRealPlay(lRealPlayHandle); // 停止取流
   
    return HPR_OK;
}

说明:

保存的录像文件大小

V5.0.3.2或以后版本,通过该接口保存录像,保存的录像文件数据超过文件最大限制字节数(默认为1024MB),SDK会自动切片,即新建文件进行保存,文件名命名规则为“在接口传入的文件名基础上增加数字标识(例如:*_1.mp4、*_2.mp4)”。可以调用NET_DVR_GetSDKLocalCfg、NET_DVR_SetSDKLocalCfg(配置类型:NET_DVR_LOCAL_CFG_TYPE_GENERAL)获取和设置切片模式和文件最大限制字节数。

3. 编译、运行

编译运行操作见概述中提到的《海康威视SDK控制台程序consoleDemo》一文。

在菜单中选择1,运行结果:

4. 视频文件回放

  • 下载视频文件

视频文件在远程Linux系统上,我们先将视频文件下载到本地。

  • 播放

视频文件是海康的自有格式,需要用海康的专用播放器播放。

海康客户端软件下载网址:

https://www.hikvision.com/cn/support/Downloads/Desktop-Application/

海康播放器:

要用通用播放器播放海康视频文件需要转换格式,海康虽然提供了录像文件转换工具,但是并不好用。后面的文章中我们用FFMpeg转换格式。

见《ffmpge海康视频文件格式转换》

https://zhuanlan.zhihu.com/p/404676632

https://blog.csdn.net/chentuo2000/article/details/119977603


http://www.niftyadmin.cn/n/1733069.html

相关文章

弹性盒模型----容器属性

布局的传统方案&#xff0c;基于盒装模型&#xff0c;依赖display属性 position属性 float属性。他对于那些特殊的布局非常不方便&#xff0c;比如&#xff0c;垂直居中就不容易实现。  2009年&#xff0c;W3C提出了一种新的方案—-Flex布局&#xff0c;可以简便、完整、响应…

JQuery的表单操作

获取值&#xff1a;文本框&#xff0c;文本区域&#xff1a;$("#txt").attr("value")&#xff1b;多选框checkbox&#xff1a;$("#checkbox_id").attr("value")&#xff1b;单选组radio&#xff1a; $("input[typeradio][check…

ffmpge海康视频文件格式转换

陈拓 2021/08/29-2020/08/29 1. 概述 在《海康威视SDK控制台程序consoleDemo将实时码流保存为视频文件》 https://zhuanlan.zhihu.com/p/404661836 https://blog.csdn.net/chentuo2000/article/details/119976612 一文中文件我们将码流数据保存为视频文件。 视频文件是海…

几行代码轻松解决滚动条样式问题,堪称神器

相信很多同仁都曾为各种浏览器的滚动条样式困惑过&#xff0c;而且不同的浏览器默认的滚动条样式还不一致。网上也有很多说法修改滚动条样式&#xff0c;但是大多数都是滥竽充数。今天我只说干货&#xff0c;纯干货&#xff0c;干货来自于我的一位同事的推荐&#xff0c;在此&a…

FFmpeg常用命令参数

FFmpeg常用命令参数 陈拓 2021/08/31-2020/09/01 1. 视频文件转gif图像 命令格式&#xff1a; ffmpeg -ss 5 -t 10 -i input.mp4 -y -s 640x480 -f gif -r 1 output.gif 参数说明&#xff1a; -ss 开始截图时间&#xff08;秒&#xff09; 截图开始时间越接近篇尾&#…

Stage模型HarmonyOS服务卡片开发定时和定点刷新实现

一、定时刷新 表示在一定时间间隔内调用onUpdateForm的生命周期回调函数自动刷新卡片内容。可以在form_config.json配置文件的updateDuration字段中进行设置。例如&#xff0c;可以将刷新时间设置为每小时一次。注意&#xff1a;updateDuration&#xff08;定时刷新&#xff09…

Linux C++ stack smashing detected错误

陈拓 2021/09/12-2020/09/12 调试程序遇到一个错误&#xff1a;stack smashing detected 原因是数组开小了&#xff0c;出现了数组越界。 原数组定义&#xff1a; char destfile[64] {0}; 改成 char destfile[256] {0}; 问题解决。

Oracle DB Link创建方法

http://www.cnblogs.com/lauer0246/archive/2009/10/20/1586859.html已知&#xff1a;数据库1&#xff1a;TEST1&#xff1b;数据库2&#xff1a;TEST2 要求&#xff1a;在数据库1上创建到数据库2的DB Link方案一&#xff1a; 1、在数据库1所在电脑&#xff0c;创建到数据库2的…