node 实现h264视频流buffer转码flv并使用websocket发送

背景

硬件海康旧监控, 编写node服务端以实现网页播放,调用了之前用C封装好的海康接口,视频数据由接口通过回调函数传参过来形成h64裸数据Buffer,本博客记录的就是如何从视频裸流 Buffer转码并回传给websocket。

直接上代码

代码自己参悟,不懂的地方见评论区

global.isWorking = false;
app_express.ws("/realplay", function(ws, req) {
    console.log("[server] coonected to ws video")
    if (global.isWorking) {
        return;
    }
    // ws.send("hello client ")

    var ret = hknode.realPlay(req.query.ch, function(type, buf) {
        // console.log("node server", type, buf.length, buf[0], buf[1], buf[2]);
        duplexStream.push(buf);
    });
    console.log('get node api realplay ret = ', ret);
    if (ret == 0) {
        global.isWorking = true;
        // var ffmpegStream = ffmpeg("rtsp://admin:[email protected]:554/h264/ch33/main/av_stream").noAudio().videoCodec('libx264').format('flv')
        var ffmpegStream = ffmpeg(duplexStream).noAudio().videoCodec('libx264').format('flv')
            .on('data', function(data) {
                console.log("data len", data.length);
            })
            .on('error', function(error) {
                console.log("error ffmpeg", error);
            })
            .on('end', function() {
                console.log('exchanged end ffmpeg');
            }).pipe();
        ffmpegStream.on('data', (chunk) => {
            // console.log(chunk.length, chunk);
            // console.log("get the flv data", chunk.length, chunk[0], chunk[1], chunk[2]);
            ws.send(chunk);
        }).on('end', () => {
            console.log("ffmpeg pipe end");
        });
    }
});

编程小白,如有不足之处,请在评论区指出,不胜感激。

你可能感兴趣的:(经验详谈,NodeJs,websocket,nodejs,express,fluent-ffmpeg)