如何在html中播放.flv格式的视频【vue和普通html皆可用】_html播放flv_亚卡卡的那年的博客-程序员宅基地

技术标签: flv.js  前端  vue .flv视频  javascript  

前言

之前一直主要做微信小程序方面的内容,视频播放这块一直没怎么在意视频格式的问题,最近开发了一个律所的官网项目,涉及到大量flv格式的视频,让用户转成mp4工作量太大,所以就找了找,如何在html中播放.flv格式的视频。

正文

目前主流浏览器不能直接嵌入并且播放FLV文件,所以直接用video标签播放是行不通的,网上查了一下,发现有两种常用方法:

  1. 借助一个html标签object,来嵌入一个swf媒体播放文件,并利用该文件来播放你预设的文件。
  2. 利用B站开源的flv.js 通过将FLV文件流转换为ISO BMFF(Fragmented MP4)段,然后<video>通过Media Source Extensions API 将mp4段提供给HTML5 元素。

第一种方法

首先来说一下第一种方法,需要借助一个swf媒体播放文件,网上文章中大多数下载的媒体文件都不能正常工作(坑人啊),所以最后自己找了一个可用的上传到阿里云上,地址: swf播放器
.flv格式视频地址 下面代码中示例地址为 https://file.njshushuo.com/8d2164883f65d1f78180b3fcc159d282 。 实际开发时将其替换为自己的地址。附上代码:

<object
    classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000"
    codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0"
    width="640"
    height="480"
    id="VideoPlayer"
    align="middle"
  >
    <param name="allowScriptAccess" value="*" />
    <param name="allowFullScreen" value="true" />
    <param
      name="movie"
      value="./flvplayer.swf?video=https://file.njshushuo.com/8d2164883f65d1f78180b3fcc159d282&autoplay=true"
    />
    <param name="quality" value="high" />
    <param name="bgcolor" value="#ffffff" />
    <embed
      src="./flvplayer.swf"
      flashvars="vcastr_file=https://file.njshushuo.com/8d2164883f65d1f78180b3fcc159d282" 
      quality="high"
      bgcolor="#000000"
      width="500"
      height="380"
      name="VideoPlayer"
      align="middle"
      allowScriptAccess="*"
      allowfullscreen="true"
      type="application/x-shockwave-flash"
      pluginspage="http://www.macromedia.com/go/getflashplayer"
    />
  </object>

将html打开,果然.flv格式能够播放了,外观也挺不错。
图片

放入vue项目中,却遇到了一个坑,那就是swf文件不能为相对路径,需要改成网络绝对路径,否则加载不到。
ok,大功告成!
然而这种方法主要是利用flash插件完成的,需要浏览器安装flash插件,而对于普通用户而言:

  1. 安装flash困难
  2. 如果禁用了flash,再次开启也存在一定的困难。

另外,flash播放还存在 稳定性 和cpu占用率高的缺点。同时,由于该项目支持移动端,而移动端并没有flash插件,所以只能放弃第一种方法

第二种方法

然后开始研究flv.js, 附上B站flv.js的github地址 https://github.com/Bilibili/flv.js

简介

flv.jsbilibili网站开源的使用纯JavaScript而不使用Flash编写的HTML5 Flash视频(FLV)播放器。通过将FLV文件流转换为ISO BMFF(Fragmented MP4)段,然后<video>通过Media Source Extensions API 将mp4段提供给HTML5 元素。
flv.js用ECMAScript 6编写,由Babel Compiler编译成ECMAScript 5 ,并与Browserify捆绑在一起。

优势

  • 带有H.264 + AAC / MP3编解码器播放的FLV容器
  • 多部分分段视频播放
  • HTTP FLV低延迟直播流播放
  • FLV 通过 WebSocket 实时流播放
  • 兼容Chrome,FireFox,Safari 10,IE11和Edge
  • 极低的开销,以及浏览器加速的硬件!

附上代码

