node.js - 如何将流从 h265 转换为 h264
问题描述
我正在尝试使用 nodejs 创建一个媒体服务器,并且流式传输任何格式都没有问题,但是由于网络浏览器无法播放 H265 编解码器视频,我需要将它们转换为 H264,而 createReadStream 创建一个块,这样我就不必完全转换它们在此之前,只是服务器发送到浏览器的那个块。
const path = 'assets/yourfavmov.mkv';
const stat = fs.statSync(path);
const fileSize = stat.size;
const range = req.headers.range;
if (range) {
const rangeArray = range.replace(/bytes=/, "").split("-");
console.log(rangeArray)
const start = parseInt(rangeArray[0], 10);
const end = rangeArray[1] ? parseInt(rangeArray[1], 10) : fileSize-1;
const chunksize = (end-start) + 1;
const fileChunk = fs.createReadStream(path, {start, end});
const head = {
'Content-Range': `bytes ${start}-${end}/${fileSize}`,
'Accept-Ranges': 'bytes',
'Content-Length': chunksize,
'Content-Type': 'video/x-matroska'
};
res.writeHead(206, head);
fileChunk.pipe(res);
} else {
res.end("wont let you stream");
}
我尝试使用 ffmpeg-stream 转换流,就像这样
const converter = new Converter();
const input = converter.createInputStream({
f: "matroska,webm",
vcodec : "hevc"
})
const fileChunk = fs.createReadStream(path, {start, end});
fileChunk.pipe(input);
converter
.createOutputStream({ f: "matroska,webm", vcodec: "h264" })
.pipe(res);
但我不知道我所做的是对还是错,所以没有运气所以有办法做对吗?
提前致谢。
解决方案
“有没有办法做到正确”:
不是开箱即用,不。您正在尝试做的事情称为“及时”转码,它非常复杂。您必须考虑容器时间戳、音频启动样本、视频序列标头和其他一些东西。ffmpeg 不会为您执行此操作。出于所有意图和目的,您想要做的事情在今天的开源工具中是不可能的。
推荐阅读
- angular - Webpack Bundle Analyzer 给出错误 EACCES
- reactjs - 单击一个子组件隐藏所有其他相同的子组件
- python - 获取对调用函数的类实例的引用
- python - 如何从节点 js 关闭特定的 python 子进程和特定的 selenium webdriver 窗口
- swift - 如何使用 SwiftUI 视图代替表格视图单元格
- flutter - 查询当前 Flutter AppLifecycleState
- r - 生成引用现有变量的动态变量
- javascript - 在设备上运行应用程序时未触发 Google Sheets API
- android - 使用 Google 开发人员密钥签署 APK 后,支持 MirrorLink 的应用验证器失败
- android - Room SQLite 查询不返回任何结果,即使数据库中有匹配的行