node.js - 如何使用 React 和节点将视频流发送到 RTMP 服务器
问题描述
我有一个 RTMP 服务器(节点媒体服务器),我可以在其中从 OBS 发送流并在浏览器中观看它们。为了使发送过程更容易,我想直接从浏览器发送流。
第一个想法是使用 navigator.getUserMedia() 获取 Streamdata
const getVideo = () => {
navigator.mediaDevices
.getUserMedia({ video: { width: 300 } })
.then(stream => {
let video = videoRef.current;
video.srcObject = stream;
video.play();
})
.catch(err => {
console.error("error:", err);
});
};
这显示了视频元素中的媒体。有没有办法将此流实时发送到 rtmp?也许我必须创建一个新的 MediaRecorder 对象,但我如何发送它?是否有另一种方式作为 websocket 发送它?
欢迎所有获得起点的想法。
更新 1
我创建了一个 MediaRecorder 对象并使用 Websocket 发送它:
.then(stream => {
let mediaRecorder = new MediaRecorder(stream);
mediaRecorder.start(250);
mediaRecorder.ondataavailable = function(e) {
ws.send(e.data);
}
//...
}
在 node.js 方面
ws._socket.on('data', (data) => console.log('incoming_data'));
安慰:
Eߣ�B��B��B�BB��matroskaB��B��S�g�������I�f�*ױ�B@M��ChromeWA�ChromeT�k���ׁsŇ��v0��烁��V_MPEG4/ISO/AVC��������C�u��������
不确定这是否正确。如果正确,我如何将这些数据提供给节点媒体服务器?
解决方案
我使用“node-media-server”包来处理 RTMP。
这个对我有用。
const ffmpeg = child_process.spawn("ffmpeg", [
"-f",
"lavfi",
"-i",
"anullsrc",
"-i",
"-",
"-c:v",
"libx264",
"-preset",
"veryfast",
"-tune",
"zerolatency",
"-c:a",
"aac",
"-f",
"flv",
`rtmp://127.0.0.1:1935/live/key`
])
io.on('data', (data) => {
ffmpeg.stdin.write(data)
})
推荐阅读
- laravel - 供应商/laravel/framework/src/Illuminate/Database/Connection.php:678
- php - 致命错误:未捕获的 ArgumentCountError:绑定变量的数量与准备好的语句中的字段数量不匹配
- static - 如何静态编译tshark?
- amazon-web-services - 带有自定义 AMI 的 AWS ElasticBeanstalk
- google-apps-script - 如何从谷歌驱动应用脚本中的发布请求接收--data-binary
- azure-ad-b2c - 将现有用户迁移到 Azure AD b2c
- docker - Docker容器中的数据和主机卷之间的区别?
- java - 如何在回收站视图中只选择一个开关?
- elasticsearch - 无法使用 Elasticsearch apm 代理选项启动 Weblogic
- php - 为什么标头功能无法正常工作?