愤怒的大香蕉 2025-07-23 16:54 采纳率: 7.7%
浏览 28

uniapp 使用海康硬盘录像机无websocket功能,实现登录,获取通道,预览

uniapp 使用海康硬盘录像机无websocket功能,实现登录,获取通道,预览

  • 写回答

4条回答 默认 最新

  • 檀越@新空间 2025-07-23 16:55
    关注

    下午好🌅🌅🌅
    本答案参考通义千问

    UniApp 中使用 海康硬盘录像机(DVR) 时,如果该设备不支持 WebSocket 功能,那么传统的通过 WebSocket 实现视频预览的方式将无法直接应用。此时,我们需要寻找其他方式来实现登录、获取通道信息以及视频预览功能。


    ✅ 问题分析

    海康的 DVR 设备通常提供以下接口:

    • HTTP API 接口:用于设备管理、获取通道列表等
    • GB28181 协议:用于视频流传输(部分设备支持)
    • RTSP 协议:用于视频流传输(大多数设备支持)

    WebSocket 不支持,因此不能通过 WebSocket 获取视频流。


    🧠 解决方案思路

    1. 使用 HTTP API 登录并获取通道信息

    海康设备一般提供基于 HTTP 的 RESTful API,可以用来进行设备登录和获取通道列表。

    示例 API:

    | 请求类型 | URL | 说明 | |----------|-----|------| | GET | http://[IP]/ISAPI/Security/Authentication/login | 登录 | | GET | http://[IP]/ISAPI/ContentMgmt/ChannelInfo | 获取通道信息 | | GET | http://[IP]/ISAPI/Streaming/channels/[channelId]/mediaInfo | 获取媒体信息(如 RTSP 地址) |

    ⚠️ 注意:需要处理 Cookie 或 Token,确保登录状态有效。


    2. 使用 RTSP 协议实现视频预览

    即使没有 WebSocket,也可以通过 RTSP 协议 来播放视频流。在 UniApp 中,可以通过 video 组件加载 RTSP 地址。

    ✅ 注意:部分平台(如 H5)可能不支持 RTSP 播放,需使用第三方库或转码服务。


    🛠️ 实现步骤(详细)

    1. 登录设备

    // uniapp 中使用 uni.request 发起请求
    uni.request({
      url: 'http://[IP]/ISAPI/Security/Authentication/login',
      method: 'GET',
      header: {
        'Authorization': 'Basic ' + btoa('admin:123456') // 基本认证
      },
      success: (res) => {
        console.log('登录成功', res);
        // 存储 session 或 token
      },
      fail: (err) => {
        console.error('登录失败', err);
      }
    });
    

    🔐 注意:实际开发中应避免硬编码密码,建议通过后端中转。


    2. 获取通道信息

    uni.request({
      url: 'http://[IP]/ISAPI/ContentMgmt/ChannelInfo',
      method: 'GET',
      header: {
        'Cookie': 'JSESSIONID=your-session-id' // 登录后获取的 session
      },
      success: (res) => {
        const channels = res.data.ChannelList;
        console.log('通道列表:', channels);
      }
    });
    

    3. 获取 RTSP 流地址

    uni.request({
      url: 'http://[IP]/ISAPI/Streaming/channels/[channelId]/mediaInfo',
      method: 'GET',
      header: {
        'Cookie': 'JSESSIONID=your-session-id'
      },
      success: (res) => {
        const rtspUrl = res.data.MediaInfo.StreamURI;
        console.log('RTSP 地址:', rtspUrl);
      }
    });
    

    4. 在页面中播放视频(使用 video 组件)

    <template>
      <view>
        <video :src="rtspUrl" autoplay />
      </view>
    </template>
    
    <script>
    export default {
      data() {
        return {
          rtspUrl: ''
        };
      },
      mounted() {
        this.fetchRtspUrl();
      },
      methods: {
        fetchRtspUrl() {
          uni.request({
            url: 'http://[IP]/ISAPI/Streaming/channels/[channelId]/mediaInfo',
            method: 'GET',
            header: {
              'Cookie': 'JSESSIONID=your-session-id'
            },
            success: (res) => {
              this.rtspUrl = res.data.MediaInfo.StreamURI;
            }
          });
        }
      }
    };
    </script>
    

    ⚠️ 注意:H5 环境下可能不支持 RTSP,可考虑使用 FFmpeg 转码为 HLS 或 RTMP,再通过 video 组件播放。


    🧩 补充建议

    1. 使用后端代理

    由于 UniApp 在浏览器中运行时可能存在跨域限制,建议使用后端(如 Node.js、Nginx)作为代理,转发请求到海康设备。

    2. RTSP 转 HLS

    对于 H5 环境,推荐使用 FFmpeg 将 RTSP 转成 HLS 格式:

    ffmpeg -i rtsp://[IP]/live/1 -c:v h264 -preset ultrafast -f hls -hls_time 4 -hls_playlist_type vod index.m3u8
    

    然后在 UniApp 中播放:

    <video :src="hlsUrl" autoplay />
    

    📌 总结

    | 步骤 | 方法 | 说明 | |------|------|------| | 1 | HTTP API 登录 | 通过 Basic Auth 或 Session 认证 | | 2 | 获取通道信息 | 使用 ISAPI 接口获取通道列表 | | 3 | 获取 RTSP 地址 | 通过 MediaInfo 获取视频流地址 | | 4 | 视频播放 | 使用 video 组件播放 RTSP 或 HLS 流 |


    ✅ 最终建议

    • 优先使用 RTSP,若 H5 不支持,考虑使用 HLS 转码
    • 安全第一,避免在前端暴露设备 IP 和密码。
    • 使用后端中转,提高安全性与兼容性。

    如有具体设备型号或接口文档,可进一步优化代码逻辑。欢迎提供更多细节,我可以帮你定制化实现。

    评论

报告相同问题?

问题事件

  • 创建了问题 7月23日