您现在的位置是:首页 > 技术教程 正文

Nginx-http-flv-module流媒体服务器搭建+模拟推流+flv.js在前端html和Vue中播放HTTP-FLV视频流

admin 阅读: 2024-03-31
后台-插件-广告管理-内容页头部广告(手机)

场景

Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流:

Windows上搭建Nginx RTMP服务器并使用FFmpeg实现本地视频推流_win nginx-rtmp最新版_霸道流氓气质的博客-CSDN博客

Vue中使用vue-video-player和videojs-flash插件实现播放rtmp视频文件流:

Vue中使用vue-video-player和videojs-flash插件实现播放rtmp视频文件流_videojs-flash vue_霸道流氓气质的博客-CSDN博客

前面使用Vue播放RTMP流时,需要借助于flash。这种方式对于flash插件的安装

与后续浏览器支持等都不是很好。可以采用将rtmp的视频流转换成HTTP-FLV的方式,

然后前端通过bilibili的flv.js实现播放。

nginx-http-flv-module

nginx-http-flv-module: 基于nginx-rtmp-module的流媒体服务器。具备nginx-rtmp-module的所有功能,增加了HTTP-FLV,GOP缓存和VHOST(一个IP对应多个域名)的功能。Media streaming server based on nginx-rtmp-module. In addtion to the features nginx-rtmp-module provides, HTTP-FLV, GOP cache and VHOST (one IP for multi domain names) are supported now.

中文说明

nginx-http-flv-module/README.CN.md at master · winshining/nginx-http-flv-module · GitHub

一款基于 nginx-rtmp-module 的流媒体服务器。

nginx-http-flv-module 具备nginx-rtmp-module 的所有功能,并且对比如下:

支持的播放器

VLC (RTMP & HTTP-FLV) / OBS (RTMP & HTTP-FLV) / JW Player (RTMP) / flv.js (HTTP-FLV).

注意事项

1、Adobe 将在 2020 年 12 月 31 日之后停止对 flash 播放器 的官方支持,

主流浏览器随后将移除 flash 播放器,使用 flash 播放器的插件将不再可用。

2、flv.js 只能运行在支持 Media Source Extensions 的浏览器上。

3、nginx-http-flv-module 包含了 nginx-rtmp-module 所有的功能,

所以不要将 nginx-http-flv-module 和 nginx-rtmp-module 一起编译。

4、如果使用 flv.js 播放流,那么请保证发布的流被正确编码,

因为 flv.js 只支持 H.264 编码的视频和 AAC/MP3 编码的音频。

5、其中的 add_header ‘Access-Control-Allow-Origin’ ‘*’ 与 add_header ‘Access-Control-Allow-Credentials’ ‘true’ 很重要,

主要解决了前端通过HTTP方式拉流是的跨域问题。

其他注意事项和详细细节可见官方github。

注:

博客:
霸道流氓气质的博客_CSDN博客-C#,架构之路,SpringBoot领域博主

实现

1、官方示例以及推荐等都是在Linux服务器上。

但是如果需要在本地Windows电脑上进行调试或者服务器就必须是Windows服务器的话,

需要编译Windows版本,或者直接网络上搜索下载已经编译好的Windows版本。

比如:

https://download.csdn.net/download/codebooks/12793877

但是是否可用需要自己下载验证。

以下载上面的为例,下载解压后,自带run.bat运行脚本

脚本内容为:

nginx.exe -c conf/http-flv.conf

这里是指定走配置文件conf/http-flv.conf

所以如果要修改的话也是修改http-flv.conf文件,而不是原来默认的nginx.conf文件了。

双击启动脚本启动后,可以从任务管理器中验证是否启动成功,或者通过其他查看日志等方式验证。

2、配置文件

关注两个地方,比如这里的官方例子

假设在 http 配置块中的 listen 配置项是:

  1. http {
  2.     ...
  3.     server {
  4.         listen 8080; #不是默认的 80 端口
  5.         ...
  6.         location /live {
  7.             flv_live on;
  8.         }
  9.     }
  10. }

在 rtmp 配置块中的 listen 配置项是:

  1. rtmp {
  2.     ...
  3.     server {
  4.         listen 1985; #不是默认的 1935 端口
  5.         ...
  6.         application myapp {
  7.             live on;
  8.         }
  9.     }
  10. }

并且发布的流的名称是 mystream,那么基于 HTTP 的播放 url 是:

http://example.com:8080/live?port=1985&app=myapp&stream=mystream

