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

摘要:
监控摄像机内部带的录像功能一般录制的是h264文件,这种文件格式简单的把每一帧h264字节数据保存到文件里。实际使用中,可能需要对特定录像进行反复检测,以训练、改进视频检测算法的准确性。bAbortvehicleEventThread){if{log.ErrorFormat("udp接收视频帧Socket为空!");return;}if{unAvailableCnt++;if{log.ErrorFormat;//实际比10秒多unAvailableCnt=0;}//TimeSpants=newTimeSpan;//0.1毫秒1ticks=十亿分之一秒百万分之一毫秒千分之一微秒,1纳秒Thread.Sleep;//sleep1时,由于精度问题,经常耗时10-16毫秒continue;}byte[]data=newbyte[100000];intrecv=udpsockVideo.Receive;if{continue;}if(ip!=0x00){bIframe=true;byteb=data[0];if{iframe1=newbyte[recv-2];Array.Copy;}log.ErrorFormat;if{iframe2=newbyte[recv-1];Array.Copy;log.ErrorFormat;}if{intiframeLen=iframe1.Length+iframe2.Length;byte[]Iframe=newbyte[iframeLen];Array.Copy;Array.Copy;DecH264Frame;iframe1=newbyte[100000];iframe2=newbyte[100000];bIframe=false;}}else{if{bIframe=false;iframe1=newbyte[100000];iframe2=newbyte[100000];}byte[]frame=newbyte[recv-1];Array.Copy;DecH264Frame;}}catch{log.ErrorFormat;}}}catch{log.ErrorFormat("udp接收视频帧出错。端口:{0},出错信息:{1}",6000,e.Message);}finally{if(udpsockVideo!

监控摄像机(海康、大华等)内部带的录像功能一般录制的是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, 6000);
            udpsockVideo = newSocket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            udpsockVideo.ReceiveBufferSize = 1000000;
            try
            {
                //绑定网络地址
udpsockVideo.Bind(ipep);
                IPAddress ip =IPAddress.Any;
                //得到客户机IP
                IPEndPoint sender = new IPEndPoint(ip, 0);
                EndPoint Remote =(EndPoint)(sender);
                log.ErrorFormat("udp开始接收视频帧");
                bool bIframe = false;
                unAvailableCnt = 0;
                while (!bAbortvehicleEventThread)
                {
                    if (udpsockVideo == null)
                    {
                        log.ErrorFormat("udp接收视频帧 Socket 为空!");
                        return;
                    }
                    if (udpsockVideo.Available <= 0)
                    {
                        unAvailableCnt++;
                        if (unAvailableCnt > 10000)
                        {
                            log.ErrorFormat("udp接收视频帧:连续未接收到视频"); //实际比10秒多
                            unAvailableCnt = 0;
                        }
                        //TimeSpan ts = new TimeSpan(100000);//0.1毫秒 1 ticks =十亿分之一秒 百万分之一毫秒 千分之一微秒,1纳秒
                        Thread.Sleep(1); //sleep 1时,由于精度问题,经常耗时10-16毫秒
                        continue;
                    }
                    byte[] data = new byte[100000];
                    int recv =udpsockVideo.Receive(data);
                    if (recv < 4)
                    {
                        continue;
                    }
                    if (ip != IPAddress.Any && (Remote as IPEndPoint).Address.ToString().Trim() !=ip.ToString().Trim())
                    {
                        continue;
                    }

                    unAvailableCnt = 0;
                    try
                    {
                        if (data[0] != 0x00)
                        {
                            bIframe = true;
                            byte b = data[0];
                            if (b == 0x01) 
{
                                iframe1 = new byte[recv - 2];
                                Array.Copy(data, 2, iframe1, 0, recv - 2);
}
                            log.ErrorFormat(b.ToString());
                            if (b == 0x02)
                            {
                                iframe2 = new byte[recv - 1];
                                Array.Copy(data, 1, iframe2, 0, recv - 1);
log.ErrorFormat(iframe2.Length.ToString());
                            }
                            if (iframe1.Length < 100000 && iframe2.Length < 100000)
                            {
                                int iframeLen = iframe1.Length +iframe2.Length;
                                byte[] Iframe = new byte[iframeLen];
                                Array.Copy(iframe1, 0, Iframe, 0, iframe1.Length);
                                Array.Copy(iframe2, 0, Iframe, iframe1.Length, iframe2.Length);
                                DecH264Frame(Iframe);
                                iframe1 = new byte[100000];
                                iframe2 = new byte[100000];
                                bIframe = false;
                            }
                        }
                        else
                        {
                            if(bIframe)
                            {
                                bIframe = false;
                                iframe1 = new byte[100000];
                                iframe2 = new byte[100000];
                            }
                            byte[] frame = new byte[recv - 1];
                            Array.Copy(data, 1, frame, 0, recv - 1);
                            DecH264Frame(frame);
                        }
                    }
                    catch(System.Exception ex)
                    {
                        log.ErrorFormat("udp接收视频帧 解码/录像出错:" +ex.Message);
                    }
                }
            }
            catch(Exception e)
            {
                log.ErrorFormat("udp接收视频帧出错。端口:{0},出错信息:{1}", 6000, e.Message);
            }
            finally
            {
                if (udpsockVideo != null)
                {
                    udpsockVideo.Close();
                }
            }

免责声明:文章转载自《针对监控摄像机(海康、大华等)录像 .h264 文件的流媒体播放设计》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇AI大视觉(八) | Yolov3 如何调整先验框进行解码?gitlab实现webhook触发jenkins 自动,构建,测试,push webhook构子 总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

玩转FFmpeg的7个小技巧

原文链接:http://www.linuxidc.com/Linux/2011-06/36973.htm FFmpeg堪称音频和视频应用程序的瑞士军刀,提供了丰富的选项和灵活性.很多时候用户为了看视频和听音乐都安装了ffmeg.更多关于ffmeg的详细介绍:here,可以通过ffmpeg -formats查看FFmpeg支持的视音频格式,左侧若是E表明可...

怎么在iPhone手机安装测试包,并且调试APP内的H5应用

安装步骤 电脑下载iTools,以Mac平台为例。iTools下载地址 使用数据线将Mac与iPhone链接 选中iTools【应用】一栏,点击下面安装按钮后,选择需要安装的ipa包即可 调试步骤 在Mac中,打开Safari浏览器,打开h5启动的项目,比如http://localhost:3000/test Safari浏览器 -> 偏...

Activity 的 36 个问题,你还记得几个?(转)

作者:_yuanhao 链接: https://www.jianshu.com/p/86c0a4afd28e 本文由作者授权发布。 文章包含图片很多,已经尽力让图片尽可能可以看清了,但是无奈手机屏幕太小,仍有一些模糊~ 0前言 学 Android 有一段时间了,一直都只顾着学新的东西,最近发现很多平常用的少的东西竟让都忘了,趁着这两天,打算把有关 Acti...

Burp Suite Professional更换闪退日记

一直在用老版本的burp,很多年也没更换,最近计划更新整理一下使用的武器库,于是下了最新版的burp,激活还是BurpLoaderKeygen.jar来去注入burp 但是遇到的用官网下载的dmg文件,启动没多久就自己图片进程崩溃,一开始以为SIP导致的,关闭了SIP也不行。 但是核心方式实际上是启动: java -javaagent:BurpLoader...

图解ARP协议(二)ARP攻击原理与实践

一、ARP攻击概述 在上篇文章里,我给大家普及了ARP协议的基本原理,包括ARP请求应答、数据包结构以及协议分层标准,今天我们继续讨论大家最感兴趣的话题:ARP攻击原理是什么?通过ARP攻击可以做什么,账号是否可以被窃取?有哪些常见的ARP渗透(攻击)工具可以用来练手?ARP扫描和攻击有什么区别,底层数据包特征是怎样的? 接下来,我们通过图解的方式来深入了...

部署自己的聊天系统 DuckChat(鸭信)

之前在找一款能自己部署的聊天系统,要求含有手机端APP,最好部署过程能简单点的。看了几款稍嫌麻烦,有的还没有app。今天无意间发现了这款DuckChat,开源免费,有手机APP,部署非常简单。直接上传到你的web根目录然后安装就行了。 演示地址(含Web体验) http://gaga.akaxin.com Android客户端 Android下...