华为海康大华摄像头编译RTSP转RTMP和HTTPFLV

本文介绍了在谷歌浏览器不支持RTSP流的情况下,通过Java+FFmpeg将RTSP转换为RTMP流和HTTP-FLV流的两种方案。方案一使用Java+nginx+rtsp转rtmp流,但因Flash支持停止而不再适用;方案二利用Java+Nginx-http-flv-module+FFmpeg+Flv.js将RTSP转为FLV流,实现在Vue项目中的播放,延迟约为7秒。该方案在Web端通过vue和flv.js实现,并提供了相关代码示例。

项目需求要看摄像头实时画面谷歌浏览器不支持RTSP流直接展示

因为开发一般用的都是谷歌浏览器但是谷歌浏览器不支持rtsp流直接转化视频,就靠着网上的博文一直尝试 最终总结了一套流程 自学

方案一 通过Java+nginx+rtsp转rtmp流

直接进入主题,第一次尝试通过Javacv + nginx-moudle-temp (下边放地址) 直接转rtmp流
原文地址 原文地址

因为nginx+rtmpMoudles需要编译 我把地址放到云上下载解压 双击nginx.exe就能使用 配置无需修改

所需依赖

	<!-- javacv1.5.1 -->
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>javacv</artifactId>
			<version>1.5.1</version>
		</dependency>
		<dependency>
			<groupId>org.bytedeco</groupId>
			<artifactId>ffmpeg-platform</artifactId>
			<version>4.1.3-1.5.1</version>
		</dependency>

Java代码如下:

	/**
     *
     * @param  rtmpPath 推流地址 rtmp://127.0.0.1:1935/live/(这个地方写不写都行自己琢磨吧)
     *         rtspPath rtsp流地址
     *         audioRecord 是否录制  0= 不录制 1=录制
     *         saveVideo  是否保存视频
     * @return
     */
 public static void test(String rtmpPath,String rtspPath,int audioRecord,boolean saveVideo ) throws Exception  {
        //FrameGrabber grabber = FrameGrabber.createDefault(0); // 本机摄像头 默认
        // 使用rtsp的时候需要使用 FFmpegFrameGrabber,不能再用 FrameGrabber
        int width = 640,height = 480;
        FFmpegFrameGrabber grabber = FFmpegFrameGrabber.createDefault(rtspPath);
        grabber.setOption("rtsp_transport", "tcp"); // 使用tcp的方式,不然会丢包很严重
        // 一直报错的原因!!!就是因为是 2560 * 1440的太大了。。
        grabber.setImageWidth(width);
        grabber.setImageHeight(height);
        System.out.println("grabber start");
        grabber.start();
        //FrameRecorder recorder = FrameRecorder.createDefault(rtmpPath, 640,480,0);
        // 流媒体输出地址,分辨率(长,高),是否录制音频(0:不录制/1:录制)
        FFmpegFrameRecorder recorder = new FFmpegFrameRecorder(rtmpPath, width, height, audioRecord);
        recorder.setInterleaved(true);
        recorder.setVideoOption("crf","28");
        recorder.setVideoCodec(avcodec.AV_CODEC_ID_H264); // 28
        recorder.setFormat("flv"); // rtmp的类型
        recorder.setFrameRate(25);
        recorder.setPixelFormat(0); // yuv420p
        System.out.println("recorder start");
        recorder.start();
        //
        OpenCVFrameConverter.ToIplImage conveter = new OpenCVFrameConverter.ToIplImage();
        System.out.println("all start!!");
        int count = 0;
        while(!exit){
            count++;
            Frame frame = grabber.grabImage();
            if(frame == null){
                continue;
            }
            if(count % 100 == 0){
                System.out.println("count="+count);
            }
            recorder.record(frame);
        }
        grabber.stop();
        grabber.release();
        recorder.stop();
        recorder.release();
    }

因为这个方案转出来的流是rtmp 这个流需要配合flash使用 在2020年年底
谷歌就停止了对flash的支持所以这个方案被pass
代码亲测可用 因为不是通过中间件转流是通过 Java封装的FFmpeg转的所以延迟测试在19秒左右