下面附官方提示的配置文件示例

  1. ​
  2. worker_processes  1; #运行在 Windows 上时,设置为 1,因为 Windows 不支持 Unix domain socket
  3. #worker_processes  auto; #1.3.8 和 1.2.5 以及之后的版本
  4. #worker_cpu_affinity  0001 0010 0100 1000; #只能用于 FreeBSD 和 Linux
  5. #worker_cpu_affinity  auto; #1.9.10 以及之后的版本
  6. error_log logs/error.log error;
  7. #如果此模块被编译为动态模块并且要使用与 RTMP 相关的功
  8. #能时,必须指定下面的配置项并且它必须位于 events 配置
  9. #项之前,否则 NGINX 启动时不会加载此模块或者加载失败
  10. #load_module modules/ngx_http_flv_live_module.so;
  11. events {
  12.     worker_connections  4096;
  13. }
  14. http {
  15.     include       mime.types;
  16.     default_type  application/octet-stream;
  17.     keepalive_timeout  65;
  18.     server {
  19.         listen       80;
  20.         location / {
  21.             root   /var/www;
  22.             index  index.html index.htm;
  23.         }
  24.         error_page   500 502 503 504  /50x.html;
  25.         location = /50x.html {
  26.             root   html;
  27.         }
  28.         location /live {
  29.             flv_live on; #打开 HTTP 播放 FLV 直播流功能
  30.             chunked_transfer_encoding on; #支持 'Transfer-Encoding: chunked' 方式回复
  31.             add_header 'Access-Control-Allow-Origin' '*'; #添加额外的 HTTP 头
  32.             add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的 HTTP 头
  33.         }
  34.         location /hls {
  35.             types {
  36.                 application/vnd.apple.mpegurl m3u8;
  37.                 video/mp2t ts;
  38.             }
  39.             root /tmp;
  40.             add_header 'Cache-Control' 'no-cache';
  41.         }
  42.         location /dash {
  43.             root /tmp;
  44.             add_header 'Cache-Control' 'no-cache';
  45.         }
  46.         location /stat {
  47.             #推流播放和录制统计数据的配置
  48.             rtmp_stat all;
  49.             rtmp_stat_stylesheet stat.xsl;
  50.         }
  51.         location /stat.xsl {
  52.             root /var/www/rtmp; #指定 stat.xsl 的位置
  53.         }
  54.         #如果需要 JSON 风格的 stat, 不用指定 stat.xsl
  55.         #但是需要指定一个新的配置项 rtmp_stat_format
  56.         #location /stat {
  57.         #    rtmp_stat all;
  58.         #    rtmp_stat_format json;
  59.         #}
  60.         location /control {
  61.             rtmp_control all; #rtmp 控制模块的配置
  62.         }
  63.     }
  64. }
  65. rtmp_auto_push on;
  66. rtmp_auto_push_reconnect 1s;
  67. rtmp_socket_dir /tmp;
  68. rtmp {
  69.     out_queue           4096;
  70.     out_cork            8;
  71.     max_streams         128;
  72.     timeout             15s;
  73.     drop_idle_publisher 15s;
  74.     log_interval 5s; #log 模块在 access.log 中记录日志的间隔时间,对调试非常有用
  75.     log_size     1m; #log 模块用来记录日志的缓冲区大小
  76.     server {
  77.         listen 1935;
  78.         server_name www.test.*; #用于虚拟主机名后缀通配
  79.         application myapp {
  80.             live on;
  81.             gop_cache on; #打开 GOP 缓存,减少首屏等待时间
  82.         }
  83.         application hls {
  84.             live on;
  85.             hls on;
  86.             hls_path /tmp/hls;
  87.         }
  88.         application dash {
  89.             live on;
  90.             dash on;
  91.             dash_path /tmp/dash;
  92.         }
  93.     }
  94.     server {
  95.         listen 1935;
  96.         server_name *.test.com; #用于虚拟主机名前缀通配
  97.         application myapp {
  98.             live on;
  99.             gop_cache on; #打开 GOP 缓存,减少首屏等待时间
  100.         }
  101.     }
  102.     server {
  103.         listen 1935;
  104.         server_name www.test.com; #用于虚拟主机名完全匹配
  105.         application myapp {
  106.             live on;
  107.             gop_cache on; #打开 GOP 缓存,减少首屏等待时间
  108.         }
  109.     }
  110. }
  111. ​

