在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上。
GitHub - enigma19971/va-nodejs-addon: grab video and audio frames in nodejs addon envgrab video and audio frames in nodejs addon env. Contribute to enigma19971/va-nodejs-addon development by creating an account on 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