如何将流从 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,end}); 
fileChunk.pipe(input);
converter
  .createOutputStream({ f: "matroska,vcodec: "h264" })
  .pipe(res);

但我不知道我所做的是对还是错,所以没有运气 那么有没有办法做到这一点?

提前致谢。

解决方法

“有没有办法做到这一点”:

不是开箱即用的,不是。您正在尝试执行的操作称为“及时”转码,并且非常复杂。您必须考虑容器时间戳、音频启动样本、视频序列标题和其他一些内容。 ffmpeg 不会为您执行此操作。无论出于何种意图和目的,今天的开源工具都无法实现您想要做的事情。

,

您应该做的是在请求视频之前进行编码。 (及时编码意味着每次有人看电影时都要重新编码,这真的很低效)

Netflix 不会在您请求视频时对其进行编码 - Netflix 拥有一个已编码的视频库,并在发出请求时准备就绪。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...