代码拉取完成,页面将自动刷新
const ffmpegPath = require('@ffmpeg-installer/ffmpeg');
const ffmpeg = require('fluent-ffmpeg');
const websocketStream = require('websocket-stream/stream');
const WebSocket = require('ws');
const SERVER="http://8.142.135.163:8100";
const PROXY_ID="wx-mixc-01"
const url = `${SERVER}/proxy?proxyId=${PROXY_ID}`;
let retryTimeout = 1000; // 初始重连间隔时间 (毫秒)
ffmpeg.setFfmpegPath(ffmpegPath.path);
function processFFmpeg(event) {
console.log('process ffmpeg')
const pushUrl = `${SERVER}/push?connectId=${event.connectId}`
const ws = websocketStream(pushUrl, { websocket: WebSocket });
function processEvent(event) {
const rtsp = event.payload.rtsp
try {
ffmpeg(rtsp)
.addInputOption(
'-rtsp_transport', 'tcp',
'-buffer_size', '102400'
)
.on('start', (commandLine) => {
console.log('code start');
})
.on('codecData', function (data) {
console.log(data, '');
})
.on('progress', function (progress) {
// console.log(progress,'转码进度')
})
.on('error', function (err, a, b) {
console.log(url, '转码 错误: ', err.message);
console.log('输入错误', a);
console.log('输出错误', b);
})
.on('end', function () {
console.log(url, '转码 结束!');
})
.addOutputOption(
'-threads', '4', // 一些降低延迟的配置参数
'-tune', 'zerolatency',
'-preset', 'ultrafast'
)
.outputFormat('flv') // 转换为flv格式
.videoCodec('libx264') // ffmpeg无法直接将h265转换为flv的,故需要先将h265转换为h264,然后再转换为flv
.withSize('25%') // 转换之后的视频分辨率原来的50%, 如果转换出来的视频仍然延迟高,可按照文档上面的描述,自行降低分辨率
.noAudio() // 去除声音
.pipe(ws,{ end: true });
} catch (error) {
console.log('抛出异常', error);
}
}
ws.on('connect', () => {
processEvent(event)
console.log('connnected to send rtsp stream')
})
ws.on('close',()=>{
console.log('disconnect push stream')
})
}
function connect() {
const ws = websocketStream(url, { websocket: WebSocket });
ws.on('connect', () => {
console.log('已连接到 WebSocket 服务器:', url);
retryTimeout = 1000; // 连接成功后重置重试时间
});
// 监听接收到的消息
ws.on('data', (data) => {
const event = JSON.parse(data.toString())
console.log('event:', event)
if (event.action == 'connected') {
processFFmpeg(event)
}
});
// 监听错误
ws.on('error', (error) => {
console.error('WebSocket 错误:', error);
});
// 监听连接关闭事件并重试
ws.on('close', () => {
console.log('连接已断开,尝试重新连接...');
ws.end();
// 使用指数回退算法增加重连时间间隔
setTimeout(connect, retryTimeout);
retryTimeout = Math.min(retryTimeout * 2, 30000); // 最大重试间隔 30 秒
});
ws.write('Hello, WebSocket Server!');
}
// 初次连接
connect();
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。