然后上面下载的Windows编译版本的配置文件http-flv.conf的内容为

  1. ​
  2. worker_processes  1;
  3. error_log logs/error.log error;
  4. events {
  5.     worker_connections  4096;
  6. }
  7. http {
  8.     include       mime.types;
  9.     default_type  application/octet-stream;
  10.     keepalive_timeout  65;
  11.     server {
  12.         listen       800;
  13.         location / {
  14.             root   www;
  15.             index  index.html index.htm;
  16.         }
  17.         error_page   500 502 503 504  /50x.html;
  18.         location = /50x.html {
  19.             root   html;
  20.         }
  21.         location /live {
  22.             flv_live on; #打开HTTP播放FLV直播流功能
  23.             chunked_transfer_encoding on; #支持'Transfer-Encoding: chunked'方式回复
  24.             add_header 'Access-Control-Allow-Origin' '*'; #添加额外的HTTP头
  25.             add_header 'Access-Control-Allow-Credentials' 'true'; #添加额外的HTTP头
  26.         }
  27.         location /hls {
  28.             types {
  29.                 application/vnd.apple.mpegurl m3u8;
  30.                 video/mp2t ts;
  31.             }
  32.             root temp;
  33.             add_header 'Cache-Control' 'no-cache';
  34.         }
  35.         location /dash {
  36.             root temp;
  37.             add_header 'Cache-Control' 'no-cache';
  38.         }
  39.         location /stat {
  40.             #推流播放和录制统计数据的配置
  41.             rtmp_stat all;
  42.             rtmp_stat_stylesheet stat.xsl;
  43.         }
  44.         location /stat.xsl {
  45.             root www/rtmp; #指定stat.xsl的位置
  46.         }
  47.         #如果需要JSON风格的stat, 不用指定stat.xsl
  48.         #但是需要指定一个新的配置项rtmp_stat_format
  49.         #location /stat {
  50.         #    rtmp_stat all;
  51.         #    rtmp_stat_format json;
  52.         #}
  53.         location /control {
  54.             rtmp_control all; #rtmp控制模块的配置
  55.         }
  56.     }
  57. }
  58. rtmp_auto_push on;
  59. rtmp_auto_push_reconnect 1s;
  60. rtmp_socket_dir temp;
  61. rtmp {
  62.     out_queue           4096;
  63.     out_cork            8;
  64.     max_streams         128;
  65.     timeout             15s;
  66.     drop_idle_publisher 15s;
  67.     log_interval 5s; #log模块在access.log中记录日志的间隔时间,对调试非常有用
  68.     log_size     1m; #log模块用来记录日志的缓冲区大小
  69.     server {
  70.         listen 1935;
  71.         #server_name www.test.*; #用于虚拟主机名后缀通配
  72.   server_name 127.0.0.1;
  73.         application myapp {
  74.             live on;
  75.             gop_cache on; #打开GOP缓存,减少首屏等待时间
  76.         }
  77.         application hls {
  78.             live on;
  79.             hls on;
  80.             hls_path temp/hls;
  81.         }
  82.         application dash {
  83.             live on;
  84.             dash on;
  85.             dash_path temp/dash;
  86.         }
  87.     }
  88. }
  89. ​

3、Windows上本地模拟推送RTMP视频流到nginx-http-flv-module

参考上面使用FFMpeg推送的流程,修改模拟推流bat脚本为

  1. ffmpeg.exe -re -i D:\WorkSpace\Other\FFmpegDemo\test\1.mp4 -vcodec libx264 -acodec aac -f flv rtmp://127.0.0.1:1935/myapp/badao
  2. pause

推流成功之后,使用VLC进行拉流测试,网络串流地址为

http://127.0.0.1:800/live?port=1935&app=myapp&stream=badao

注意这里的

800对应http配置的端口

live对应http配置的location后面的/live

port=1935对应rtmp中配置的端口

app=myapp对应的myapp是rtmp中配置的application myapp

stream=badao的badao是对应推流时的rtmp://127.0.0.1:1935/myapp/badao的badao

拉流推流效果。

为了模拟时间延迟效果,可以使用其他推流工具,截图桌面时间显示进行推流,测试延迟效果。

Docker和docker-compose中部署nginx-rtmp实现流媒体服务与oob和ffmpeg推流测试:

Docker和docker-compose中部署nginx-rtmp实现流媒体服务与oob和ffmpeg推流测试_docker 推流_霸道流氓气质的博客-CSDN博客

这里可以参考使用oob进行模拟推流测试效果

