当前位置:   article > 正文

13 rtsp视频服务 基于node+ffmpeg 转换为 flv 视频服务_ffmpeg rtsp转flv

ffmpeg rtsp转flv

前言

接上一篇文章 rtsp视频服务 转换为 rtmp服务 转换为前端可用的服务

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

rtsp视频服务 转换为 rtmp服务 转换为前端可用的服务 会使用到 ffmpeg 来实现 rtsp 服务转换为 rtmp 服务, nginx-http-flv 来实现 rtmp 服务转换为 http-flv 服务, 因此 前端可以直接播放视频 

这里使用 node 作为后台服务, 使用 ffmpeg 基于 websocket 协议将 rtsp 直接转换为 前端可用的 flv 视频数据 

我们这里 参考的代码来自于 GitHub - LorinHan/flvjs_test: 采用flvjs实现摄像头直播

主要包含一个 node 作为代理服务器, 加上一个测试的前端项目 

node 代理服务器 

index.js 如下, 代码来自于 GitHub - LorinHan/flvjs_test: 采用flvjs实现摄像头直播 中的 index.js,并做了一定的调整 

服务启动步骤如下 

  1. npm install
  2. node index.js

其中的主要处理为, 启动一个 websocket 服务器, 代理 以 "/rtsp" 打头的 websocket 请求, 然后获取查询字符串中的 url, 基于 ffmpeg 将 rtsp 视频数据转换为 flv 视频数据, 然后 响应回去 

  1. ffmpeg -re -i $rtspUrl -rtsp_transport tcp -buffer_size 102400 -vcodec copy -an -f flv
  2. // 然后将转换之后的结果响应给 客户端
  1. var express = require("express");
  2. var expressWebSocket = require("express-ws");
  3. var ffmpeg = require("fluent-ffmpeg");
  4. ffmpeg.setFfmpegPath("ffmpeg");
  5. var webSocketStream = require("websocket-stream/stream");
  6. var WebSocket = require("websocket-stream");
  7. var http = require("http");
  8. // config
  9. let rtspServerPort = 9999
  10. function localServer() {
  11. let app = express();
  12. app.use(express.static(__dirname));
  13. expressWebSocket(app, null, {
  14. perMessageDeflate: true
  15. });
  16. app.ws("/rtsp/:id/", rtspRequestHandle)
  17. app.listen(rtspServerPort);
  18. console.log("express listened on port : " + rtspServerPort)
  19. }
  20. function rtspRequestHandle(ws, req) {
  21. console.log("rtsp request handle");
  22. const stream = webSocketStream(ws, {
  23. binary: true,
  24. browserBufferTimeout: 1000000
  25. }, {
  26. browserBufferTimeout: 1000000
  27. });
  28. let url = req.query.url;
  29. console.log("rtsp url:", url);
  30. console.log("rtsp params:", req.params);
  31. try {
  32. ffmpeg(url)
  33. .addInputOption("-rtsp_transport", "tcp", "-buffer_size", "102400") // 这里可以添加一些 RTSP 优化的参数
  34. .on("start", function () {
  35. console.log(url, "Stream started.");
  36. })
  37. .on("codecData", function () {
  38. console.log(url, "Stream codecData.")
  39. // 摄像机在线处理
  40. })
  41. .on("error", function (err) {
  42. console.log(url, "An error occured: ", err.message);
  43. })
  44. .on("end", function () {
  45. console.log(url, "Stream end!");
  46. // 摄像机断线的处理
  47. })
  48. .outputFormat("flv").videoCodec("copy").noAudio().pipe(stream);
  49. } catch (error) {
  50. console.log(error);
  51. }
  52. }
  53. localServer();

测试的 HelloWorld.vue 

如下 rtsp 服务为 rtsp://localhost:8554/rtsp/test_rtsp 

创建一个 flvPlayer, 视频输入为 ws://localhost:9999/rtsp/xxx/?url=rtsp://localhost:8554/rtsp/test_rtsp 

然后 启动项目, 能够正常看到视频 即成功 

  1. <template>
  2. <div class="video-wrapper">
  3. <video class="demo-video" ref="player" muted autoplay></video>
  4. </div>
  5. </template>
  6. <script>
  7. import flvjs from "flv.js";
  8. export default {
  9. data () {
  10. return {
  11. id: "xxx",
  12. rtsp: "rtsp://localhost:8554/rtsp/test_rtsp",
  13. player: null
  14. }
  15. },
  16. mounted () {
  17. if (flvjs.isSupported()) {
  18. let video = this.$refs.player;
  19. if (video) {
  20. this.player = flvjs.createPlayer({
  21. type: "flv",
  22. isLive: true,
  23. url: `ws://localhost:9999/rtsp/${this.id}/?url=${this.rtsp}`
  24. });
  25. this.player.attachMediaElement(video);
  26. try {
  27. this.player.load();
  28. this.player.play();
  29. } catch (error) {
  30. console.log(error);
  31. }
  32. }
  33. }
  34. },
  35. beforeDestroy () {
  36. this.player.destory();
  37. }
  38. }
  39. </script>
  40. <style>
  41. .video-wrapper {
  42. max-width: 880px;
  43. max-height: 660px;
  44. border:1px solid red;
  45. }
  46. .demo-video {
  47. max-width: 880px;
  48. max-height: 660px;
  49. }
  50. </style>

测试页面展示效果如下 

FlvUsage.html 

也可以使用一个普通的 html 来进行测试 

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  5. <script src="https://cdn.bootcdn.net/ajax/libs/flv.js/1.6.2/flv.min.js"></script>
  6. <!-- <script src="./js/flv.min.js"></script>-->
  7. <style>
  8. body, center {
  9. padding: 0;
  10. margin: 0;
  11. }
  12. .v-container {
  13. width: 640px;
  14. height: 360px;
  15. border: solid 1px red;
  16. }
  17. video {
  18. width: 100%;
  19. height: 100%;
  20. }
  21. </style>
  22. </head>
  23. <body>
  24. <div class="v-container">
  25. <video id="player1" muted autoplay="autoplay" preload="auto" controls="controls">
  26. </video>
  27. </div>
  28. <script>
  29. if (flvjs.isSupported()) {
  30. var videoElement = document.getElementById('player1');
  31. var flvPlayer = flvjs.createPlayer({
  32. type: 'flv',
  33. url: 'ws://localhost:9999/rtsp/xxx/?url=rtsp://localhost:8554/rtsp/test_rtsp'
  34. });
  35. flvPlayer.attachMediaElement(videoElement);
  36. flvPlayer.load();
  37. }</script>
  38. </body>
  39. </html>

测试页面展示效果如下 

完 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/157506?site
推荐阅读
相关标签
  

闽ICP备14008679号