<script src="flv.min.js"></script>
<video id="videoElement"></video>
<script>
    if (flvjs.isSupported()) {
        var videoElement = document.getElementById('videoElement');
        var flvPlayer = flvjs.createPlayer({
            type: 'flv',
            url: 'http://example.com/flv/video.flv'
        });
        flvPlayer.attachMediaElement(videoElement);
        flvPlayer.load();
        flvPlayer.play();
    }
</script>

将其放在vue项目中, 通过 npm install flv.js引入 flv.js,创建一个mvideo组件,代码如下:

<template>
  <div class="video">
    <video
      class="video-component"
      ref="videoElement"
      controls
      autoplay
    >Your browser is too old which doesn't support HTML5 video.</video>
  </div>
</template>
<script>
import flvjs from "flv.js";
export default {
  name: "Video",
  props: {
    types: {
      type: String,
      default: "flv"
    },
    url: {
      types: String,
      default: ""
    }
  },
  data() {
    return {
      flvPlayer: null
    };
  },
  watch: {
    url() {
      if (this.flvPlayer) {
        this.flvPlayer.detachMediaElement();
        this.flvPlayer.destroy();
      }
      this.createVideo();
    }
  },
  mounted() {
    this.$nextTick(() => {
      this.createVideo();
    });
  },
  methods: {
    createVideo() {
      const videoElement = this.$refs.videoElement;
      this.flvPlayer = flvjs.createPlayer({
        type: this.types,
        url: this.url
      });
      this.flvPlayer.attachMediaElement(videoElement);
      this.flvPlayer.load();
    }
  }
};
</script>

使用:<w-video :url="imgUrl + item.videoFileId" :types="item.videoFileType" />

flv.js的缺点在于 需要知道该资源的文件类型,在createPlayer时,传入type

switch (mds.type) {
	case 'flv':
    	return new FlvPlayer(mds, optionalConfig);
	default:
    	return new NativePlayer(mds, optionalConfig);
}

文末

好了,两种方法都介绍完了,总体而言,第一种方法需要flash插件,稳定性和cpu占用率高,且不支持移动端。第二种方法则需要提前知道视频的格式,具体怎么选择就要根据自己的项目抉择了。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45316326/article/details/99053910

智能推荐

单片机AT89C51六位数码管秒表_单片机六位数码管-程序员宅基地

数字电子秒表系统采用AT89C51单片机为中心器件,利用其定时器/计数器定时和记数的原理,结合显示电路、LED数码管以及外部中断电路来设计计时器。将软、硬件有机地结合起来,使得系统能够实现LED显示,显示时间为0~9999.99秒,计时精度为0.01秒,能正确地进行计时.有启动,暂停,复位,提醒等功能。按模块划分可分为单片机最小系统电路、按键控制、数码管显示、三个子模块。_单片机六位数码管

web上线部署系统工具 Walle-程序员宅基地

Walle 一个web部署系统工具,配置简单、功能完善、界面流畅、开箱即用!支持git、svn版本管理,支持各种web代码发布,PHP,Python,JAVA等代码的发布、回滚,可以通过web来一键完成。用户分身份注册、登录开发者发起上线任务申请、部署管理者审核上线任务支持多项目部署支持多项目多任务并行快速回滚项目的用户权限管理部署前准备任务pre-deploy(前置检查)代...

表观 | Enhancer | ChIP-seq | 转录因子 | 数据库专题-程序员宅基地

需要长期更新!参考:生信修炼手册enhancer的基本概念:长度几十到几千bp,作用是提高靶基因活性,属于顺式作用原件,DNA作用到DNA,转录因子就是反式,是结合到DNA的蛋白。1981年,Benerji发现SV40中某个140bp的序列可以显著提高血红蛋白融合基因的表达水平。特性:远距离效应,无方向性。如何鉴定enhancer区域:对多个转录因子的pe..._enhancer的识别

go.etcd.io/etcd/clientv3 安装报错:undefined: resolver.BuildOption;_go.etcd.io\etcd\client\[email protected]\client.go:254:28:-程序员宅基地

