前端--video大视频播放(m3u8)

news/2024/7/24 9:08:10 标签: m3u8, video, ffmpeg, 前端视频播放

m3u8视频播放

  • 区别
  • ffmpeg
    • 安装homebrew
    • 安装ffmpeg
    • MP4 转 m3u8
      • 第一种
      • 第二种
    • 常用命令
  • demo
    • 目录
    • index.html
    • gulpfile.js
    • package.json
  • github地址

区别

视频播放是前端非常常见的一个功能需求,一般使用mp4格式,通过video标签播放就好。

网上对于视频播放的文章也非常多,但是mp4格式只适合一些小视频,例如一些几百兆,几个G 的视频,就不适合了。

mp4

mp4是媒体文件,如果视频过大,加载速度慢,而且即便暂停视频,也会持续加载。

m3u8_12">m3u8

m3u8文件是ts流文件的媒体路径和其他信息,可以直接快速切换到对应的时间段查看。

ffmpeg_16">ffmpeg

想直接使用m3u8文件,还需要对视频格式进行转码,这里就需要借助ffmpeg,windows下安装方式自行百度,这里我以Mac 为例,描述一下具体步骤。

安装homebrew

想安装 ffmpeg 还需要安装homebrew,具体步骤戳这里~

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"

ffmpeg_27">安装ffmpeg

brew instaill ffmpeg

安装完成后,可以通过 ffmpeg -version 查看版本,看看是否正常。

m3u8_35">MP4 转 m3u8

没有video 文件夹的话,记得提前创建 mkdir video

第一种

//转mp4为ts
ffmpeg -y -i /Users/xxx/xxx/testxxx.mp4 -vcodec copy -acodec copy -vbsf h264_mp4toannexb /Users/xxx/xxx/testxxx.ts

//对ts进行切片每5秒为一个片段
ffmpeg -i /Users/xxx/xxx/testxxx.ts -c copy -map 0 -f segment -segment_list /Users/xxx/xxx/video/index.m3u8 -segment_time 5 /Users/xxx/xxx/video/nxb-%04d.ts

第二种

ffmpeg -i /Users/xxx/xxx/testxxx.mp4 -c copy -map 0 -f segment -segment_list /Users/xxx/xxx/video/index.m3u8 -segment_time 6 /Users/xxx/xxx/video/nxb-%04d.ts

常用命令

示例意义
-i url (输入)输入文件网址
-y(glodal)无需询问即可覆盖输出文件
-c [:stream_specifier]编解码器(输入/输出,每个流)
copy复制 而无需重新编码
-map用于手动控制每个输出文件中的流选择
-segment_time切片ts文件播放时间 ,单位 秒
%04d.ts表示从1开始用0补全的4位整数为文件名的ts文件序列。 如果想要序列文件名为testt_001.ts等等的话,就是test_%03d.ts

ffmpeg中文文档

ffmpeg实用命令

demo

视频格式转换完成,就需要运行一下demo,看看效果如何了。

目录

├── gulpfile.js
├── index.html
├── index.m3u8
├── nxb-0000.ts
├── nxb-0001.ts
├── nxb-0002.ts
├── node_modules
└── package.json

具体m3u8 视频自行按照上述介绍转换。

index.html

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>前端播放m3u8格式视频</title>
    <link href="https://cdn.bootcss.com/video.js/7.6.5/alt/video-js-cdn.min.css" rel="stylesheet">
    <script src="https://cdn.bootcss.com/video.js/6.6.2/video.js"></script>
    <script src="https://cdn.bootcss.com/videojs-contrib-hls/5.15.0/videojs-contrib-hls.min.js"></script>
</head>
<body>
  <video id="myVideo" class="video-js vjs-default-skin vjs-big-play-centered" controls preload="auto" width="1080" height="708" data-setup='{}'>    
      <source id="source" src="./index.m3u8"  type="application/x-mpegURL">
  </video>
</body>
<script>    
  // videojs 简单使用  
  var myVideo = videojs('myVideo',{
      bigPlayButton : true, 
      textTrackDisplay : false, 
      posterImage: false,
      errorDisplay : false,
  })
  myVideo.play() // 视频播放
  myVideo.pause() // 视频暂停
</script>
</html>

