MSE学习日记 —— 播放H265视频

252 阅读2分钟

MSE学习日记 —— 播放H265视频

在MDN中找到样例(MediaSource - Web APIs | MDN (mozilla.org))

  1. 新建MSEDemo.html
<html><head>
  <meta charset="utf-8">
</head>
<body>
  <video controls="" width="1600" height="900"></video>
  <script>
    var video = document.querySelector('video');
    var assetURL = 'frag_bunny.mp4';
    // Need to be specific for Blink regarding codecs
    // ./mp4info frag_bunny.mp4 | grep Codec
    var mimeCodec = 'video/mp4; codecs="avc1.42E01E, mp4a.40.2"';

    if ('MediaSource' in window && 
    MediaSource.isTypeSupported(mimeCodec)) {
      var mediaSource = new MediaSource;
      console.log(mediaSource.readyState); // closed
      video.src = URL.createObjectURL(mediaSource);
      mediaSource.addEventListener('sourceopen', sourceOpen);
    } else {
      console.error('Unsupported MIME type or codec: ', mimeCodec);
    }

    function sourceOpen (e) {
      console.log(this.readyState); // open
      var mediaSource = e.target;
      var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
      fetchAB(assetURL, function (buf) {
        sourceBuffer.addEventListener('updateend', function (_) {
          mediaSource.endOfStream();
          video.play();
          //console.log(mediaSource.readyState); // ended
        });
        console.log("buf",buf);
        sourceBuffer.appendBuffer(buf);
      });
    };

    function fetchAB (url, cb) {
      console.log(url);
      var xhr = new XMLHttpRequest;
      xhr.open('get', url);
      xhr.responseType = 'arraybuffer';
      xhr.onload = function () {
        cb(xhr.response);
      };
      xhr.send();
    };
  </script>
</body></html>

2. 将样例视频(frag_bunny.mp4)放置在与html文件同一文件夹内。 3. 双击打开MSEDemo.html

踩坑一:浏览器报错

Access to XMLHttpRequest at 'file:///C:/Users/%E9%99%88%E4%B8%BD%E8%8E%8E/Desktop/MSE/frag_bunny.mp4' from origin 'null' has been blocked by CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome, https, chrome-untrusted. image.png 根据错误信息大概知道原因在于使用了 File 协议,应该使用它提示的 http, data, chrome, chrome-extension, chrome-untrusted, https 这些协议。

解决方法:

介绍使用nodejs搭建本地服务器方式:

  1. 下载安装nodejs
  2. npm init -y 创建node项目并生成package.json
  3. 引入express npm install express
  4. 新建static文件夹放入视频文件 此时的目录结构如下: image.png
  5. 新建myServer.js
var express = require('express')
var path = require('path')
var app = express()

app.get('/', (req, res) => {
  res.send('Hello World!')
})
app.get('/frag_bunny.mp4', function (req, res, next) {
  res.header('Access-Control-Allow-Origin', '*')//解决跨域问题
  res.sendFile(path.join(__dirname, 'static/frag_bunny.mp4'));
})

app.listen(8083, () => {
  console.log('Server is runing at http://localhost:8083');
})

6. 在终端输入node myServer.js 运行本地服务器

image.png 7. 将MSEDemo.html中的视频地址改成服务器访问地址

image.png

  1. 双击MSEDemo.html文件可以运行

踩坑二:只能播放样例视频,别的fmp4视频无法点播

解决方法:

使用Bento4(链接:pan.baidu.com/s/1nwYQt1MK… 提取码:0o5z)转换视频格式

  • 下载Bento4并解压,在该文件目录\Bento4-SDK-1-6-0-641.x86_64-microsoft-win32\bin下运行cmd,打开命令行窗口输入.\mp4fragment.exe .\1080ph265.mp4 1080ph265_new.mp4
  • 注:待转换视频可直接置于bin目录下,当前转换视频为fmp4的h265视频,1080ph265_new.mp4即为转换好的视频

踩坑三:获取点播视频源的codec

打开链接(gpac.github.io/mp4box.js/t…

image.png 将MSEDemo.html中的codecs改成对应值

1715761202074.png 双击MSEDemo.html运行即可

image.png 完整代码及视频文件地址(Stu1125/MSE (github.com)