html5 播放 rtsp

摘要:
从“express”导入*asexpress;functionlocalServer(){letapp=express();app.use(express.static(__dirname));true});rtspRequestHandle)app.listent(8888);尝试{ffmpeg(url).addInputOption(“-rtsp_transport”,

目前大多数网络摄像头都是通过 RTSP 协议传输视频流的,但是 html 并不标准支持 RTSP 流。除了 Firefox 浏览器可以直接播放 RTSP 流之外,几乎没有其他浏览器可以直接播放 RTSP 流。Electron 应用是基于 Chromium 内核的,因此也不能直接播放 RTSP 流。

在借助一定工具的情况下,可以实现在 Web 页面上播放 RTSP 流。本文介绍的方法可以应用于传统 Web 应用和 Electron 应用中,唯一的区别是将 Electron 应用的主进程当作传统 Web 应用的服务器。

目前已有 RTSP 播放方案的对比

既然是做直播,就需要延迟较低。当摄像头掉线时,也应当有一定的事件提示。处于这两点,对目前已有的已经实现、无需购买许可证的 RTSP 播放方案进行对比(处于原理阶段的暂时不分析)。

html5 播放 rtsp第1张

基于 flv.js 的 RTSP 播放方案

flv.js是 Bilibili 开源的一款 html5 浏览器。依赖于 Media Source Extension 进行视频播放,视频通过 HTTP-FLV 或 WebSocket-FLV 协议传输,视频格式需要为 FLV 格式。

服务器端(主进程)

服务器端采用 express + express-ws 框架进行编写,当有 HTTP 请求发送到指定的地址时,启动 ffmpeg 串流程序,直接将 RTSP 流封装成 FLV 格式的视频流,推送到指定的 WebSocket 响应流中。

import * as express from "express";
import * as expressWebSocket from "express-ws";
import ffmpeg from "fluent-ffmpeg";
import webSocketStream from "websocket-stream/stream";
import WebSocket from "websocket-stream";
import * as http from "http";

function localServer() {
    let app = express();
    app.use(express.static(__dirname));
    expressWebSocket(app, null, {
        perMessageDeflate: true
    });
    app.ws("/rtsp/:id/", rtspRequestHandle)
    app.listen(8888);
    console.log("express listened")
}

function rtspRequestHandle(ws, req) {
    console.log("rtsp request handle");
    const stream = webSocketStream(ws, {
        binary: true,
        browserBufferTimeout: 1000000
    }, {
        browserBufferTimeout: 1000000
    });
    let url = req.query.url;
    console.log("rtsp url:", url);
    console.log("rtsp params:", req.params);
    try {
        ffmpeg(url)
            .addInputOption("-rtsp_transport", "tcp", "-buffer_size", "102400")  // 这里可以添加一些 RTSP 优化的参数
            .on("start", function () {
                console.log(url, "Stream started.");
            })
            .on("codecData", function () {
                console.log(url, "Stream codecData.")
          			// 摄像机在线处理
            })
            .on("error", function (err) {
                console.log(url, "An error occured: ", err.message);
            })
            .on("end", function () {
                console.log(url, "Stream end!");
          			// 摄像机断线的处理
            })
            .outputFormat("flv").videoCodec("copy").noAudio().pipe(stream);
    } catch (error) {
        console.log(error);
    }
}

为了实现较低的加载时间,可以为 ffmpeg 添加如下参数:

  • analyzeduration 可以降低解析码流所需要的时间
  • max_delay 资料上写的具体作用不太记得了,效果没有 analyzeduration 明显

当然这个实现还比较粗糙。当有多个相同地址的请求时,应当增加 ffmpeg 的输出,而不是启动一个新的 ffmpeg 进程串流。

浏览器端(渲染进程)

示例使用 vue 框架进行页面设计。

广州vi设计公司 http://www.maiqicn.com我的007办公资源网 https://www.wode007.com

<template>
    <div>
        <video ref="player"></video>
    </div>
</template>

<script>
import flvjs from "flv.js";
export default {
    props: {
        rtsp: String,
        id: String
    },
    /**
     * @returns {{player: flvjs.Player}}
     */
    data () {
        return {
            player: null
        }
    },
    mounted () {
        if (flvjs.isSupported()) {
            let video = this.$refs.player;
            if (video) {
                this.player = flvjs.createPlayer({
                    type: "flv",
                    isLive: true,
                    url: `ws://localhost:8888/rtsp/${this.id}/?url=${this.rtsp}`
                });
                this.player.attachMediaElement(video);
                try {
                    this.player.load();
                    this.player.play();
                } catch (error) {
                    console.log(error);
                };
            }
        }
    },
    beforeDestroy () {
        this.player.destory();
    }
}
</script>

<style>
    .demo-video {
        max- 480px; 
        max-height: 360px;
    }
</style>

免责声明:文章转载自《html5 播放 rtsp》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇接口测试中,json格式的报文发送时提示报文格式错误adb 环境配置 常用命令 [MD]下篇

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

相关文章

Qt 调用本地浏览器打开URL

点击Qt某些控件,查找本地浏览器打开前端传递的URL。 方法一:直接写死本地浏览器地址 1 QString programAdress = "C:Program Files (x86)GoogleChromeApplicationchrome.exe" 2 QString m_strWebUrl = "http://www.baidu.com"; 3 QS...

Django【第2篇】:Django之反向解析

Django框架之第二篇 一、知识点回顾 1、MTV模型   model:模型,和数据库相关的   template:模板,存放html文件,模板语法(目的是将变量如何巧妙的嵌入到HTML页面中)。   views:视图函数 另加urls:url路径与视图函数的映射关系,,可以不是一一对应的。 2、相关的一些命令   创建一个Django项目:dja...

Django第四章、 url配置

目录 一 URL配置 基本格式 参数说明 二 正则表达式详解 基本配置 注意事项 补充说明 三 分组命名匹配 URLconf匹配的位置 捕获的参数永远都是字符串 视图函数中指定默认值 include其他的URLconfs(也叫URL分发) 一 URL配置 Django 1.11版本 URLConf官方文档 URL配置(URLconf)就像Djang...

Gradle在Mac上安装及Idea中配置

前言 笔者在安装Gradle的过程中发现过程有点繁琐且安装教程比较少,因此记录一下安装过程,方便同行参考 环境信息 macOS:10.15.5IntelliJ IDEA:2020.3Gradle:6.8.2Java:1.8.0_151Homebrew: 3.0.1 进入Gradle官网 点此进入Gradle官网 点击安装 安装文档 包管理安装 安装b...

HTTP协议--MyWebServer

HTTP协议 HTTP协议是一种Web通信协议,通过特定的规则来实现服务器跟客户端的通信。HTTP协议有这样几个特点: (1)面向无连接的,一次只能处理一个请求,HTTP1.0服务器解析完客户端请求并作出应答后,会关闭连接;对于HTTP1.1应答后会等待一个非常短的时间,如果这段时间没有新请求,就会关闭连接。 (2)HTTP协议是无状态的,即对处理过的事务...

firefox插件-HackBar介绍与试用

This toolbar will help you in testing sql injections, XSS holes and site security. It is NOT a tool for executing standard exploits and it will NOT teach you how to hack a site. I...