gulpfile.js

 var gulp  = require ('gulp'),
    $=require("gulp-load-plugins")(),
    open = require("gulp-open");


const address = require('address');
const localhost = address.ip() || 'localhost';


//开启服务器
gulp.task("webserver",function () {
  $.connect.server({
    port : "3333",
    livereload : true,
    root: "./",
    host:localhost
  })
});

gulp.task('open', function(){
  gulp.src('./')
  .pipe(open({
    uri:'http://'+localhost+':3333'
  }));
});



gulp.task("dev",["webserver","open"]);

package.json

{
  "name": "dome",
  "version": "1.0.0",
  "description": "",
  "main": "gulpfile.js",
  "scripts": {
    "dev": "gulp dev",
    "build": "gulp build"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "address": "^1.1.2",
    "gulp": "^3.9.1",
    "gulp-connect": "^5.0.0",
    "gulp-load-plugins": "^1.5.0",
    "gulp-open": "^3.0.1"
  }
}

github地址

github地址具体代码


http://www.niftyadmin.cn/n/1558172.html

相关文章

在未来,AI式物流将“消灭”快递小哥

当前&#xff0c;快递小哥是个庞大的就业人群&#xff0c;但随着人工智能技术的发展&#xff0c;他们终将被人工智能所取代。 近日&#xff0c;世界最大快递承运商与包裹递送公司UPS又和另一家初创无人机制造公司CyPhy Works合作&#xff0c;并于上周四测验了无人机快运的可行性…

复制内容到剪切板 -- 换行

我们应该都遇到过这样一个需求&#xff0c;将某一段内容、ID、地址等&#xff0c;复制到粘贴板需求。 除了使用clipboard插件外&#xff0c;单纯的使用js也可以非常容易实现。 execCommand execCommand方法是执行一个对当前文档&#xff0c;当前选择或者给出范围的命令。 C…

修改 process.env 值

前端对于webpack构建工具肯定都不会陌生&#xff0c;最常见的便是通过process.env 判断当前环境。 那么如何修改&#xff0c;以及获取呢&#xff1f; Vue二级目录部署&多环境打包部署&#xff08;一&#xff09; Vue二级目录部署&多环境打包部署&#xff08;二&…

Codeforces Round #466 (Div. 2) E. Cashback

Codeforces Round #466 (Div. 2) E. Cashback(dp 贪心) 题意&#xff1a; 给一个长度为\(n\)的序列\(a_i\),给出一个整数\(c\) 定义序列中一段长度为k的区间的贡献为区间和减去前\(\lfloor \frac{k}{c} \rfloor\)小数的和 现在要给序列\(a_i\)做一个划分&#xff0c;使得贡献的…

node.js 学习---第一章

Node.js 简介 下一章 node 与 浏览器的区别 没有浏览器提供的 document、window、以及所有其他的对象在浏览器中&#xff0c;不存在 Node.js 通过其模块提供的所有不错的 API&#xff0c;例如文件系统访问功能Node.js 使用 CommonJS 模块系统&#xff0c;而在浏览器中&#…

利用html5 file api读取本地文件(如图片、PDF等)

在html4的年代&#xff0c;我们如果要在网页上呈现一张用户本地的图片&#xff0c;需要用户先把图片上传到服务器&#xff0c;再根据服务器提供的图片地址把图片下载下来&#xff0c;才能把图片在网页上呈现出来。这一来二往&#xff0c;起码已经费了两倍于这张图片的流量了&am…

node.js 学习---第二章

上一章 下一章 npm 包管理器简介 npm 是 Node.js 标准的软件包管理器。 它起初是作为下载和管理 Node.js 包依赖的方式&#xff0c;但其现在也已成为前端 JavaScript 中使用的工具。 yarn Yarn是facebook发布的一款取代npm的包管理工具 1&#xff09;速度超快----Yarn缓存…

「镁客·请讲」博雅工道熊明磊:专注消费者体验,做没有“尾巴”的水下机器人...

在熊明磊看来&#xff0c;使用门槛和价格的降低是立足消费级市场的成功所在。 从去年开始&#xff0c;在天空已经被大疆等厂商占据的情况下&#xff0c;水下成为了一个新的“战场”。更为准确的说&#xff0c;“水下机器人”市场一直都存在&#xff0c;只是去年逐步走进了大众…