3

我正在尝试在 node.js 中使用createReadStream和使用流式传输视频pipe(res),如果文件不需要转码(mp4、webm),它可以正常工作。

对于 mkv 文件,我正在使用 fluent-ffmpeg 对其进行动态转码,但问题是我无法在 html 视频播放器中前后移动。

download = function(file, req, res) {   

    const range = req.headers.range
    const parts = range.replace(/bytes=/, "").split("-")

    const start = parseInt(parts[0], 10);
    const end = parts[1] ? parseInt(parts[1], 10) : file.length - 1

    res.setHeader('Content-Type', 'video/webm')
    res.setHeader('Accept-Ranges', 'bytes');
    res.setHeader('Content-Length', 1 + end - start);
    res.setHeader('Content-Range', `bytes ${start}-${end}/${file.length}`);
    res.statusCode = 206;

    var stream = file.createReadStream({start, end})

    ffmpeg(stream)
    .videoCodec('libvpx')
    .audioCodec('libvorbis')
    .videoBitrate('512k')
    .format('webm')
    .on('start', () => {
        console.log('transcoding...')
    })
    .on('error', (err, stdout, stderr) => {
        console.log(err.message, err, stderr);
    })
    .on('progress', function(progress) {
        console.log(progress);
    })
    .on('end', function(filenames) {
        console.log("Finished transcoding.");           
    })
    .pipe(res);

}

我认为这是因为我们事先不知道最终转码文件的大小,因此我们在标头中发送的范围是错误的,并且不知何故使视频播放器“受限”。

有什么办法可以解决这个问题?

4

0 回答 0