监控摄像机(海康、大华等)内部带的录像功能一般录制的是h264文件,这种文件格式简单的把每一帧h264字节数据保存到文件里。

实际使用中,可能需要对特定录像进行反复检测,以训练、改进视频检测算法的准确性。

这里介绍两种方法。

1.使用RTSP流

服务端1:live555 使用C++代码开发容易些,网上代码较多

服务端2:vlc播放器,参考 使用vlc播放器做rtsp服务器

客户端:使用vlc播放器播放rtsp视频

使用vlc进行二次开发做自己的播放器

web网页中使用vlc插件播放相机rtsp流视频

Emgu.CV 播放视频-本地文件/RTSP流

2.自定义格式

使用UDP数据包

服务端针对.h264视频一帧帧发送给客户端,使用UDP协议

h264帧,尤其是I帧大小可能超过64K,即udp数据包的上限,需要考虑分包

分包:可以在第一字节=0表示不分包,=1表示分包这是第一包,=2这是第二包

视频清晰度暂定为480P,此时P帧一般小于64k,而I帧部分大于64k。这样可以不考虑数据包会先发后到导致乱序

客户端:

示例代码如下

IPEndPoint ipep = new IPEndPoint(IPAddress.Any, );
udpsockVideo = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpsockVideo.ReceiveBufferSize = ;
try
{
//绑定网络地址
udpsockVideo.Bind(ipep); IPAddress ip = IPAddress.Any; //得到客户机IP
IPEndPoint sender = new IPEndPoint(ip, );
EndPoint Remote = (EndPoint)(sender); log.ErrorFormat("udp开始接收视频帧"); bool bIframe = false;
unAvailableCnt = ;
while (!bAbortvehicleEventThread)
{
if (udpsockVideo == null)
{
log.ErrorFormat("udp接收视频帧 Socket 为空!");
return;
} if (udpsockVideo.Available <= )
{
unAvailableCnt++;
if (unAvailableCnt > )
{
log.ErrorFormat("udp接收视频帧:连续未接收到视频"); //实际比10秒多
unAvailableCnt = ;
}
//TimeSpan ts = new TimeSpan(100000);//0.1毫秒 1 ticks =十亿分之一秒 百万分之一毫秒 千分之一微秒,1纳秒
Thread.Sleep(); //sleep 1时,由于精度问题,经常耗时10-16毫秒
continue;
} byte[] data = new byte[];
int recv = udpsockVideo.Receive(data);
if (recv < )
{
continue;
} if (ip != IPAddress.Any && (Remote as IPEndPoint).Address.ToString().Trim() != ip.ToString().Trim())
{
continue;
} unAvailableCnt = ; try
{
if (data[] != 0x00)
{
bIframe = true; byte b = data[];
if (b == 0x01)
{
iframe1 = new byte[recv - ];
Array.Copy(data, , iframe1, , recv - );
}
log.ErrorFormat(b.ToString());
if (b == 0x02)
{
iframe2 = new byte[recv - ];
Array.Copy(data, , iframe2, , recv - );
log.ErrorFormat(iframe2.Length.ToString());
} if (iframe1.Length < && iframe2.Length < )
{
int iframeLen = iframe1.Length + iframe2.Length; byte[] Iframe = new byte[iframeLen];
Array.Copy(iframe1, , Iframe, , iframe1.Length);
Array.Copy(iframe2, , Iframe, iframe1.Length, iframe2.Length); DecH264Frame(Iframe); iframe1 = new byte[];
iframe2 = new byte[];
bIframe = false;
}
}
else
{
if (bIframe)
{
bIframe = false;
iframe1 = new byte[];
iframe2 = new byte[];
} byte[] frame = new byte[recv - ];
Array.Copy(data, , frame, , recv - );
DecH264Frame(frame);
}
}
catch (System.Exception ex)
{
log.ErrorFormat("udp接收视频帧 解码/录像出错:" + ex.Message);
} }
}
catch (Exception e)
{
log.ErrorFormat("udp接收视频帧出错。端口:{0},出错信息:{1}", , e.Message);
}
finally
{
if (udpsockVideo != null)
{
udpsockVideo.Close();
}
}