安装go.etcd.io/etcd/clientv3时报错# github.com/coreos/etcd/clientv3/balancer/resolver/endpoint$GOPATH\pkg\mod\github.com\coreos\[email protected]+incompatible\clientv3\balancer\resolver\endpoint\endpoint.go:114:78: undefined: resolver.BuildOption$GOPATH\pkg\mod\_go.etcd.io\etcd\client\[email protected]\client.go:254:28: undefined: grpc.withresol

检测App、静态库、framework是否支持bitcode-程序员宅基地

一、otool直接分析文件1. 静态库:otool -arch armv7 -lxxx.a | grep __bitcode | wc -l如果输出的数字不为0,就代表包含bitcode2. framework和app,传递里面的二进制文件由于app中二进制和framework中二进制文件与.a文件存在差异,因为需要检查的是__LLVM段,当出现该段的时候,则表示支...

随便推点

SAP HCM PY 个税累计方案_sap 税后工资项 没有累计到税基-程序员宅基地

SAP HCM PY 个税累计方案_sap 税后工资项 没有累计到税基

MapReduce详细的工作流程(MapReduce2)_2.试述mapreduce的工作流程。-程序员宅基地

上一篇详细讲了MapReduce1的工作流程,这一篇主要讲基于YARN系统的MapReduce 2的工作流程。 对于大于4000个节点的集群来说,MapReduce1系统将会产生一个规模瓶颈,因此Yahoo在2010年开始设计下一代的MapReduce,因此产生了YARN。YARN通过把jobTracker的责任划分为几个独立的模块修复了MapReduce1的缺点。jobTracker需要管理jo_2.试述mapreduce的工作流程。

ALDS1_5_B: Merge Sort_Reboound33的博客-程序员宅基地

题解这里的MergeSort负责将数组分割(每层分治为两部分),Merge负责整合。Merge函数将有序的left-mid和mid-right部分(都是左闭右开)整合成一个有序序列。整合过程首先用两个数组将这两部分分别装出来,然后以right-left为次数建立一个for循环,每次从两个数组中选取较小者装回原数组。可以直接用for循环操作,而不用担心一个数组已经取完了的情况,就在于这里在两个数组的末尾都添加了一个大值元素,其可以使得取完后比较继续并且不会被选中。题目Merge SortWri

软件设计师(中级)复习方案-程序员宅基地

首先,声明这是我从网上找到的软件设计师复习方案的一片不错的文章,属于转载之作。本人要参加2010年上半年的软设考试。这阵子学习遇到一些瓶颈,特别是软件工程方面的知识很多都不懂,这次从网上找了一些文章,看了也是挺有感触的,拿来和大家分享一下。 在下参加2004年系统设计师(水平)考试,上午66分,下午69分(满分均75),在此将准备考试的要点与心得记录下来,希望能给同样打算报

【黑马前端—开发工具】vscode官方快捷键、Emmett快速开发语法-程序员宅基地

工具:vscode比sublimetext用的简单,扩展直接去商店下载,更方便。比dream waver的块头更小。总之,vscode是个方便快捷,小巧精美的前端工具VSCode 的使用双击打开软件。新建文件(Ctrl + N )。保存(Ctrl + S ), 注意移动要保存为 .html 文件Ctrl + 加号键 ,Ctrl + 减号键 可以放大缩小视图 5. 生成页面骨架结构。 输入! 按下 Tab 键。利用插件在浏览器中预览页面:单击鼠标右键,在弹出窗口中点击“Open In D

【课程分享】深入浅出嵌入式linux系统移植开发 (环境搭建、uboot的移植、嵌入式内核的配置与编译)...-程序员宅基地

深入浅出嵌入式linux系统移植开发(环境搭建、uboot的移植、嵌入式内核的配置与编译) 亲爱的网友,我这里有套课程想和大家分享,假设对这个课程有兴趣的,能够加我的QQ2059055336和我联系。课程内容简单介绍本课程重点是给大家解说嵌入式linux系统移植的开发方法,採用理论与实践,硬件与软件相结合的方法。1.在每节開始之前先简单回想上一节所讲的主要内容,并对...