当前位置:   article > 正文

14 rtsp视频服务 基于 RTSPtoWeb 来转换为前端可用的服务

rtsptoweb

前言

接前面两篇文章 rtsp视频服务 转换为 rtmp服务 转换为前端可用的服务rtsp视频服务 基于node+ffmpeg 转换为 flv 视频服务 

继续讨论 前端播放 rtsp 视频服务  

这里使用 GitHub - deepch/RTSPtoWeb: RTSP Stream to WebBrowser 作为后台服务, 来做 rtsp 视频服务的转换, 它可以转换为 hls, hls-ll, websocket, webrtc, rtsp 的服务 

RTSPToWeb 服务的启动

这里基于 docker 启动 

  1. version: "2"
  2. services:
  3. rtsp-2-web:
  4. container_name: rtsp-2-web
  5. image: ghcr.io/deepch/rtsptoweb:latest
  6. restart: always
  7. ports:
  8. - 8083:8083
  9. - 5541:5541
  10. volumes:
  11. - ./config:/config

配置 /config/config.json 

  1. {
  2. "server": {
  3. "debug": true,
  4. "log_level": "info",
  5. "http_demo": true,
  6. "http_debug": false,
  7. "http_login": "demo",
  8. "http_password": "demo",
  9. "http_port": ":8083",
  10. "ice_servers": [
  11. "stun:stun.l.google.com:19302"
  12. ],
  13. "rtsp_port": ":5541"
  14. },
  15. "streams": {
  16. "hls": {
  17. "name": "test_rtps",
  18. "channels": {
  19. "test_rtps": {
  20. "name": "test_rtps",
  21. "url": "rtsp://192.168.0.104:8554/rtsp/test_rtsp",
  22. "on_demand": true,
  23. "debug": false,
  24. "audio": true,
  25. "status": 0
  26. }
  27. }
  28. }
  29. },
  30. "channel_defaults": {
  31. "on_demand": true
  32. }
  33. }

启动 RTSPToWeb 

  1. master:rtsp-2-web jerry$ docker-compose up -d
  2. WARNING: The TIME_ZONE variable is not set. Defaulting to a blank string.
  3. Creating network "rtsp-2-web_default" with the default driver
  4. Creating rtsp-2-web ... done

配置的 rtsp 的各种访问方式如下 

  1. hls : http://localhost:8083/stream/hls/channel/test_rtps/hls/live/index.m3u8
  2. hls-ll : http://localhost:8083/stream/hls/channel/test_rtps/hlsll/live/index.m3u8
  3. websocket : ws://localhost:8083/stream/hls/channel/test_rtps/mse?uuid=hls&channel=test_rtps
  4. webrtc : http://localhost:8083/stream/hls/channel/test_rtps/webrtc
  5. rtsp : rtsp://localhost:5541/hls/test_rtps

RTSPToWeb 的管理界面访问 rtsp 服务 

websocket 的可以正确的拿到数据并展示 

hls 可以拿到数据, 但是不能正确展示 

hls-ll 拿不到正确的数据, 并且不能正确展示 

webrtc 就搞不清楚什么状况了, 请求是 正确的, 没有持续的请求, 但是 播放不出来 

hls 的播放 

hls 访问的 url 为 http://localhost:8083/stream/hls/channel/test_rtps/hls/live/index.m3u8

但是这个 demo 里面展示不出来,  RTSPtoWeb 官方的 demo 也展示不出来, vlc 中也播放不出来, 但是能够看到进度信息  

但是 从接口上来看 是能够正确拿到数据的 

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <title>M3u8Usage</title>
  5. <meta charset="UTF-8">
  6. <meta name="renderer" content="webkit">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  8. <script src="https://cdn.staticfile.org/hls.js/1.1.2/hls.min.js"></script>
  9. <script src="https://cdn.staticfile.org/dplayer/1.26.0/DPlayer.min.js"></script>
  10. <style>
  11. #dplayer {
  12. width: 500px
  13. }
  14. </style>
  15. <script>
  16. function init() {
  17. const dp = new DPlayer({
  18. element: document.getElementById('dplayer'),
  19. video: {
  20. // pic: videoInfo.img, // 封面
  21. url: "http://localhost:8083/stream/hls/channel/test_rtps/hls/live/index.m3u8",
  22. type: 'customHls',
  23. customType: {
  24. customHls: function (video, player) {
  25. const hls = new Hls()
  26. hls.loadSource(video.src)
  27. hls.attachMedia(video)
  28. }
  29. }
  30. }
  31. })
  32. }
  33. </script>
  34. </head>
  35. <body onload="init()">
  36. <div>
  37. <div id="dplayer"></div>
  38. </div>
  39. </body>
  40. </html>

