前端实现大文件视频播放

498 阅读1分钟

实现方法

  1. 前端上传视频文件(可能需要用到大文件上传)
  2. 后端调用ffmpeg将视频转换成hls格式并切片
ffmpeg -i test.mp4 -hls_time 30 -hls_list_size 0 -f hls  a.m3u8

-i 表示输入(input) test.mp4, -hls_time 30 表示每个分块断是30秒, hls_list_size 表示序号是从0开始。 a.m3u8 表示最终生成的文件名。ffmpeg最终输出包含一个a.m3u8格式文件与若干.ts文件

  1. 后端返回给前端生成好的a.m3u8文件地址
  2. 前端调用第三方HLS播放库(如xgplayer)播放视频

前端代码示例

使用西瓜播放器V3版本播放hls视频流

// App.tsx
import { useEffect } from 'react'
import './App.css'
import Player from 'xgplayer';
import HlsPlayer from 'xgplayer-hls.js';
import 'xgplayer/dist/index.min.css';
function App() {
  useEffect(()=> {
    let player = new Player({
      id: "mse",
      url: "http://127.0.0.1:8080/a.m3u8",
      playsinline: true,
      width: 500,
      height: 300,
      autoplay: false,
      plugins: [HlsPlayer]
    });
  },[])
  return (
    <>
      <div id='mse'></div> 
    </>
  )
}
export default App
// package.json
{
  "name": "livestreamtest",
  "private": true,
  "version": "0.0.0",
  "type": "module",
  "scripts": {
    "dev": "vite",
    "build": "vite build",
    "lint": "eslint . --ext js,jsx --report-unused-disable-directives --max-warnings 0",
    "preview": "vite preview"
  },
  "dependencies": {
    "react": "^18.2.0",
    "react-dom": "^18.2.0",
    "xgplayer": "3.0.16",
    "xgplayer-hls.js": "^3.0.16"
  },
  "devDependencies": {
    "@types/react": "^18.2.66",
    "@types/react-dom": "^18.2.22",
    "@vitejs/plugin-react": "^4.2.1",
    "eslint": "^8.57.0",
    "eslint-plugin-react": "^7.34.1",
    "eslint-plugin-react-hooks": "^4.6.0",
    "eslint-plugin-react-refresh": "^0.4.6",
    "vite": "^5.2.0"
  }
}

参考连接

  1. 关于大视频video播放的问题以及解决方案(m3u8的播放)
  2. 西瓜播放器V3官网
  3. 前端流媒体播放从入门到入坑