我有一个RTMP服务器(node-media- Server ),在那里我可以从OBS发送流,并在浏览器中观看。为了使发送过程更简单,我想直接从浏览器发送流。
第一个想法是用navigator.getUserMedia()获取流数据。
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?
发布于 2021-07-09 14:06:09
将传入的blob发送到ffmpeg stdin
io.on("connection", (socket) => {
const ffmpeg = child_process.spawn('ffmpeg', [
'-f', 'lavfi', '-i', 'anullsrc',
'-i', '-',
'-vcodec', 'copy',
'-acodec', 'aac',
'-f', 'flv',
`rtmp://${url}/${key}`
])
ffmpeg.on('close', (code, signal) => {
console.log('FFmpeg child process closed, code ' + code + ', signal ' + signal);
});
ffmpeg.stdin.on('error', (e) => {
console.log('FFmpeg STDIN Error', e);
});
ffmpeg.stderr.on('data', (data) => {
console.log('FFmpeg STDERR:', data.toString());
});
ws._socket.on('data', (data) => {
// console.log("got tracks");
ffmpeg.stdin.write(data)
});
});
我引用了这个docs
发布于 2021-09-22 14:58:02
我使用'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)
})https://stackoverflow.com/questions/67616927
复制相似问题