首页 > 其他分享 >HTML5 播放 RTSP 视频

HTML5 播放 RTSP 视频

时间:2022-12-28 16:15:17浏览次数:62  
标签:RTSP console log url express HTML5 播放 ffmpeg

HTML5 播放 RTSP 视频

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

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

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

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

方案协议视频格式延迟离线事件汇报最小端口占用依赖
1 HLS ogg 网络延迟较高,可达10秒以上 n VLC + video.js
2 RTMP flv 网络延迟较低,5秒左右 n ffmpeg + nginx + flash + video.js
3 WebSocket mpegts 网络延迟很低,渲染速度慢 1 ffmpeg + express + jsmpeg
4 HTTP-FLV flv 网络延迟很低,渲染速度快 1 ffmpeg + express + flv.js

我对这四种方式都进行了实现,整体效果最好的还是第4种方案,占用端口少,延迟低,渲染速度快,而且离线事件易于处理。

基于 flv.js 的 RTSP 播放方案

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

服务器端(主进程)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
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 的输出,而不是启动一个新的 ffmpeg 进程串流。

浏览器端(渲染进程)

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<template>
<div>
<video class="demo-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-width: 480px;
max-height: 360px;
}
</style>

 

标签:RTSP,console,log,url,express,HTML5,播放,ffmpeg
From: https://www.cnblogs.com/Jishuyang/p/17010337.html

相关文章

  • 多款音乐播放器代码二
    <代码1><EMBEDsrc="http://www.1zen.com/share/禅友共享区/太委屈-陶晶莹.mp3"width=320height=40type=audio/x-pn-realaudio-plugincontrols="ControlPanel"loop="t......
  • 【技术分享】如何实现功能完备性能优异的RTMP、RTSP播放器?
     技术背景这几年,我们对接了太多有RTSP或RTMP直播播放器诉求的开发者,他们当中除了寻求完整的解决方案的,还有些是技术探讨,希望能借鉴我们播放端的开发思路或功能特性,完善自己......
  • LVGL视频播放界面实现方法
    1.主题LVGL视频播放界面实现方法2.问题背景使用LVGL开发且需要在UI下显示视频或者显示摄像头数据,但是不知道如何实现,要么是只显示UI,要么就只显示视频。3.具体表现可以......
  • cocos2d-x IOS 和Android播放视频(包括网络视频)
    一. 播放本地视频    对于IOS平台的视频播放,我们可以借助Cocos2d-iphone的Extensions:CCVideoPlayer来实现   1.导入支持cocos2d-x的扩展库到项目中(这里可以......
  • iOS使用ffmpeg播放rstp实时监控视频数据流
    一、编译针对iOS平台的ffmpeg库(kxmovie)近期有一个项目,需要播放各种格式的音频、视频以及网络摄像头实时监控的视频流数据,经过多种折腾之后,最后选择了kxmovie,kxmovie项目已......
  • 常用网页播放器代码(1)
    WMP加入了ActiveX解码器控件,不仅可以放曲子,还能放Flash和其它视频文件<objectalign=middleclassid="CLSID:22d6f312-b0f6-11d0-94ab-0080c74c7e95"class=OBJECTid=Med......
  • HTML5和CSS3的一些新特性-视屏,语音,表单,选择器,伪类,结构,before和after选择器,iconmoon 字
    HTML5和CSS3的一些新特性-视屏,语音,表单,选择器,伪类,结构,before和after选择器,iconmoon字体使用方法Html5:1.HTML5新增语义化标签<!DOCTYPEhtml><htmllang="en"><head>......
  • IMX6 长时间播放1080P 中途停止
    原因还是播放视频导致芯片温度过高。用IMX6播放720P测试芯片温度竟然能叨叨81度,一般是七十多度。晚点加上散热片测试。下面是搜的两篇有关的文章。​​https://github.com/......
  • 调用OpenSL ES NDK播放声音
    AndroidNDK给出了native-audio的例子,这个例子结合java代码,讲解了如何使用OpenSL播放声音。我把此例子进行了精简,完全使用c,可以让我们更好的体会到OpenSL的用法,不多说,上代......
  • 使用opensl 的BufferQueueAudioPlayer对wav文件的播放
    创建音频引擎之后,读取wav文件到内存,然后使用BufferQueueAudioPlayer进行播放。这里在读取wav文件的时候需要对wav文件的前44个类似头信息进行解析,然后在进行播放的时候,在......