海康威视摄像头ISUP(原EHOME协议) 实时预览springboott相机 Java实现版本,可在浏览器vue前端播放(附带源码)
1.先说为什么要用ISUP协议取流。
ISUP主要用于解决相机没有公网ip的问题,如果相机或局域网路由器有公网ip,事实上,使用rtsp直接取流是最方便、最好的性能,但该项目的摄像头没有公共网络IP,因此被迫使用ISUP,ISUP是海康自己的协议,海康官网有相应的DEMO,海康DEMO地址主要根据他们的java版本的demo进行改造c;
2.具体实现。
首先,必须设置摄像头编码格式H.264。
首先,必须设置摄像头编码格式H.264.
将音频编码改为ACC。
还需要设置ehome协议,IP地址填写流服务器地址,本地测试只需填写本机ip地址,这个密钥和ISUP服务器的密钥一样 --修改上述配置后注意点击保存即可生效。
3.核心代码_取流并再次推送到nginx-rtmp。
代码(完整的服务源码地址)
thread = new Thread(() -> { try { // 打印FFmpeg日志可以帮助确定输入流的音视频编码格式帧率等信息,注释///// avutil.av_log_set_level(avutil.AV_LOG_INFO);// FFmpegLogCallback.set(); grabber = new FFmpegFrameGrabber(inputStream, 0); grabber.setOption("rtsp_transport", "tcp"); // TCP////设置RTSP传输协议 grabber.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 将视频编解码器设置为H.264// grabber.setAudioCodec(avcodec.AV_CODEC_ID_AAC); // ACCC设置音频编解码器 grabber.setFormat("mpeg"); // MPEG设置格式 grabber.start(); // 上下文获取输入格式 AVFormatContext ifmt_ctx = grabber.getFormatContext(); log.info("视频宽度:" + grabber.getImageWidth()); log.info("视频高度:" + grabber.getImageHeight()); log.info("音频通道:" + grabber.getAudioChannels()); recorder = new FFmpegFrameRecorder(pushAddress, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels()); recorder.setInterleaved(true); // 设置音视频交织方式 recorder.setVideoOption("crf", "23"); ///图像质量参数 recorder.setFormat("flv"); // 将推流格式设置为 FLV// recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC); // 音频编码器设置为 AAC recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 视频编码器设置为 H.264 recorder.setSampleRate(grabber.getSampleRate()); // 设置音频采样率 recorder.setFrameRate(grabber.getFrameRate()); //设置视频帧率 recorder.setVideoBitrate(3000000); // 视频比特率设置为 3 Mbps(根据需要调整// recorder.setVideoQuality(0); // 设置视频质量参数(最高质量)// recorder.setAudioQuality(0); // 设置音频质量参数(最高质量) recorder.setGopSize((int) (grabber.getFrameRate()*2)); recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P; recorder.setVideoOption("tune", "zerolatency"); // 减少编码延迟 recorder.setVideoOption("preset", "superfast"); // 提高编码速度 recorder.start(ifmt_ctx); // 启动推流器 Frame frame; count=0; long t1 = System.currentTimeMillis(); AVPacket packet; while (running &&(packet = grabber.grabPacket()) != null) { count++; recorder.recordPacket(packet);// if ((System.currentTimeMillis() - t1) > RECORD_LENGTH) { // break;// } if (count % 100 == 0) { // 处理每帧 log.info("packet推流帧#61;===>" + count); } } }。
4.结语。
4.结语。
nginx-rtmp可以看到nginx-rtmp,施工完成后,nginx-rtmp可以为前端播放提供HLSurl,也可以使用rtmp协议url播放,但是现在rtmp协议的浏览器基本不支持播放。
本地实测延迟约5秒内,一般3秒左右。
其实刚开始用的是别人的代码,虽然也可以实现视频预览但仅仅一个摄像头就占cpu的40%c;性能消耗过多,后来改变了javacv的配置,目前4核8G服务器实测开启摄像头推流只占1%cpu,cpu占用量下降了很多。
有些问题
1.如果你拉的流分析没有音频通道(0),nginx-不会生成rtmp.m3u8和ts文件,如果无法生成播放hls的文件,则只能用rtmp协议的url播放 或者 手动添加音频。
有些问题1.如果你拉的流分析没有音频通道(0)单词,nginx-不会生成rtmp.m3u8和ts文件,如果无法生成播放hls的文件,则只能用rtmp协议的url播放 或者 手动添加音频。。。2.如果Pipe出现在操作中 closed异常,然后你应该找到异常栈顶的异常,栈顶异常会导致流被关闭,但是,数据将始终写入主线程c;所以会导致一大串Pipe closed。3.最好不要在源代码中依赖的lib文件中修改动态链接库的相对位置。.dll是windows系统运行所需的,.linux系统需要so。本文地址:http://cdn.baiduyun.im/video/www.bfzx365.com/news/show.php/video/440b46099099.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。