Потоковое видео из корзины MinIO на сервере Node.js с использованием тега HTML5 - PullRequest
1 голос
/ 29 января 2020

Мне нужно для потоковой передачи видео, хранящегося через 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). Я думаю, что это может быть проблема с кодеками, но я не знаю много о кодеках. Есть идеи?

...