海康威视摄像头ISUP(原EHOME协议) 摄像头实时预览springboot 版本java实现 ...

一给  金牌会员 | 2024-9-14 13:07:07 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 854|帖子 854|积分 2562

1.首先说了一下为什么要用ISUP协议来取流

ISUP主要就是用来办理摄像头没有公网ip的环境,假如摄像头或者所在局域网的路由器有公网ip的话,其实采用rtsp直接取流是最方便也是性能最好的,但是项目的摄像头没有公网IP以是被迫使用ISUP,ISUP是海康自己的协议,海康官网是有对应的DEMO,我主要根据他们的java版本的demo进行改造海康DEMO地址,
2.详细实现

首先得设置摄像头编码格式H.264

音频编码要改成ACC

还需要设置一下ehome协议,ip地址填取流服务器的地址,当地测试就填本机ip地址就行,这个密钥要和ISUP服务器的密钥一样 --注意上述设置修改完后要点击生存才会生效

3.焦点代码_取流并再推流到nginx-rtmp



代码(完整服务源码地址)

  1.    thread = new Thread(() -> {
  2.             try {
  3. //           打印FFmpeg日志可以帮助确定输入流的音视频编码格式帧率等信息,需要时可以取消注释
  4. //            avutil.av_log_set_level(avutil.AV_LOG_INFO);
  5. //            FFmpegLogCallback.set();
  6.             grabber = new FFmpegFrameGrabber(inputStream, 0);
  7.             grabber.setOption("rtsp_transport", "tcp"); // 设置RTSP传输协议为TCP
  8. //            grabber.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 设置视频编解码器为H.264
  9. //            grabber.setAudioCodec(avcodec.AV_CODEC_ID_AAC); // 设置音频编解码器为ACC
  10.             grabber.setFormat("mpeg"); // 设置格式为MPEG
  11.             grabber.start();
  12.                 // 获取输入格式上下文
  13.                 AVFormatContext ifmt_ctx = grabber.getFormatContext();
  14.                 log.info("视频宽度:" + grabber.getImageWidth());
  15.                 log.info("视频高度:" + grabber.getImageHeight());
  16.                 log.info("音频通道:" + grabber.getAudioChannels());
  17.                 recorder = new FFmpegFrameRecorder(pushAddress, grabber.getImageWidth(), grabber.getImageHeight(), grabber.getAudioChannels());
  18.                 recorder.setInterleaved(true);  // 设置音视频交织方式
  19.                 recorder.setVideoOption("crf", "23"); //画质参数
  20.                 recorder.setFormat("flv");  // 设置推流格式为 FLV
  21. //                recorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);  // 设置音频编码器为 AAC
  22.                 recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);  // 设置视频编码器为 H.264
  23.                 recorder.setSampleRate(grabber.getSampleRate());  // 设置音频采样率
  24.                 recorder.setFrameRate(grabber.getFrameRate()); //设置视频帧率
  25.                 recorder.setVideoBitrate(3000000);  // 设置视频比特率为 3 Mbps(根据需要调整)
  26. //                recorder.setVideoQuality(0);  // 设置视频质量参数(0为最高质量)
  27. //                recorder.setAudioQuality(0);  // 设置音频质量参数(0为最高质量)
  28.                 recorder.setGopSize((int) (grabber.getFrameRate()*2));
  29.                 recorder.setPixelFormat(avutil.AV_PIX_FMT_YUV420P);
  30.                 recorder.setVideoOption("tune", "zerolatency"); // 降低编码延迟
  31.                 recorder.setVideoOption("preset", "superfast"); // 提升编码速度
  32.                 recorder.start(ifmt_ctx);  // 启动推流器
  33.                 Frame frame;
  34.                 count=0;
  35.                 long t1 = System.currentTimeMillis();
  36.                 AVPacket packet;
  37.                 while (running &&(packet = grabber.grabPacket()) != null) {
  38.                     count++;
  39.                     recorder.recordPacket(packet);
  40. //                    if ((System.currentTimeMillis() - t1) > RECORD_LENGTH) {
  41. //                        break;
  42. //                    }
  43.                     if (count % 100 == 0) {
  44.                         // 处理每帧
  45.                         log.info("packet推流帧====>" + count);
  46.                     }
  47.                 }
  48.             }
复制代码
4.结语

 搭建nginx-rtmp可以看看搭建nginx-rtmp,搭建完成后,nginx-rtmp可以提供HLS的url以供前端播放,也可以使用rtmp协议的url播放,只不过rtmp协议的现在的浏览器基本不支持播放了
当地实测延迟大概在5秒内,一般3秒左右
其实刚开始用的是别人代码,固然也能实现视频预览,但是光一个摄像头进行推流就占了40%的cpu,性能斲丧太多了,后来改了一下javaCV的设置,现在4核8G的服务器实测开启一个摄像头推流仅占1%cpu,cpu占用下降了不少
有些问题,
1.假如你拉的流剖析没有音频通道(为0)的话,nginx-rtmp是不会天生.m3u8和ts文件的,无法天生播放hls的文件那么就只能用rtmp协议的url播放了 或者 手动添加音频。。。
2.假如运行出现Pipe closed非常,那么你应该找非常栈栈顶出现的非常,栈顶非常会导致流被关闭,但主线程会一直向流内里写入数据,以是会导致出现一大串Pipe closed
3.源码中依赖的lib文件内里动态链接库最好不要修改相对位置。.dll是windows系统运行需要的,.so是linux系统需要的





免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表