在nodejs addon 环境下抓视频和音频数据包

发布时间 2023-06-04 19:46:38作者: 小阳明

在node addon 环境下开发音视频,需要用到 gyp 。这个配置比较简单,很快可以配置好。比较坑的是,在vscode 开发环境下, 如果装了conda 或者 mini conda . 有可能会影响gpy程序的编译。谨慎起见,可以看看控制台是否有 (conda base)环境启动, 可以想办法先脱离 conda 环境。

废话不说直接上代码:

const lib = require('./build/Release/Decode.node')
    // utils
function sleep(t) {
    var start = new Date().getTime();
    while (true) {
        if (new Date().getTime() - start > t) {
            break;
        }
    }
}

function doSomething() {
    for (let i = 0; i < 10; i++) {
        sleep(500)
        console.log('current time in node,', new Date().getTime());
    }
}
//========================================================================================
//                          Example OF Grabbing VIDEO and AUDIO
//========================================================================================
//step 1: init the lib
lib.Open()

//step 2: set callbacks here, we support 'Video', 'Audio', 'Error' 3 msg types.
lib.On('Video', (frame) => {
    console.log('#Video format=', frame.format);
    console.log('#Video width=', frame.width);
    console.log('#Video height=', frame.height);
    console.log('#Video size=', frame.size);
    // console.log(frame.data);
})
lib.On('Audio', (frame) => {
    console.log('#Audio format=', frame.format);
    console.log('#Audio rate=', frame.rate);
    console.log('#Audio size=', frame.size);
    // console.log(frame.data);
})
lib.On('Error', (msg) => {
        console.log('#5', msg);
    })
    //step 3: set uri, and begin to grab video and audio frames
lib.SetUri('https://sf1-hscdn-tos.pstatp.com/obj/media-fe/xgplayer_doc_video/flv/xgplayer-demo-360p.flv'); // can change to your own rtmp 

//step 4: you can your own work 
doSomething();

//step 5: finish
lib.Close()

 

该代码的运行环境为ubuntu , 目前不支持windows系统, 如果需要windows版本, 可联系作者。

首先, 导入 node 扩展程序。

第一步,初始化lib . 调用 Open 函数。

第二步, 注册回调函数, 流媒体程序一般采用多线程解码,当底层解码完数据帧后,调用JS端的回调来处理。 这里暂时支持三种类型的回调,即“Video”, "Audio", 和"Error"。 当底层解码一个完整的数据帧时候,调用 Video , Audio 类型的回调。 当底层发生错误时候,调用JS端的Error 类型回调。

第三步,指定解码的URI, 支持 HTTP RTSP RTMP 等。

第四步, 你可以运行自己的工作, 因为底层自己开发了线程处理数据流的接受和解码。并不会阻塞JS端的运行。

最后, 可以关闭LIB的功能,释放资源。

完整代码我已经发布在github上。

https://github.com/enigma19971/va-nodejs-addon.git

注意, 本项目基于gstreamer , 如果提示找不到各类 plugin . 请自行安装gstreamer.
 

sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-bad1.0-dev gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav gstreamer1.0-tools gstreamer1.0-x gstreamer1.0-alsa gstreamer1.0-gl gstreamer1.0-gtk3 gstreamer1.0-qt5 gstreamer1.0-pulseaudio