Мне нужно для потоковой передачи видео, хранящегося через MinIO, используя HTML5 MSE. Я использую клиент узла minio на сервере-сапере для обслуживания видеопотока с такой конечной точкой:
import Minio from 'minio'
const minioClient = new Minio.Client({
endPoint: 'localhost',
port: 9000,
useSSL: false,
accessKey: 'minio_access',
secretKey: 'minio_secret'
})
export async function get(req, res, next) {
const { id } = req.params
minioClient.getObject("videos", id, (err, stream) => {
if(err) {
res.statusCode = 500
return res.end(err)
}
stream.pipe(res)
})
}
Я протестировал эту конечную точку с curl -o vid.mp4 http://localhost:3000/asset/video/vid.mp4
и загрузил видео хорошо.
На стороне клиента я пытаюсь получить поток, преобразовать его в ArrayBuffer
и отобразить его на элементе видео:
function startVideo() {
player = document.getElementById("player")
const mediaSource = new MediaSource()
const url = URL.createObjectURL(mediaSource)
player.src = url
mediaSource.addEventListener('sourceopen', sourceOpen)
}
async function sourceOpen() {
let mediaSource = this
const videoSourceBuffer = mediaSource.addSourceBuffer('video/mp4; codecs="avc1.42E01E, mp4a.40.2"')
let fetchResult = await fetch(`/asset/video/${videoLocation}`)
let videoData = await fetchResult.arrayBuffer()
videoSourceBuffer.appendBuffer(videoData)
}
Элемент видео однако не отображает видео; просто пустой экран с перечеркнутой кнопкой воспроизведения (в Safari). Я думаю, что это может быть проблема с кодеками, но я не знаю много о кодеках. Есть идеи?