我正在尝试在 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);
}
我认为这是因为我们事先不知道最终转码文件的大小,因此我们在标头中发送的范围是错误的,并且不知何故使视频播放器“受限”。
有什么办法可以解决这个问题?