M3u8Usage.html 中接口数据请求正常, 但是 加载不出来

vlc 中可以看到进度条 

hls-ll 的播放

hls-ll 访问的是 http://localhost:8083/stream/hls/channel/test_rtps/hlsll/live/index.m3u8

但是这个 demo 里面展示不出来,  RTSPtoWeb 官方的 demo 也展示不出来, vlc 中可以播放不出来, 但是能够看到进度信息  

vlc 的播放

websocket 的播放

websocket 访问的是 ws://localhost:8083/stream/hls/channel/test_rtps/mse?uuid=hls&channel=test_rtps 

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. <style>
  6. body, center {
  7. padding: 0;
  8. margin: 0;
  9. }
  10. .v-container {
  11. width: 640px;
  12. height: 360px;
  13. border: solid 1px red;
  14. }
  15. video {
  16. width: 100%;
  17. height: 100%;
  18. }
  19. </style>
  20. </head>
  21. <body>
  22. <div class="v-container">
  23. <video id="player1" muted autoplay="autoplay" preload="auto" controls="controls">
  24. </video>
  25. </div>
  26. <script>
  27. let mseStreamingStarted = true
  28. let mseQueue = []
  29. let url = 'ws://localhost:8083/stream/hls/channel/test_rtps/mse?uuid=hls&channel=test_rtps'
  30. let mse = new MediaSource();
  31. document.getElementById("player1").src = window.URL.createObjectURL(mse);
  32. mse.addEventListener('sourceopen', function() {
  33. let ws = new WebSocket(url);
  34. ws.binaryType = "arraybuffer";
  35. ws.onopen = function(event) {
  36. console.log('Connect to ws');
  37. }
  38. ws.onmessage = function(event) {
  39. let data = new Uint8Array(event.data);
  40. if (data[0] == 9) {
  41. decoded_arr = data.slice(1);
  42. if (window.TextDecoder) {
  43. mimeCodec = new TextDecoder("utf-8").decode(decoded_arr);
  44. } else {
  45. mimeCodec = Utf8ArrayToStr(decoded_arr);
  46. }
  47. if(mimeCodec.indexOf(',')>0){
  48. videoSound=true;
  49. }
  50. mseSourceBuffer = mse.addSourceBuffer('video/mp4; codecs="' + mimeCodec + '"');
  51. mseSourceBuffer.mode = "segments"
  52. mseSourceBuffer.addEventListener("updateend", pushPacket);
  53. } else {
  54. readPacket(event.data);
  55. }
  56. };
  57. }, false);
  58. function pushPacket() {
  59. if (!mseSourceBuffer.updating) {
  60. if (mseQueue.length > 0) {
  61. packet = mseQueue.shift();
  62. mseSourceBuffer.appendBuffer(packet);
  63. } else {
  64. mseStreamingStarted = false;
  65. }
  66. }
  67. if (document.getElementById("player1").buffered.length > 0) {
  68. if (typeof document.hidden !== "undefined" && document.hidden && !videoSound) {
  69. document.getElementById("player1").currentTime = document.getElementById("player1").buffered.end((document.getElementById("player1").buffered.length - 1)) - 0.5;
  70. }
  71. }
  72. }
  73. function readPacket(packet) {
  74. if (!mseStreamingStarted) {
  75. mseSourceBuffer.appendBuffer(packet);
  76. mseStreamingStarted = true;
  77. return;
  78. }
  79. mseQueue.push(packet);
  80. if (!mseSourceBuffer.updating) {
  81. pushPacket();
  82. }
  83. }
  84. </script>
  85. </body>
  86. </html>

展示效果如下 

vlc 不支持播放 

webrtc 的播放

没有找到 合适的加载 http://localhost:8083/stream/hls/channel/test_rtps/webrtc 的方式 

vlc 不支持播放 

rtsp 的播放

rtsp 访问的是 rtsp://localhost:5541/hls/test_rtps

vlc 播放 

完  

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号