方案二 通过Java+ Nginx-http-flv-module + FFmpeg + Flv.js 实现rtsp转flv在vue项目中 (采用)

因为在第一个方案中rtmp流在谷歌浏览器中无法播放 所以改变方案

  1. 部署所需的软件 FFmpeg在官网上下载配置下环境变量就行了如下图就是配置成功
    能查到版本就代表已经成功百分之九十了
  2. 部署 Nginx-http-flv-module这是源码地址 自己编译一下就好了 启动之后配置下配置文件
    编译好的nginx 这里边最低C币 好像会自动累加先到先得吧 解压启动就能用
    以我的为例:
    这个在http server下边 这个是flv的配置 获取到rtmp之后转为flv
 location /flv {
            flv_live on;
            chunked_transfer_encoding on;
			add_header 'Access-Control-Allow-Credentials' 'true'; #add additional HTTP header
			add_header 'Access-Control-Allow-Origin' '*'; #add additional HTTP header
			add_header Access-Control-Allow-Headers X-Requested-With;
			add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
			add_header 'Cache-Control' 'no-cache';
        }

        location /hls {      
		   add_header Access-Control-Allow-Origin *;
           types{    
             application/vnd.apple.mpegurl m3u8;    
             video/mp2t ts;    
           }    
        alias /test;    
        expires -1;    
        }
        
        location /stat {
            rtmp_stat all;
            rtmp_stat_stylesheet stat.xsl;
        }

        location /stat.xsl {
            root html/nginx-http-flv-module/;
        }

        location /control {
            rtmp_control all;
        }

        location /rtmp-publisher {
            root html/nginx-http-flv-module/test;
        }

这个在外边 因为是通过rtsp转rtmp


rtmp {  
    server {  
        listen 1935;  
        chunk_size 4000;  
        application hls { 
            live on;
            hls on;
            hls_path /test;
            hls_fragment 1s;
        }  
    }  
}

