草庐IT

video.js播放rtmp视频

这个问题不好解决 2023-07-25 原文

最近公司要求拉取某公司流媒体服务器的视频监控,并在web端页面播放,流媒体服务器发送的是rtmp格式视频流,经过网上查资料,最后敲定使用video.js

rtmp流需要依托flash播放,现在大多浏览器已经禁止使用flash,所以非必要不使用。

回顾我一个大后端在video.js道路上的心酸史,泪流满面!!!网上资料千篇一律,贼鸡巴坑。我也并不是很懂,现在把自己成功后的代码分享一下,希望能帮助哪怕一个人。

 

<div class="mc-cont">

        <div class="videoBox"  style="margin-bottom: 30px">
        <video
          id="myVideo1"
          controls
          class="vjs-default-skin vjs-big-play-centered vjs-16-9 video-js"
          preload="auto"
          style="width: 712px;height:320px;object-fit: fill"
        >
        </video>
      </div>

        <div class="videoBox"  style="margin-bottom: 30px">
          <video
            id="myVideo2"
            controls
            class="vjs-default-skin vjs-big-play-centered vjs-16-9 video-js"
            preload="auto"
            style="width: 712px;height:320px;object-fit: fill"
          >
          </video>
        </div>

        <div class="videoBox"  style="margin-bottom: 30px">
          <video
            id="myVideo3"
            controls
            class="vjs-default-skin vjs-big-play-centered vjs-16-9 video-js"
            preload="auto"
            style="width: 712px;height:320px;object-fit: fill"
          >
          </video>
        </div>

</div>

这是页面播放视频需要的video标签,我放了三个video,用来播放三个摄像头的画面

我前端使用vue,首先需要安装video.js

npm install video.js@5.6.0

 安装完成后你的node_modules里会出现以下内容,video.js装5.x版本。(6.x版本剥离flash,还需安装video.js-flash)

  import videojs from 'video.js'
  import 'video.js/dist/video-js.css'

 导入video.js及css

