VUE - 视频流直播

 

推流:将直播的内容推送至服务器的过程。

拉流:指服务器已有直播内容,用指定地址进行拉取的过程。

 

本文主要说的是拉流。也就是客户端播放视频流。

 

视频流测试软件:VLC 播放器,可自行百度下载安装

 

网络直播中常见的三种协议:RMTP 、HTTP-FLV 、HLS

android 直播拉流 如何拉流直播_android 直播拉流

 

 RTMP 协议

推流一般使用RTMP协议。

但在客户端就不适用了。因为 RTMP 必须需要 flash 插件 ,主流浏览器默认不支持flash,需单独安装。

经测试:

需单独下载 安装flash,(adobe flash player ppapi)

flash 下载地址:https://www.flash.cn/download-wins

chrome 不可用

360浏览器 可用(有提示)

qq浏览器 可用

 VUE 使用方法 : 

cnpm install video-js -S
cnpm install videojs-flash -S

 

<template>
  <div>
    <div id="video-container">
      <!-- https://blog.csdn.net/qq_45062261/article/details/113887381 -->
      <video id="myvideo" width="800" height="600" class="video-js vjs-default-skin" controls>
        <!-- RTMP直播源地址-->
        <!-- <source :src="`rtmp://58.200.131.2:1935/livetv/cctv2`" /> -->
        <source :src="`rtmp://ns8.indexforce.com/home/mystream`" />
      </video>
      <button @click="handlePlay">点击播放</button>
      <button @click="handleClear">关闭销毁</button>
      <button @click="again">再次初始化</button>
    </div>
  </div>
</template>
 
<script>
import videojs from "video.js";
import "video.js/dist/video-js.css";
import "videojs-flash";

export default {
  data() {
    return {
      videoPlayer: null,
    };
  },
  methods: {
    //播放
    handlePlay() {
      this.videoPlayer = videojs("myvideo", {}, function () {
        console.log("videojs播放器初始化成功");
      });
      this.videoPlayer.play();
    },
    //销毁
    handleClear() {
      this.videoPlayer.dispose(); //销毁
      this.videoPlayer = null; //置空
    },
    //重新初始化
    again() {
      var myVideoDiv = document.getElementById("video-container");
      myVideoDiv.innerHTML = `
        <video id='myvideo' width="800" height="600" class="video-js vjs-default-skin" controls>
            <!-- RTMP直播源地址-->
            <source  src="rtmp://xxxxxx.cn:1111/oopl/${this.xxxx}">    
        </video>
      `;
    },
  },
};
</script>
 
<style lang="scss" scoped>

</style>

 

android 直播拉流 如何拉流直播_服务器_02

 

 

 

 
 HLS 协议

 使用H5播放

 

基于nginx的rtmp直播服务器 (参考:)
安装加载nginx-rtmp-module模块的nginx
首先下载nginx

到 https://github.com/arut/nginx-rtmp-module 下载rtmp模块(git clone https://github.com/arut/nginx-rtmp-module.git)

分别解压nginx和rtmp模块,使他们在同一目录下。

编译nginx

./configure --prefix=/usr/local/nginx --add-module=../nginx-rtmp-module.1.1.4 --with-http_ssl_module

 

make && make install 安装

配置rtmp模块

rtmp {
    server {
        listen 9999;

        application myapp {
            live on;
           }
       application live {
             live on;   #开启实时
             hls on;    #开启hls
             hls_path /usr/local/etc/nginx/html/multimedia/hls;  #hls的ts切片存放路径
             hls_fragment 2s;         #本地切片长度
             hls_playlist_length 6s;  #HLS播放列表长度
       }
    }
}

 

使用rtmp协议并且监听了9999端口,如果我们的推流地址填写的是rtmp://ip:9999/myapp,那么就是纯粹的rmtp协议的流,如果推流地址填写的是rmtp://ip:9999/live,那么推流之后会在/usr/local/etc/nginx/html/multimedia/hls目录下生成很多ts格式的视频切片和一个m3u8格式的文件,我们想要用http协议访问这个m3u8文件就需要再配置http模块。

配置http模块

location /live {
    types {
        application/vnd.apple.mpegurl m3u8;
        video/mp2t ts;
    }
    alias /usr/local/etc/nginx/html/multimedia/hls/;
    add_header Cache-Control no-cache;
}

当我们的推流地址填写的是rtmp://ip:9999/live/room1时,使用http://ip:80/live/room1.m3u8就能把rtmp转成hls访问这个直播流了。

  • 新建文件夹 mkdir -p /usr/local/etc/nginx/html/multimedia/hls/
  • 重启nginx nginx -s reload

以上就完成了直播服务器的搭建。

 

 VUE 使用方法:

npm install hls.js
<!-- https://blog.csdn.net/a15297701931/article/details/115478652 -->
<template>
    <div class="playVideo-layout">
      <!-- 播放器 -->
      <div id="app-container" class="video-box">
        <video
          ref="videoElement"
          :src="videoUrl"
          id="videoElement"
          controls
          muted
          style="width: 100%; height: 100%; object-fit: fill"
        ></video>
      </div>
    </div>
  </template>
  

  <script>
import hlsjs from "hls.js";
export default {
  components: {},
  data() {
    return {
      videoUrl: "http://playertest.longtailvideo.com/adaptive/bipbop/gear4/prog_index.m3u8",//这里书写路径,例
    };
  },
  mounted() {
    this.show();
  },
  methods: {
    //播放
    show() {
      this.video = this.$refs.videoElement; //定义挂载点
      console.log(this.video);
      if (hlsjs.isSupported()) {
        this.hlsjs = new hlsjs();
        this.hlsjs.loadSource(this.videoUrl);//设置播放路径
        this.hlsjs.attachMedia(this.video);//解析到video标签上
        console.log(this.hlsjs);
        this.hlsjs.on(hlsjs.Events.MANIFEST_PARSED, () => {
          this.video.play();
          console.log("加载成功");
        });
        this.hlsjs.on(hlsjs.Events.ERROR, (event, data) => {
            console.log(event, data);
          // 监听出错事件
          console.log("加载失败");
        });
      } else {
        this.$message.error("不支持的格式");
        return;
      }
    },
    //停止播放
    closeVideo() {
      if (this.hlsjs) {
        this.$refs.videoElement.pause();
        this.video.pause();
        this.hlsjs.destroy();
        this.hlsjs = null;
        this.$emit("closeVideo");
      }
    },
  },
  computed: {},
  watch: {},
  filters: {},
};
</script>

android 直播拉流 如何拉流直播_服务器_03