4、bilibili的flv.js

GitHub - bilibili/flv.js: HTML5 FLV Player

可以看到其特点是

HTTP FLV低延迟实时流播放

在html中使用flv.js播放http-flv

将flv.min.js下载到本地

https://github.com/bilibili/flv.js/releases/download/v1.5.0/flv.min.js

然后新建html

  1. html>
  2. <html>
  3. <head>
  4.     <meta content="text/html; charset=utf-8" http-equiv="Content-Type">
  5.     <title>flv.js demotitle>
  6.     <style>
  7.         .mainContainer {
  8.             display: block;
  9.             width: 1024px;
  10.             margin-left: auto;
  11.             margin-right: auto;
  12.         }
  13.         .urlInput {
  14.             display: block;
  15.             width: 100%;
  16.             margin-left: auto;
  17.             margin-right: auto;
  18.             margin-top: 8px;
  19.             margin-bottom: 8px;
  20.         }
  21.         .centeredVideo {
  22.             display: block;
  23.             width: 100%;
  24.             height: 576px;
  25.             margin-left: auto;
  26.             margin-right: auto;
  27.             margin-bottom: auto;
  28.         }
  29.         .controls {
  30.             display: block;
  31.             width: 100%;
  32.             text-align: center;
  33.             margin-left: auto;
  34.             margin-right: auto;
  35.         }
  36.     style>
  37. head>
  38. <body>
  39. <p class="mainContainer">
  40.     <video name="videoElement" id="videoElement" class="centeredVideo" controls muted autoplay width="1024"
  41.            height="576">
  42.         Your browser is too old which doesn't support HTML5 video.
  43.     video>
  44. p>
  45. <script src="js/flv.min.js">script>
  46. <script>
  47.     function start() {
  48.         if (flvjs.isSupported()) {
  49.             var videoElement = document.getElementById('videoElement');
  50.             var flvPlayer = flvjs.createPlayer({
  51.                 type: 'flv',
  52.                url:'http://127.0.0.1:800/live?port=1935&app=myapp&stream=badao'
  53.             });
  54.             flvPlayer.attachMediaElement(videoElement);
  55.             flvPlayer.load();
  56.             flvPlayer.play();
  57.         }
  58.     }
  59.     document.addEventListener('DOMContentLoaded', function () {
  60.         start();
  61.     });
  62. script>
  63. body>
  64. html>

将url设置为上面的拉流地址,注意flv.min.js的路径

浏览器中访问该html看下效果

5、在Vue中使用flv.js播放http-flv

安装依赖

npm install --save flv.js

新建页面修改代码

  1. <template lang="html">
  2.   <div id="app">
  3.     <video
  4.       id="videoLive"
  5.       crossorigin="anonymous"
  6.       controls
  7.       autoplay
  8.       width="100%"
  9.       height="100%"
  10.       style="object-fit: fill"
  11.     ></video>
  12.   </div>
  13. </template>
  14. <script>
  15. import flvjs from "flv.js";
  16. export default {
  17.   name: "flvPlayer",
  18.   data() {
  19.     return {
  20.       flvPlayer: null,
  21.     };
  22.   },
  23.   mounted() {
  24.    this.createVideo('http://127.0.0.1:800/liveport=1935&app=myapp&stream=badao',"videoLive")
  25.   },
  26.   methods: {
  27.     createVideo(url, elementId) {
  28.       if (flvjs.isSupported()) {
  29.         let videoElement = document.getElementById(elementId);
  30.         this.flvPlayer = flvjs.createPlayer({
  31.           type: "flv",
  32.           enableWorker: true, //浏览器端开启flv.js的worker,多进程运行flv.js
  33.           isLive: true, //直播模式
  34.           hasAudio: false, //关闭音频
  35.           hasVideo: true,
  36.           stashInitialSize: 128,
  37.           enableStashBuffer: true, //播放flv时,设置是否启用播放缓存,只在直播起作用。
  38.           url: url,
  39.         });
  40.         this.flvPlayer.attachMediaElement(videoElement);
  41.         this.flvPlayer.load();
  42.         this.flvPlayer.play();
  43.       }
  44.     },
  45.   },
  46. };
  47. </script>
  48. <style lang="css">
  49. </style>

运行查看效果

标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

在线投稿:投稿 站长QQ:1888636

后台-插件-广告管理-内容页尾部广告(手机)
关注我们

扫一扫关注我们,了解最新精彩内容

搜索