data() {
      return {
        list:[]    //这里用来存放视频地址
}


methods: {

OpenVideo(truckLicenseNo,type){
        //我这里是车牌号的一个点击事件,从后台获取拉取视频地址,这部分替换自己业务
        TruckService.PlayVideo({
            //车牌号
          truckLicenseNo: truckLicenseNo,

        }, (success) => {

          if (success) {
            //请求视频成功
            //判断打开全部或单个
            if (type==='all'){
               //list中push视频地址
              this.list.push( {
                  src:'rtmp://192.144.134.83:19350/live/015049488761_1',
                  id:1,
                },
                {
                  src:'rtmp://192.144.134.83:19350/live/015049488761_1',
                  id:2,
                },
                {
                  src:'rtmp://192.144.134.83:19350/live/015049488761_1',
                  id:3,
                }
              )
            }else if (type==='one'){
              // videojs("myVideo1").reset();
              this.list.push( {
                  src:'rtmp://192.144.134.83:19350/live/015049488761_1',
                  id:1,
                })
            }else if(type==='two'){
              // videojs("myVideo2").reset();
              this.list.push( {
                src:'rtmp://192.144.134.83:19350/live/015049488761_1',
                id:2,
              })
            }else{
              // videojs("myVideo3").reset();
              this.list.push( {
                src:'rtmp://192.144.134.83:19350/live/015049488761_1',
                id:3,
              })
            }

          //返回true,拉流播放视频
          //从这儿开始循环地址并初始化video.js
            this.list.map((item,i)=>{

              let myPlayer = videojs('myVideo'+item.id, {
                sources:[{
                  type: "rtmp/flv",
                  src:item.src
                }],
                //属性可以去查中文文档
                controls: true,
                //自动播放属性,muted:静音播放
                autoplay: true,
                preload: "auto",
                textTrackDisplay: false,
                errorDisplay: false,
                controlBar: false,
                bigPlayButton: false,

              });
              //这里是video.js的监听事件,视频播放中,我延迟3秒执行修改视频窗口的样式
              myPlayer.on("play", function(){

                this.timer = setTimeout(()=>{   //设置延迟执行
                  console.log('延时3秒放大窗口');
                  debugger;
                  let btns = document.getElementById('myVideo'+item.id+'_Flash_api')
                  btns.style.height = "320px"
                  btns.style.width = "712px"
                },3000);

              });
            })

          }

        });

      },
}

 我在初始化时加了延迟修改样式,为了解决视频第一次打开画面不能铺满,非要放大再缩小才能铺满问题。如果遇到同样问题可以试试我的办法 

let btns = document.getElementById('myVideo'+item.id+'_Flash_api') 获取的是video.js的视频加载后出现的dom,你可以自己看一眼就明白了。

 一定要注意浏览器是否支持flash,是否打开允许flash,否则视频播放不了的

 

 这是我用的浏览器

 最后,成功播出画面,画面样式自己看着修改

最后说明一下,我要求实现的是打开全部摄像头画面或单个摄像头画面,代码比较乱,安装和初始化video.js部分可参考,其他的根据自己业务去写,看不懂的属性查看这里 videojs中文文档详解_谢泽的网络日志-CSDN博客_video.js

有关video.js播放rtmp视频的更多相关文章

  1. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  2. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  3. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  4. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  5. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  6. ruby - 如何更改此正则表达式以从未指定 v 参数的 Youtube URL 获取 Youtube 视频 ID? - 2

    目前我正在使用这个正则表达式从YoutubeURL中提取视频ID:url.match(/v=([^&]*)/)[1]我怎样才能改变它,以便它也可以从这个没有v参数的YoutubeURL获取视频ID:http://www.youtube.com/user/SHAYTARDS#p/u/9/Xc81AajGUMU感谢阅读。编辑:我正在使用ruby​​1.8.7 最佳答案 对于Ruby1.8.7,这就可以了。url_1='http://www.youtube.com/watch?v=8WVTOUh53QY&feature=feedf'url

  7. ruby - 如何以编程方式将 mp3 转换为 itunes 可播放的 aac/m4a 文件? - 2

    我一直在寻找一种以编程方式或通过命令行将mp3转换为aac的方法,但没有成功。理想情况下,我有一段代码可以从我的Rails应用程序中调用,将mp3转换为aac。我安装了ffmpeg和libfaac,并能够使用以下命令创建aac文件:ffmpeg-itest.mp3-acodeclibfaac-ab163840dest.aac当我将输出文件的名称更改为dest.m4a时,它无法在iTunes中播放。谢谢! 最佳答案 FFmpeg提供AAC编码功能(如果您已编译它们)。如果您使用的是Windows,则可以从here获取完整的二进制文件。

  8. node.js - 如何在 Travis CI 上的一个项目中运行 Node.js 和 Ruby 测试 - 2

    我有一个包含多个组件的存储库,其中大部分是用JavaScript(Node.js)编写的,一个是用Ruby(RubyonRails)编写的。我想要一个.travis.yml文件来触发一个运行每个组件的所有测试的构建。根据thisTravisCIGoogleGroupthread,目前还没有官方支持。我的目录结构是这样的:.├──构建服务器├──核心├──扩展├──网络应用├──流浪文件├──package.json├──.travis.yml└──生成文件我希望能够运行特定版本的Ruby(2.2.2)和Node.js(0.12.2)。我已经有了一个make目标,所以maketest在每

  9. ruby - 如何播放 mp3 文件? - 2

    我如何用ruby​​编写一个脚本,当从命令行执行时播放mp3文件(背景音乐)?我试过了run="mplayer#{"/Users/bhushan/resume/m.mp3"}-aosdl-vox11-framedrop-cache16384-cache-min20/100"system(run)但它也不起作用,以上是播放器特定的。如果用户没有安装mplayer怎么办。有没有更好的办法? 最佳答案 我一般都是这样pid=fork{exec'mpg123','-q',file} 关于ruby

  10. node.js - 从未编写过任何自动化测试,我应该如何开始行为驱动开发? - 2

    按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visitthehelpcenter指导。关闭9年前。多年来,我一直在使用多种语言进行编程,并且认为自己总体上相当擅长。但是,我从未编写过任何自动化测试:没有单元测试,没有TDD,没有BDD,什么都没有。我已经尝试开始为我的项目编写适当的测试套件。我可以看到在进行任何更改后能够自动测试项目中所有代码的理论值(value)。我可以看到像RSpec和Mocha这样的测试框架应该如何使设置和运行所述测试变得相当容易

随机推荐