具有范围的 NodeJS 请求不适用于 HTML5 视频
NodeJS request with range does not work with HTML5 video
我已经使用 nodejs 实现了一个请求,以提供范围支持的视频,后端如下所示:
import { createReadStream, statSync } from 'fs';
const stats = statSync(path);
const range = request.headers.range;
const parts = range.replace(/bytes=/, '').split('-');
const start = parseInt(parts[0], 10);
let end = parts[1] ? parseInt(parts[1], 10) : start + 10 * 1024 ** 2;
if (end > stats.size) {
end = stats.size;
}
const stream = createReadStream(path, {
emitClose: false,
flags: 'r',
start,
end,
});
reply.status(206).headers({
'content-type': 'video/webm',
'accept-ranges': 'bytes',
'content-length': end - start,
'content-range': `bytes ${start}-${end}/${stats.size}`,
}).send(stream);
这是一个 fastify api,我的前端看起来像这样
<video :src="videoUrl" @timeupdate="playProgress" @error="videoError" @loadedmetadata="videoDataLoaded" @ended="videoEnd" ref="video" />
这是一个 vue 网络应用程序,现在的问题是,video 元素仅发送两个范围如下的请求然后抛出错误 PIPELINE_ERROR_READ: FFmpegDemuxer: data source error
,请求:
range: bytes=0-
range: bytes=147456000-
令人惊讶的是我每个请求只有 return 10mb 的数据,所以第二个请求很远。这让我发疯,我不知道缺少什么,此时任何帮助都将不胜感激,我已经在这上面浪费了很多时间。
尝试
'content-length': end - start + 1,
还有这个
let end = parts[1] ? parseInt(parts[1], 10) : stat.size - 1;
而不是
let end = parts[1] ? parseInt(parts[1], 10) : start + 10 * 1024 ** 2;
我已经使用 nodejs 实现了一个请求,以提供范围支持的视频,后端如下所示:
import { createReadStream, statSync } from 'fs';
const stats = statSync(path);
const range = request.headers.range;
const parts = range.replace(/bytes=/, '').split('-');
const start = parseInt(parts[0], 10);
let end = parts[1] ? parseInt(parts[1], 10) : start + 10 * 1024 ** 2;
if (end > stats.size) {
end = stats.size;
}
const stream = createReadStream(path, {
emitClose: false,
flags: 'r',
start,
end,
});
reply.status(206).headers({
'content-type': 'video/webm',
'accept-ranges': 'bytes',
'content-length': end - start,
'content-range': `bytes ${start}-${end}/${stats.size}`,
}).send(stream);
这是一个 fastify api,我的前端看起来像这样
<video :src="videoUrl" @timeupdate="playProgress" @error="videoError" @loadedmetadata="videoDataLoaded" @ended="videoEnd" ref="video" />
这是一个 vue 网络应用程序,现在的问题是,video 元素仅发送两个范围如下的请求然后抛出错误 PIPELINE_ERROR_READ: FFmpegDemuxer: data source error
,请求:
range: bytes=0-
range: bytes=147456000-
令人惊讶的是我每个请求只有 return 10mb 的数据,所以第二个请求很远。这让我发疯,我不知道缺少什么,此时任何帮助都将不胜感激,我已经在这上面浪费了很多时间。
尝试
'content-length': end - start + 1,
还有这个
let end = parts[1] ? parseInt(parts[1], 10) : stat.size - 1;
而不是
let end = parts[1] ? parseInt(parts[1], 10) : start + 10 * 1024 ** 2;