3.配置完成之后跟第一个方案一样 测试安装好没有 双击nginx.exe 看下后台进程 如果有nginx 呢就是正常启动 如果没有看下log里边的报错信息 我的没有出问题
4.通过Java拼接FFmpeg命令 将rtsp通过FFmpeg转为rtmp 推流到nginx 。FFmpeg命令自行百度
代码:

	/**
     * 推送到nginx的流地址按照自己配置的信息进行拼接不是固定的
     * @param  nginxRtmpUrl 推流地址 rtmp://127.0.0.1:1935/hls/rtmpStream
     *         rtspUrl rtsp流地址 
     * @return
     */
  public static Integer pushVideoAsRTSP(String rtspUrl, String nginxRtmpUrl) {
        int flag = -1;
        try {
            String command = "ffmpeg ";
            command += " -re -rtsp_transport tcp -i " + rtspUrl;
            command += " -f flv -vcodec libx264 -vprofile baseline -acodec aac -ar 44100 -strict -2 -ac 1 -f flv -s 800x600 -q 10 " + nginxRtmpUrl;
            System.out.println("ffmpeg推流命令:" + command);

            Process process = Runtime.getRuntime().exec(command);
            BufferedReader br = new BufferedReader(new InputStreamReader(process.getErrorStream()));
            String line = "";
            while ((line = br.readLine()) != null) {
                System.out.println("视频推流信息[" + line + "]");
            }
            flag = process.waitFor();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return flag;
    }

5.运行这个方法之后会出现可以通过vlc进行测试rtmp流地址 如果rtmp能显示画面 往下进行测试自行拼接flv地址 地址按照上边nginx配置文件进行配置

http://127.0.0.1:18080/flv?app=hls&stream=rtmpStream

6.web端通过vue实现
安装flv.js

npm install --save flv.js

全局引用的话放到main.js
我没有全局引用直接上vue全部代码

 <video id="videoElement" controls autoplay muted width="800px" height="400px"></video>
import flvjs from "flv.js"
  export default {
    data() {
      return {
        flvPlayer: null
      }
    },
    mounted() {
      if (flvjs.isSupported()) {
        var videoElement = document.getElementById('videoElement');
        this.flvPlayer = flvjs.createPlayer({
          type: 'flv',
          isLive: true,
          hasAudio: false,
          url: 'http://127.0.0.1:18080/flv?app=hls&stream=rtmpStream'
        });
        this.flvPlayer.attachMediaElement(videoElement);
        this.flvPlayer.load();
        this.flvPlayer.play();
      }
    }
   }

flv测试用的demo

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>播放页面</title>
    </head>
    <body>
        <script src="https://cdn.bootcdn.net/ajax/libs/flv.js/1.5.0/flv.min.js"></script>
        <video style="height: 400px;width: 600px;" id="videoElement" muted autoplay controls></video>
        <script>
            var flvPlayer = null;
            if (flvjs.isSupported()) {
                var videoElement = document.getElementById('videoElement');
                flvPlayer = flvjs.createPlayer({
                    type: 'flv',
                    // 8080 对应Nginx监听的端口
                    // rtmpLive 对应Nginx的路径
                    url: 'http://127.0.0.1:18080/flv?app=hls&stream=rtmpStream'
                });
                flvPlayer.attachMediaElement(videoElement);
                flvPlayer.load();
            }
        </script>
    </body>
</html>

延迟刷新之后七秒 但是web端不稳定 延迟会越来越大
延迟在七秒

推流时间一小时二十分钟 流还是很稳定 vlc 延迟一直稳定在十秒左右
在这里插入图片描述

推流时间一小时二十一分钟
上边有些代码是从网上找到 我也忘了出处在哪 侵删
这些方法延迟比较高 如果对延迟有比较严格的 我觉得可以研究下vlc在软硬件上边下手 可能会比较好点

<think>好的,我需要回答用户关于几个主流摄像头厂商(大华海康华为、宇视、柯达)的RTSP地址模板的问题。首先,我得回顾之前用户的提问,确保这次回答符合之前的格式系统级指令。之前用户问了一个RTSP URL的结构解析,现在用户进一步询问不同品牌的模板,所以需要提供具体的URL格式,并保持结构清晰。 首先,我需要确认每个品牌的RTSP模板。大华海康的模板我之前已经部分涉及,可能需要更详细。华为、宇视柯达的模板可能需要查阅资料,确保准确性。需要注意柯达可能不是安防领域的主流品牌,用户可能是指其他品牌,但假设用户指的是柯达的摄像头。 接下来,要确保每个模板的变量替换部分正确,比如用户名、密码、IP、通道、码流类型等。同时,需要指出每个参数的用途,例如通道号、子类型(主码流或子码流)、端口号等。此外,要提醒用户常见的变量名,如${username}、${password}、${ip}等,并可能存在的默认值,比如海康的默认端口554是否需要显式写出。 然后,检查是否有常见的错误点,比如参数之间的分隔符是&还是&,在URL中需要正确义。例如,在之前的回答中,用户示例里用了\&,但实际URL中应该用&,不过在Markdown中可能需要义,所以需要注意显示正确。 还要考虑用户可能的后续问题,例如如何测试这些URL,推荐使用VLC等工具,或者如何处理连接问题,如认证失败、端口阻塞等。此外,是否需要提到ONVIF协议作为替代方案,但用户没有提到,可能暂时不需要。 需要确保每个品牌的模板正确无误。例如,大华RTSP路径是否是/cam/realmonitor,海康的是/ISAPI/Streaming/channels/,或者是否有不同的路径结构。可能需要确认最新的资料,因为不同型号或固件版本可能有差异。 对于华为宇视,他们的RTSP路径可能有不同的命名,例如华为可能有/livestream/,宇视可能有/stream/等。柯达作为可能不太常见的品牌,可能需要查找其文档或常见模板,如果找不到,可能需要注明信息较少,建议参考官方文档。 最后,整理结构,按品牌分点,每个品牌下给出模板、参数解释、示例,以及注意事项。确保使用正确的LaTeX格式,行内公式用$,独立公式用$$,并且正确义符号,如&在URL中需写成&,但在LaTeX中可能需要用\&,需要确认显示正确。 可能还需要验证每个模板的正确性,例如海康的通道子流参数是否为101、102等,或者是否有不同的编号方式。例如,海康的主码流可能是101,子码流是102,对应到URL中的参数可能不同,需要确保正确。 总结步骤: 1. 收集各品牌的标准RTSP模板。 2. 结构化为分点,每个品牌包括模板、参数说明、示例、注意事项。 3. 确保LaTeX格式正确,变量使用$...$包裹。 4. 检查参数是否正确,如通道号、码流类型等。 5. 添加常见问题或测试建议。 6. 最后通读,确保符合用户之前的交互风格,结构清晰,信息准确。</think>以下是主流监控设备厂商的**RTSP视频流地址模板**及参数解析,适用于大华(Dahua)、海康威视(Hikvision)、华为(Huawei)、宇视(Uniview)等设备。柯达(Kodak)在安防领域较少见,暂未提供标准模板。 --- ### **1. 大华(Dahua)** #### 模板格式: ```plaintext rtsp://${username}:${password}@${ip}:${port}/cam/realmonitor?channel=${channel}&subtype=${subtype} ``` #### 参数说明: - **${username}**: 设备登录用户名(默认`admin`) - **${password}**: 设备登录密码(默认空或`admin`) - **${ip}**: 设备IP地址(如`192.168.1.100`) - **${port}**: RTSP端口(默认`554`,可省略) - **${channel}**: 摄像头通道号(从`1`开始) - **${subtype}**: 码流类型(`0`=主码流高清,`1`=子码流低清) #### 示例: $$rtsp://admin:123456@192.168.1.100/cam/realmonitor?channel=1\&subtype=0$$ --- ### **2. 海康威视(Hikvision)** #### 模板格式: ```plaintext rtsp://${username}:${password}@${ip}:${port}/ISAPI/Streaming/channels/${channel}${subtype} ``` #### 参数说明: - **${channel}**: 通道号(从`1`开始,格式为`101`、`102`等,例如`101`表示通道1) - **${subtype}**: 码流类型(`01`=主码流,`02`=子码流) #### 示例: $$rtsp://admin:123456@192.168.1.100:554/ISAPI/Streaming/channels/101$$ --- ### **3. 华为(Huawei)** #### 模板格式: ```plaintext rtsp://${username}:${password}@${ip}:${port}/LiveMedia/ch${channel}/${subtype} ``` #### 参数说明: - **${channel}**: 通道号(从`1`开始) - **${subtype}**: 码流类型(`1`=主码流,`2`=子码流) #### 示例: $$rtsp://admin:huawei@123@10.0.0.2/LiveMedia/ch1/1$$ --- ### **4. 宇视(Uniview)** #### 模板格式: ```plaintext rtsp://${username}:${password}@${ip}:${port}/video=${channel},${subtype} ``` #### 参数说明: - **${channel}**: 通道号(从`1`开始) - **${subtype}**: 码流类型(`0`=主码流,`1`=子码流) #### 示例: $$rtsp://admin:uniview@192.168.1.100:554/video=1,0$$ --- ### **5. 柯达(Kodak)** 柯达在监控领域非主流品牌,其RTSP流地址无统一标准。建议参考以下通用模板尝试: ```plaintext rtsp://${username}:${password}@${ip}:${port}/stream=channel${channel} ``` --- ### **通用注意事项** 1. **默认端口**:RTSP默认端口为`554`,若未显式声明则自动附加。 2. **特殊符号义**:密码含`@`、`:`等符号时需URL编码(如`@`→`%40`)。 3. **码流选择**: - 主码流(高清):带宽高、延迟低,适合本地存储。 - 子码流(低清):带宽低、延迟稍高,适合远程预览。 4. **测试工具**:使用VLC播放器输入URL验证连通性。 --- 如需具体设备调试,建议查阅厂商的**官方开发文档**或联系技术支持。
评论 10
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值