针对监控摄像机(海康、大华等)录像 .h264 文件的流媒体播放设计的更多相关文章

  1. 海康&大华&DSS视频拉流-RTSP转RTMP多媒体播放技术

    海康&大华&DSS获取RTSP 实时流 海康:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/ ...

  2. 海康大华RTSP格式

    海康实时流:rtsp://admin:12345@192.2.82.50:554/h264/ch4/main/av_stream海康回放流(模拟通道):rtsp://admin:12345@192.2 ...

  3. 海康/大华 IpCamera RTSP地址和格式

    海康:rtsp://[username]:[password]@[ip]:[port]/[codec]/[channel]/[subtype]/av_stream说明:username: 用户名.例如 ...

  4. RTSP安防摄像机(海康大华宇视等)如何推送到RTMP流媒体服务器进行直播

    方案介绍 目前互联网直播的CDN和标准RTMP流媒体服务器通常只能接收RTMP格式的音视频推流.目前市场上有一些自带RTMP推流的摄像机和编码器,可以直接在其rtmp推流配置里面配置推送到RTMP流媒 ...

  5. EasyPlayer播放海康大华RTSP流时RTSPClient客户端连接兼容问题的解决

    在之前的博客<EasyPlayer RTSP播放器对RTSP播放地址url的通用兼容修改意见>中,我描述了遇到的一个客户在播放大华某款摄像机时地址不兼容的问题,这不,团队刚刚参考我的这个意 ...

  6. 将海康大华等网络摄像机RTSP流进行网页Flash rtmp和H5 hls直播的技术方案

    前言 再小的技术点也会有他的市场! 一直以来,都有一些不被看好,认为是成本太高,无法大规模展开的软件和产品形态,就好比每一座城市都会有他的著名小吃一样,即使是慕名而来的人源源不断,受众群体也总是有限, ...

  7. 浏览器低延时播放监控摄像头RTSP海康大华硬盘录像机NVR视频(EasyNVR播放FLV视频流)

    背景描述 EasyNVR的使用者应该都是清楚的知道,EasyNVR一个强大的功能就是可以进行全平台的无插件直播.主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理后可 ...

  8. 来自iSpy整理的最全海康大华IPC的RTSP连接地址

    来自iSpy整理的最全海康大华IPC的RTSP连接地址 先贴出处: 海康:http://www.ispyconnect.com/man.aspx?n=Hikvision 大华:http://www.i ...

  9. 在做RTSP摄像机H5无插件直播中遇到的对接海康摄像机发送OPTIONS心跳时遇到的坑

    我们在实现一套EasyNVR无插件直播方案时,选择了采用厂家无关化的通用协议RTSP/Onvif接入摄像机IPC/NVR设备,总所周知,Onvif是摄像机的发现与控制管理协议,Onvif用到的流媒体协 ...

随机推荐

  1. 生成Csv格式的字符串

    using System; using System.Collections.Generic; using System.Linq; using System.Reflection; using Sy ...

  2. JavaScript(二)数据类型(二)

    布尔值布尔值指真或假,开或关,是或否,关键字true和false.下面这些值会被转换成false: undefined null 0 -0 NaN ""    //  空字符串 布 ...

  3. libstdc++适配Xcode10与iOS12

    编译报错 当你开心得升级完新 macOS,以及新 XCode,准备体验了一把 Dark Mode 编程模式,开心的打开自己的老项目的时候,发现编译不通过了╮(╯_╰)╭ 如果你的工程中如果依赖 lib ...

  4. python--继承--方法的重写---和父类的扩展

    1.方法的重写 父类的方法不能满足子类的需要,可以对方法重写 具体的实现方式,就相当于在子类中定义了一个和父类同名的方法并实现 重写之后只会对子类的方法调用,而不会调用父类封装的方法 2.对父类方法进 ...

  5. 【笔记】Python集成开发环境——PyCharm 2018.3下载、注册、帮助文档

    [博客导航] [Python导航] 前言 使用好的开发环境将有效提高编程效率,在Python使用上我是小白,所以特意请教了从事语言处理的成同学,告知我,推荐使用Pycharm和IntelliJ. 目前 ...

  6. Spring类型转换(Converter)

    Spring的类型转换 以前在面试中就有被问到关于spring数据绑定方面的问题,当时对它一直只是朦朦胧胧的概念,最近稍微闲下来有时间看了一下其中数据转换相关的内容,把相应的内容做个记录. 下面先说明 ...

  7. 滑动窗口最大值的golang实现

    给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧.你只可以看到在滑动窗口 k 内的数字.滑动窗口每次只向右移动一位. 返回滑动窗口最大值 输入: nums = [, ...

  8. .NET CORE学习笔记系列(3)——ASP.NET CORE多环境标识

    在开发项目的过程当中,生产环境与调试环境的配置是不一样的.比如连接字符串. ASP .NET CORE 支持利用环境变量来动态配置 JSON 文件.ASP.NET Core 引用了一个特定的环境变量  ...

  9. Python开发【第五篇】内置函数

    abs() 函数返回数字的绝对值 __author__ = "Tang" a = -30 all() 函数用于判断给定的可迭代参数iterable中的所有元素是否都为True,如果 ...

  10. Arduino 串口测试 电脑发数据接收后立马返回

    String comdata = ""; void setup() { Serial.begin(9600); while(Serial.read()>= 0){} //cl ...