Giter VIP home page Giter VIP logo

basic-recording's People

Contributors

charliecaolucky avatar plutoless avatar prwrl avatar sidsharma27 avatar unibosy avatar williamdxz avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

basic-recording's Issues

mozRTCPeerConnection is not defined

I have successfully recorded with On-Premise-Recording-Nodejs in Google Chrome. But I have face an error with Mozilla Firefox Developer Edition with version 113.0b2 (64-bit).

Error occurred in console like this:

Uncaught ReferenceError: mozRTCPeerConnection is not defined.

How to change channel profile

I have tried recording the video call but the file containing only audio and all video is all green. So, I've gone through Agora console and found out that it is recording in Broadcast mode. How can I convert back to RTC mode.
Thank you.

build.sh error

I am getting the following errors while running build.sh, I tried downgrading my node version but got the same error.

LOGS:--------------------------------------------------------------------------------------------------------------------------
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | x64
gyp info ok
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | x64
gyp info find Python using Python version 2.7.17 found at "/usr/bin/python"
gyp info spawn /usr/bin/python
gyp info spawn args [
gyp info spawn args '/usr/lib/node_modules/node-gyp/gyp/gyp_main.py',
gyp info spawn args 'binding.gyp',
gyp info spawn args '-f',
gyp info spawn args 'make',
gyp info spawn args '-I',
gyp info spawn args '/home/kj/Documents/Basic-Recording/On-Premise-Recording-Nodejs/record/src/build/config.gypi',
gyp info spawn args '-I',
gyp info spawn args '/usr/lib/node_modules/node-gyp/addon.gypi',
gyp info spawn args '-I',
gyp info spawn args '/home/kj/.cache/node-gyp/12.16.2/include/node/common.gypi',
gyp info spawn args '-Dlibrary=shared_library',
gyp info spawn args '-Dvisibility=default',
gyp info spawn args '-Dnode_root_dir=/home/kj/.cache/node-gyp/12.16.2',
gyp info spawn args '-Dnode_gyp_dir=/usr/lib/node_modules/node-gyp',
gyp info spawn args '-Dnode_lib_file=/home/kj/.cache/node-gyp/12.16.2/<(target_arch)/node.lib',
gyp info spawn args '-Dmodule_root_dir=/home/kj/Documents/Basic-Recording/On-Premise-Recording-Nodejs/record/src',
gyp info spawn args '-Dnode_engine=v8',
gyp info spawn args '--depth=.',
gyp info spawn args '--no-parallel',
gyp info spawn args '--generator-output',
gyp info spawn args 'build',
gyp info spawn args '-Goutput_dir=.'
gyp info spawn args ]
gyp info ok
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | x64
gyp info spawn make
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
make: Entering directory '/home/kj/Documents/Basic-Recording/On-Premise-Recording-Nodejs/record/src/build'
CXX(target) Release/obj.target/agorasdk/agora_node_ext/AgoraSdk.o
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:47:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [2])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
^
../agora_node_ext/AgoraSdk.cpp:226:9: note: in expansion of macro ‘MAKE_JS_CALL_2’
MAKE_JS_CALL_2(REC_EVENT_ERROR, int32, error, int32, stat_code);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:47:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [2])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
^
../agora_node_ext/AgoraSdk.cpp:239:9: note: in expansion of macro ‘MAKE_JS_CALL_2’
MAKE_JS_CALL_2(REC_EVENT_JOIN_CHANNEL, string, channelName.c_str(), uid, uid);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value
)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:24:79: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, std::nullptr_t)’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 0, nullptr);
^
../agora_node_ext/AgoraSdk.cpp:246:9: note: in expansion of macro ‘MAKE_JS_CALL_0’
MAKE_JS_CALL_0(REC_EVENT_LEAVE_CHANNEL);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:35:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [1])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 1, argv);
^
../agora_node_ext/AgoraSdk.cpp:264:9: note: in expansion of macro ‘MAKE_JS_CALL_1’
MAKE_JS_CALL_1(REC_EVENT_USER_JOIN, uid, uid);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value
)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:35:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [1])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 1, argv);
^
../agora_node_ext/AgoraSdk.cpp:277:9: note: in expansion of macro ‘MAKE_JS_CALL_1’
MAKE_JS_CALL_1(REC_EVENT_USER_LEAVE, uid, uid);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:35:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [1])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 1, argv);
^
../agora_node_ext/AgoraSdk.cpp:283:9: note: in expansion of macro ‘MAKE_JS_CALL_1’
MAKE_JS_CALL_1(REC_EVENT_ACTIVE_SPEAKER, uid, uid);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value
)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:47:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [2])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
^
../agora_node_ext/AgoraSdk.cpp:406:9: note: in expansion of macro ‘MAKE_JS_CALL_2’
MAKE_JS_CALL_2(REC_EVENT_ERROR, int32, err, int32, stat_code);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In member function ‘void agora::AgoraSdk::onAudioVolumeIndication_node(const agora::linuxsdk::AudioVolumeInfo
, unsigned int)’:
../agora_node_ext/AgoraSdk.cpp:417:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < speakerNumber; i++) {
~~^~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:419:101: warning: ‘bool v8::Object::Set(v8::Localv8::Value, v8::Localv8::Value)’ is deprecated: Use maybe version [-Wdeprecated-declarations]
pi_create_string_(isolate, "uid"), napi_create_uid_(isolate, speakers[i].uid));
^
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/v8-internal.h:14:0,
from /home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:27,
from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:3499:22: note: declared here
bool Set(Local key, Local value));
^
/home/kj/.cache/node-gyp/12.16.2/include/node/v8config.h:328:3: note: in definition of macro ‘V8_DEPRECATED’
declarator attribute((deprecated(message)))
^~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:420:110: warning: ‘bool v8::Object::Set(v8::Localv8::Value, v8::Localv8::Value)’ is deprecated: Use maybe version [-Wdeprecated-declarations]
string(isolate, "volume"), napi_create_uint32_(isolate, speakers[i].volume));
^
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/v8-internal.h:14:0,
from /home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:27,
from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:3499:22: note: declared here
bool Set(Local key, Local value));
^
/home/kj/.cache/node-gyp/12.16.2/include/node/v8config.h:328:3: note: in definition of macro ‘V8_DEPRECATED’
declarator attribute((deprecated(message)))
^~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:421:36: warning: ‘bool v8::Object::Set(uint32_t, v8::Localv8::Value)’ is deprecated: Use maybe version [-Wdeprecated-declarations]
arrSpeakers->Set(i, obj);
^
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/v8-internal.h:14:0,
from /home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:27,
from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:3508:22: note: declared here
bool Set(uint32_t index, Local value));
^
/home/kj/.cache/node-gyp/12.16.2/include/node/v8config.h:328:3: note: in definition of macro ‘V8_DEPRECATED’
declarator attribute((deprecated(message)))
^~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:428:72: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [2])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
^
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In member function ‘virtual void agora::AgoraSdk::onAudioVolumeIndication(const agora::linuxsdk::AudioVolumeInfo
, unsigned int)’:
../agora_node_ext/AgoraSdk.cpp:435:26: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
for(int i = 0; i < speakerNum; i++) {
~~^~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:74:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [4])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 4, argv);
^
../agora_node_ext/AgoraSdk.cpp:449:9: note: in expansion of macro ‘MAKE_JS_CALL_4’
MAKE_JS_CALL_4(REC_EVENT_FIRST_VIDEO_FRAME, uid, uid, int32, width, int32, height, int32, elapsed);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:47:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [2])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
^
../agora_node_ext/AgoraSdk.cpp:455:9: note: in expansion of macro ‘MAKE_JS_CALL_2’
MAKE_JS_CALL_2(REC_EVENT_FIRST_AUDIO_FRAME, uid, uid, int32, elapsed);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value
)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:47:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [2])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
^
../agora_node_ext/AgoraSdk.cpp:461:9: note: in expansion of macro ‘MAKE_JS_CALL_2’
MAKE_JS_CALL_2(REC_EVENT_STREAM_CHANGED, bool, receivingAudio, bool, receivingVideo);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:24:79: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, std::nullptr_t)’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 0, nullptr);
^
../agora_node_ext/AgoraSdk.cpp:467:9: note: in expansion of macro ‘MAKE_JS_CALL_0’
MAKE_JS_CALL_0(REC_EVENT_CONN_LOST);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value
)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:24:79: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, std::nullptr_t)’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 0, nullptr);
^
../agora_node_ext/AgoraSdk.cpp:473:9: note: in expansion of macro ‘MAKE_JS_CALL_0’
MAKE_JS_CALL_0(REC_EVENT_CONN_INTER);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:60:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [3])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 3, argv);
^
../agora_node_ext/AgoraSdk.cpp:479:9: note: in expansion of macro ‘MAKE_JS_CALL_3’
MAKE_JS_CALL_3(REC_EVENT_REMOTE_VIDEO_STREAM_STATE_CHANGED, uid, uid, int32, state, int32, reason);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value
)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:60:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [3])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 3, argv);
^
../agora_node_ext/AgoraSdk.cpp:485:9: note: in expansion of macro ‘MAKE_JS_CALL_3’
MAKE_JS_CALL_3(REC_EVENT_REMOTE_AUDIO_STREAM_STATE_CHANGED, uid, uid, int32, state, int32, reason);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:47:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [2])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
^
../agora_node_ext/AgoraSdk.cpp:492:9: note: in expansion of macro ‘MAKE_JS_CALL_2’
MAKE_JS_CALL_2(REC_EVENT_REJOIN_SUCCESS, string, sChannelId.c_str(), uid, uid);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value
)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:47:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [2])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
^
../agora_node_ext/AgoraSdk.cpp:498:9: note: in expansion of macro ‘MAKE_JS_CALL_2’
MAKE_JS_CALL_2(REC_EVENT_CONN_STATE_CHANGED, int32, state, int32, reason);
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:518:106: warning: ignoring return value of ‘v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value
)’, declared with attribute warn_unused_result [-Wunused-result]
llback.Get(isolate)->Call(context, it->second->js_this.Get(isolate), 2, arg);
^
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:539:106: warning: ignoring return value of ‘v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)’, declared with attribute warn_unused_result [-Wunused-result]
llback.Get(isolate)->Call(context, it->second->js_this.Get(isolate), 2, arg);
^
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:565:106: warning: ignoring return value of ‘v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value
)’, declared with attribute warn_unused_result [-Wunused-result]
llback.Get(isolate)->Call(context, it->second->js_this.Get(isolate), 1, arg);
^
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:47:76: error: no matching function for call to ‘v8::Function::Call(v8::Localv8::Object, int, v8::Localv8::Value [2])’
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
^
../agora_node_ext/AgoraSdk.cpp:574:9: note: in expansion of macro ‘MAKE_JS_CALL_2’
MAKE_JS_CALL_2(REC_EVENT_LOCAL_USER_REGISTER, uid, uid, string, sUserAccount.c_str());
^~~~~~~~~~~~~~
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate: v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value)
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: candidate expects 4 arguments, 3 provided
../agora_node_ext/AgoraSdk.cpp: In lambda function:
../agora_node_ext/AgoraSdk.cpp:595:106: warning: ignoring return value of ‘v8::MaybeLocalv8::Value v8::Function::Call(v8::Localv8::Context, v8::Localv8::Value, int, v8::Localv8::Value
)’, declared with attribute warn_unused_result [-Wunused-result]
llback.Get(isolate)->Call(context, it->second->js_this.Get(isolate), 2, arg);
^
In file included from /home/kj/.cache/node-gyp/12.16.2/include/node/node.h:67:0,
from ../agora_node_ext/node_napi_api.h:17,
from ../agora_node_ext/AgoraSdk.h:8,
from ../agora_node_ext/AgoraSdk.cpp:11:
/home/kj/.cache/node-gyp/12.16.2/include/node/v8.h:4298:43: note: declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^~~~
agorasdk.target.mk:119: recipe for target 'Release/obj.target/agorasdk/agora_node_ext/AgoraSdk.o' failed
make: *** [Release/obj.target/agorasdk/agora_node_ext/AgoraSdk.o] Error 1
make: Leaving directory '/home/kj/Documents/Basic-Recording/On-Premise-Recording-Nodejs/record/src/build'
gyp ERR! build error
gyp ERR! stack Error: make failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/lib/node_modules/node-gyp/lib/build.js:194:23)
gyp ERR! stack at ChildProcess.emit (events.js:310:20)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:275:12)
gyp ERR! System Linux 5.3.0-46-generic
gyp ERR! command "/usr/bin/node" "/usr/bin/node-gyp" "build"
gyp ERR! cwd /home/kj/Documents/Basic-Recording/On-Premise-Recording-Nodejs/record/src
gyp ERR! node -v v12.16.2
gyp ERR! node-gyp -v v5.1.1
gyp ERR! not ok

Compile Restful-Recording-Nodejs error

When run ./build_debug.sh, an error occurred

../agora_node_ext/AgoraSdk.cpp:190:15: error: ‘class agora::recording::IRecordingEngine’ has no member named ‘stoppedOnError’
m_engine->stoppedOnError();

Please fix it. Now i can't install recording server

Error: recorder not exists

After successful built of SDK for nodejs 12, running start resulted in:

0|app  | setting mix layout...
0|app  | joinChannel...
0|app  | appliteDir 
0|app  | /home/vladimir/agora-recording/record/src/sdk/bin/
0|app  | pRecording->m_agorasdk->createChannel return result:
0|app  | 1
0|app  | Error: 101,with stat_code:1
0|app  | sdk stopped due to err code: 101 stat: 1
0|app  | stop recorder APP_ID CHANNEL_ID KEY
0|app  | Error: recorder not exists
0|app  |     at RecordManager.onCleanup (/home/vladimir/agora-recording/server/recordManager.js:154:19)
0|app  |     at AgoraRecordSdk.<anonymous> (/home/vladimir/agora-recording/server/recordManager.js:72:18)
0|app  |     at AgoraRecordSdk.emit (events.js:327:22)
0|app  |     at Immediate.<anonymous> (/home/vladimir/agora-recording/record/AgoraRecordSdk.js:18:18)
0|app  |     at processImmediate (internal/timers.js:456:21)

On-Premise Recording stop record unexpectedly

I have an issue when record successfully record the video stream, recorder unexpectedly and randomly stopped, but streaming is still continous. I have checked the error in pm2 but there is nothing error. I confuse to re-produces this error start from where. When I record 1:30 minutes, the video recorded only 00:17 seconds even less than it. I create a new account, but the problem still exist. Perhaps I have reach 10.000 minutes limit every month, but when I check in agora console, the usage is not reach 10.000 minutes.

build.sh error with nodejs 12.18.0

build.sh command is working fine with nodejs version 10.19.0 , But build.sh command is not working with nodejs version 12.18.0 and I want to use this command with node 12 version so can you help me out with this.

Incorrect Documentation in README

In Step 4 it says to replace certain folder

  1. Replace the following folders in the sample application with the folders from the downloaded SDK package.
  • include folder
  • tools folder
  • base folder

but in the /samples folder only base folder exists. The other two folders include and tools exist in the root directory of this project but not in samples directory.

Where should the folders be copied to?

Error Running On-Premise-Recording-Nodejs examples

Running on Ubuntu 14.04 with node 8.9.4.

Running the node sdkdemo.js yields the following:

node sdkdemo.js 
setting mix layout...
joinChannel...
appliteDir /home/vagrant/vagrant-workspace/Basic-Recording/On-Premise-Recording-Nodejs/record/src/sdk/bin/
pRecording->m_agorasdk->createChannel return result:1
join channel Id: Channel1, with uid: 3845185687
channel joined Channel1 3845185687
leave channel with code:12
Error: 3,with stat_code:16
err 3 16

Similarly, when I run node app.js and hit the server I get this:

setting mix layout...
joinChannel...
appliteDir /home/vagrant/vagrant-workspace/Basic-Recording/On-Premise-Recording-Nodejs/record/src/sdk/bin/
pRecording->m_agorasdk->createChannel return result:1
join channel Id: Channel12, with uid: 1948140253
recorder started a7b122d487f743b2aca4254854c4ee05 Channel12 3bf8b59f-aaa5-44ff-98b4-40d12bd2e057
leave channel with code:12
Error: 3,with stat_code:16
sdk stopped due to err code: 3 stat: 16
stop recorder a7b122d487f743b2aca4254854c4ee05 Channel12 3bf8b59f-aaa5-44ff-98b4-40d12bd2e057
releasing 3bf8b59f-aaa5-44ff-98b4-40d12bd2e057
leaveChannel...

修改 config.channelProfile 不生效

commit f0f77da
adapt to 2.3.3

我们客户端使用的是 通信模式, restful nodejs 使用的是 直播模式, 录制的视频没有内容(满屏绿色), 当我修改了 Basic-Recording/Agora-Restful-Recording-Nodejs/record/src/agora_node_ext/agora_node_recording.cpp 文件中的 config.channelProfile 为直播模式(config.channelProfile = agora::linuxsdk::CHANNEL_PROFILE_COMMUNICATION;) 录制的视频依旧没有内容.

build.sh error

I ran build.sh and got an error.

node js version: v10.16.0
Installed sdk version: 3.0.0

1 ... / agora_node_ext / AgoraSdk.h: 14: 10: fatal error: base / log.h: No such file or directory
 #include "base / log.h"
          ^ ~~~~~~~~~~~

=> The first error is that there is no base / log.h file. I arbitrarily added an empty file log.h.

  1. The second error is shown below.

How can I resolve these two errors?
I would appreciate it if you could answer me.

---------------------error log-------------------------------

gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | x64
gyp info ok
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | x64
gyp info find Python using Python version 3.7.4 found at "/usr/local/bin/python3"
gyp http GET https://nodejs.org/download/release/v10.16.0/node-v10.16.0-headers.tar.gz
gyp http 200 https://nodejs.org/download/release/v10.16.0/node-v10.16.0-headers.tar.gz
gyp http GET https://nodejs.org/download/release/v10.16.0/SHASUMS256.txt
gyp http 200 https://nodejs.org/download/release/v10.16.0/SHASUMS256.txt
gyp info spawn /usr/local/bin/python3
gyp info spawn args [ '/usr/local/node-v10.16.0-linux-x64/lib/node_modules/node-gyp/gyp/gyp_main.py',
gyp info spawn args 'binding.gyp',
gyp info spawn args '-f',
gyp info spawn args 'make',
gyp info spawn args '-I',
gyp info spawn args '/home/sls4/dev/On-Premise-Recording-Nodejs/record/src/build/config.gypi',
gyp info spawn args '-I',
gyp info spawn args '/usr/local/node-v10.16.0-linux-x64/lib/node_modules/node-gyp/addon.gypi',
gyp info spawn args '-I',
gyp info spawn args '/root/.cache/node-gyp/10.16.0/include/node/common.gypi',
gyp info spawn args '-Dlibrary=shared_library',
gyp info spawn args '-Dvisibility=default',
gyp info spawn args '-Dnode_root_dir=/root/.cache/node-gyp/10.16.0',
gyp info spawn args '-Dnode_gyp_dir=/usr/local/node-v10.16.0-linux-x64/lib/node_modules/node-gyp',
gyp info spawn args '-Dnode_lib_file=/root/.cache/node-gyp/10.16.0/<(target_arch)/node.lib',
gyp info spawn args '-Dmodule_root_dir=/home/sls4/dev/On-Premise-Recording-Nodejs/record/src',
gyp info spawn args '-Dnode_engine=v8',
gyp info spawn args '--depth=.',
gyp info spawn args '--no-parallel',
gyp info spawn args '--generator-output',
gyp info spawn args 'build',
gyp info spawn args '-Goutput_dir=.' ]
gyp info ok
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | x64
gyp info spawn make
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
make: Entering directory '/home/sls4/dev/On-Premise-Recording-Nodejs/record/src/build'
CXX(target) Release/obj.target/agorasdk/agora_node_ext/AgoraSdk.o
../agora_node_ext/AgoraSdk.cpp: In member function 'void agora::AgoraSdk::onAudioVolumeIndication_node(const agora::linuxsdk::AudioVolumeInfo*, unsigned int)':
../agora_node_ext/AgoraSdk.cpp:383:26: warning: comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare]
for(int i = 0; i < speakerNumber; i++) {
~~^~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp: In member function 'virtual void agora::AgoraSdk::onAudioVolumeIndication(const agora::linuxsdk::AudioVolumeInfo*, unsigned int':
../agora_node_ext/AgoraSdk.cpp:401:26: warning: comparison of integer expressions of different signedness: 'int' and 'unsigned int' [-Wsign-compare]
for(int i = 0; i < speakerNum; i++) {
~~^~~~~~~~~~~~
CXX(target) Release/obj.target/agorasdk/agora_node_ext/agora_node_recording.o
In file included from ../agora_node_ext/agora_node_recording.cpp:3:
../agora_node_ext/agora_node_recording.h:62:52: warning: backslash and newline separated by space
#define napi_get_native_this(args, native) \

../agora_node_ext/agora_node_recording.cpp:13: warning: "NODE_UID_TYPE" redefined
#define NODE_UID_TYPE

In file included from ../agora_node_ext/agora_node_recording.h:6,
from ../agora_node_ext/agora_node_recording.cpp:3:
../agora_node_ext/node_uid.h:20: note: this is the location of the previous definition
#define NODE_UID_TYPE int32

../agora_node_ext/agora_node_recording.cpp: In constructor 'agora::recording::NodeRecordingSdk::NodeRecordingSdk(v8::Isolate*)':
../agora_node_ext/agora_node_recording.cpp:59:39: error: invalid new-expression of abstract class type 'agora::AgoraSdk'
m_agorasdk = new AgoraSdk();
^
In file included from ../agora_node_ext/agora_node_recording.h:7,
from ../agora_node_ext/agora_node_recording.cpp:3:
../agora_node_ext/./AgoraSdk.h:41:7: note: because the following virtual functions are pure within 'agora::AgoraSdk':
class AgoraSdk : virtual public agora::recording::IRecordingEngineEventHandler {
^~~~~~~~
In file included from ../agora_node_ext/./AgoraSdk.h:11,
from ../agora_node_ext/agora_node_recording.h:7,
from ../agora_node_ext/agora_node_recording.cpp:3:
../sdk/include/IAgoraRecordingEngine.h:63:18: note: 'virtual void agora::recording::IRecordingEngineEventHandler::onRemoteVideoStreamStateChanged(uid_t, agora::linuxsdk::RemoteStreamState, agora::linuxsdk::RemoteStreamStateChangedReason)'
virtual void onRemoteVideoStreamStateChanged(uid_t uid, linuxsdk::RemoteStreamState state, linuxsdk::RemoteStreamStateChangedReason reason) = 0;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../sdk/include/IAgoraRecordingEngine.h:71:18: note: 'virtual void agora::recording::IRecordingEngineEventHandler::onRemoteAudioStreamStateChanged(uid_t, agora::linuxsdk::RemoteStreamState, agora::linuxsdk::RemoteStreamStateChangedReason)'
virtual void onRemoteAudioStreamStateChanged(uid_t uid, linuxsdk::RemoteStreamState state, linuxsdk::RemoteStreamStateChangedReason reason) = 0;
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../sdk/include/IAgoraRecordingEngine.h:173:18: note: 'virtual void agora::recording::IRecordingEngineEventHandler::onRejoinChannelSuccess(const char*, uid_t'
virtual void onRejoinChannelSuccess(const char* channelId, uid_t uid) = 0;
^~~~~~~~~~~~~~~~~~~~~~
../sdk/include/IAgoraRecordingEngine.h:180:18: note: 'virtual void agora::recording::IRecordingEngineEventHandler::onConnectionStateChanged(agora::linuxsdk::ConnectionStateType, agora::linuxsdk::ConnectionChangedReasonType)'
virtual void onConnectionStateChanged(agora::linuxsdk::ConnectionStateType state, agora::linuxsdk::ConnectionChangedReasonType reason) = 0;
^~~~~~~~~~~~~~~~~~~~~~~~
../sdk/include/IAgoraRecordingEngine.h:193:18: note: 'virtual void agora::recording::IRecordingEngineEventHandler::onRemoteVideoStats(agora::linuxsdk::uid_t, const agora::linuxsdk::RemoteVideoStats&)'
virtual void onRemoteVideoStats(agora::linuxsdk::uid_t uid, const agora::linuxsdk::RemoteVideoStats& stats) = 0;
^~~~~~~~~~~~~~~~~~
../sdk/include/IAgoraRecordingEngine.h:206:18: note: 'virtual void agora::recording::IRecordingEngineEventHandler::onRemoteAudioStats(agora::linuxsdk::uid_t, const agora::linuxsdk::RemoteAudioStats&)'
virtual void onRemoteAudioStats(agora::linuxsdk::uid_t uid, const agora::linuxsdk::RemoteAudioStats& stats) = 0;
^~~~~~~~~~~~~~~~~~
../sdk/include/IAgoraRecordingEngine.h:212:18: note: 'virtual void agora::recording::IRecordingEngineEventHandler::onRecordingStats(const agora::linuxsdk::RecordingStats&)'
virtual void onRecordingStats(const agora::linuxsdk::RecordingStats& stats) = 0;
^~~~~~~~~~~~~~~~
../sdk/include/IAgoraRecordingEngine.h:222:18: note: 'virtual void agora::recording::IRecordingEngineEventHandler::onLocalUserRegistered(uid_t, const char*)'
virtual void onLocalUserRegistered(uid_t uid, const char* userAccount) = 0;
^~~~~~~~~~~~~~~~~~~~~
../sdk/include/IAgoraRecordingEngine.h:231:18: note: 'virtual void agora::recording::IRecordingEngineEventHandler::onUserInfoUpdated(uid_t, const agora::linuxsdk::UserInfo&)'
virtual void onUserInfoUpdated(uid_t uid, const agora::linuxsdk::UserInfo& info) = 0;
^~~~~~~~~~~~~~~~~
../agora_node_ext/agora_node_recording.cpp: In static member function 'static void agora::recording::NodeRecordingSdk::setMixLayout(const v8::FunctionCallbackInfov8::Value&)':
../agora_node_ext/agora_node_recording.cpp:200:79: warning: 'v8::Localv8::Object v8::Value::ToObject(v8::Isolate*) const' is deprecated: Use maybe version [-Wdeprecated-declarations]
Local layoutData = args[0]->ToObject(args.GetIsolate());
^

In file included from /root/.cache/node-gyp/10.16.0/include/node/v8.h:26,
from /root/.cache/node-gyp/10.16.0/include/node/node.h:63,
from ../agora_node_ext/agora_node_recording.cpp:1:
/root/.cache/node-gyp/10.16.0/include/node/v8.h:2446:31: note: declared here
Local ToObject(Isolate* isolate) const);
^~~~~~~~
/root/.cache/node-gyp/10.16.0/include/node/v8config.h:324:3: note: in definition of macro 'V8_DEPRECATED'
declarator attribute((deprecated(message)))
^~~~~~~~~~
../agora_node_ext/agora_node_recording.cpp: In static member function 'static void agora::recording::NodeRecordingSdk::release(const v8::FunctionCallbackInfov8::Value&)':
../agora_node_ext/agora_node_recording.cpp:335:29: warning: unused variable 'status' [-Wunused-variable]
napi_status status = napi_ok;
^~~~~~
In file included from /root/.cache/node-gyp/10.16.0/include/node/node.h:63,
from ../agora_node_ext/agora_node_recording.cpp:1:
/root/.cache/node-gyp/10.16.0/include/node/v8.h: In instantiation of 'void v8::PersistentBase::SetWeak(P*, typename v8::WeakCallbackInfo

::Callback, v8::WeakCallbackType) [with P = node::ObjectWrap; T = v8::Object; typename v8::WeakCallbackInfo

::Callback = void ()(const v8::WeakCallbackInfonode::ObjectWrap&)]':
/root/.cache/node-gyp/10.16.0/include/node/node_object_wrap.h:84:78: required from here
/root/.cache/node-gyp/10.16.0/include/node/v8.h:9502:16: warning: cast between incompatible function types from 'v8::WeakCallbackInfonode::ObjectWrap::Callback' {aka 'void (
)(const v8::WeakCallbackInfonode::ObjectWrap&)'} to 'Callback' {aka 'void (*)(const v8::WeakCallbackInfo&)'} [-Wcast-function-type]
reinterpret_cast(callback), type);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
make: *** [agorasdk.target.mk:109: Release/obj.target/agorasdk/agora_node_ext/agora_node_recording.o] Error 1
make: Leaving directory '/home/sls4/dev/On-Premise-Recording-Nodejs/record/src/build'
gyp ERR! build error
gyp ERR! stack Error: make failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/node-v10.16.0-linux-x64/lib/node_modules/node-gyp/lib/build.js:194:23)
gyp ERR! stack at ChildProcess.emit (events.js:198:13)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12)
gyp ERR! System Linux 4.15.0-88-generic
gyp ERR! command "/usr/local/node-v10.16.0-linux-x64/bin/node" "/usr/local/node-v10.16.0-linux-x64/bin/node-gyp" "build"
gyp ERR! cwd /home/sls4/dev/On-Premise-Recording-Nodejs/record/src
gyp ERR! node -v v10.16.0
gyp ERR! node-gyp -v v6.1.0
gyp ERR! not ok

build.sh error

gyp info it worked if it ends with ok gyp info using [email protected] gyp info using [email protected] | linux | x64 gyp info ok gyp info it worked if it ends with ok gyp info using [email protected] gyp info using [email protected] | linux | x64 gyp info find Python using Python version 3.8.2 found at "/usr/bin/python3" gyp info spawn /usr/bin/python3 gyp info spawn args [ '/usr/local/lib/node_modules/node-gyp/gyp/gyp_main.py', gyp info spawn args 'binding.gyp', gyp info spawn args '-f', gyp info spawn args 'make', gyp info spawn args '-I', gyp info spawn args '/recording-project/Basic-Recording/On-Premise-Recording-Nodejs/record/src/build/config.gypi', gyp info spawn args '-I', gyp info spawn args '/usr/local/lib/node_modules/node-gyp/addon.gypi', gyp info spawn args '-I', gyp info spawn args '/root/.cache/node-gyp/8.9.0/include/node/common.gypi', gyp info spawn args '-Dlibrary=shared_library', gyp info spawn args '-Dvisibility=default', gyp info spawn args '-Dnode_root_dir=/root/.cache/node-gyp/8.9.0', gyp info spawn args '-Dnode_gyp_dir=/usr/local/lib/node_modules/node-gyp', gyp info spawn args '-Dnode_lib_file=/root/.cache/node-gyp/8.9.0/<(target_arch)/node.lib', gyp info spawn args '-Dmodule_root_dir=/recording-project/Basic-Recording/On-Premise-Recording-Nodejs/record/src', gyp info spawn args '-Dnode_engine=v8', gyp info spawn args '--depth=.', gyp info spawn args '--no-parallel', gyp info spawn args '--generator-output', gyp info spawn args 'build', gyp info spawn args '-Goutput_dir=.' ] gyp info ok gyp info it worked if it ends with ok gyp info using [email protected] gyp info using [email protected] | linux | x64 gyp info spawn make gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ] make: Entering directory '/recording-project/Basic-Recording/On-Premise-Recording-Nodejs/record/src/build' make: *** No rule to make target 'Release/obj.target/agorasdk/agora_node_ext/AgoraSdk.o', needed by 'Release/obj.target/agorasdk.node'. Stop. make: Leaving directory '/recording-project/Basic-Recording/On-Premise-Recording-Nodejs/record/src/build' gyp ERR! build error gyp ERR! stack Error: make failed with exit code: 2 gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/node-gyp/lib/build.js:194:23) gyp ERR! stack at emitTwo (events.js:126:13) gyp ERR! stack at ChildProcess.emit (events.js:214:7) gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:198:12) gyp ERR! System Linux 4.4.0-18362-Microsoft gyp ERR! command "/usr/local/bin/node" "/usr/local/bin/node-gyp" "build" gyp ERR! cwd /recording-project/Basic-Recording/On-Premise-Recording-Nodejs/record/src gyp ERR! node -v v8.9.0 gyp ERR! node-gyp -v v7.0.0 gyp ERR! not ok cp: cannot stat 'build/Release/agorasdk.node': No such file or directory

调用build.sh出现以下错误,node版本14.17.0,node-gyp版本7.1.0

gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | darwin | x64
gyp info ok
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | darwin | x64
gyp info find Python using Python version 3.9.1 found at "/usr/local/opt/[email protected]/bin/python3.9"
gyp info spawn /usr/local/opt/[email protected]/bin/python3.9
gyp info spawn args [
gyp info spawn args '/usr/local/lib/node_modules/node-gyp/gyp/gyp_main.py',
gyp info spawn args 'binding.gyp',
gyp info spawn args '-f',
gyp info spawn args 'make',
gyp info spawn args '-I',
gyp info spawn args '/Users/shealtiel/CodeBase/Personal/Basic-Recording/On-Premise-Recording-Nodejs/record/src/build/config.gypi',
gyp info spawn args '-I',
gyp info spawn args '/usr/local/lib/node_modules/node-gyp/addon.gypi',
gyp info spawn args '-I',
gyp info spawn args '/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/common.gypi',
gyp info spawn args '-Dlibrary=shared_library',
gyp info spawn args '-Dvisibility=default',
gyp info spawn args '-Dnode_root_dir=/Users/shealtiel/Library/Caches/node-gyp/14.17.0',
gyp info spawn args '-Dnode_gyp_dir=/usr/local/lib/node_modules/node-gyp',
gyp info spawn args '-Dnode_lib_file=/Users/shealtiel/Library/Caches/node-gyp/14.17.0/<(target_arch)/node.lib',
gyp info spawn args '-Dmodule_root_dir=/Users/shealtiel/CodeBase/Personal/Basic-Recording/On-Premise-Recording-Nodejs/record/src',
gyp info spawn args '-Dnode_engine=v8',
gyp info spawn args '--depth=.',
gyp info spawn args '--no-parallel',
gyp info spawn args '--generator-output',
gyp info spawn args 'build',
gyp info spawn args '-Goutput_dir=.'
gyp info spawn args ]
gyp info ok
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | darwin | x64
gyp info spawn make
gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
CXX(target) Release/obj.target/agorasdk/agora_node_ext/AgoraSdk.o
In file included from ../agora_node_ext/AgoraSdk.cpp:11:
In file included from ../agora_node_ext/AgoraSdk.h:14:
../sdk/include/base/atomic.h:4:5: error: function-like macro '__GNUC_PREREQ' is not defined
#if __GNUC_PREREQ(4, 6)
^
../sdk/include/base/atomic.h:8:7: error: function-like macro 'GNUC_PREREQ' is not defined
#elif GNUC_PREREQ(4, 4)
^
../sdk/include/base/atomic.h:65:2: error: "version should be at least 4.4"
#error "version should be at least 4.4"
^
In file included from ../agora_node_ext/AgoraSdk.cpp:11:
../agora_node_ext/AgoraSdk.h:160:9: error: unknown type name 'atomic_bool_t'; did you mean 'std::atomic_bool'?
atomic_bool_t m_stopped;
^~~~~~~~~~~~~
std::atomic_bool
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/atomic:2387:36: note: 'std::atomic_bool' declared here
typedef atomic atomic_bool;
^
../agora_node_ext/AgoraSdk.cpp:226:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_2(REC_EVENT_ERROR, int32, error, int32, stat_code);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:47:76: note: expanded from macro 'MAKE_JS_CALL_2'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:239:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_2(REC_EVENT_JOIN_CHANNEL, string, channelName.c_str(), uid, uid);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:47:76: note: expanded from macro 'MAKE_JS_CALL_2'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:246:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_0(REC_EVENT_LEAVE_CHANNEL);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:24:79: note: expanded from macro 'MAKE_JS_CALL_0'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 0, nullptr);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:264:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_1(REC_EVENT_USER_JOIN, uid, uid);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:35:76: note: expanded from macro 'MAKE_JS_CALL_1'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 1, argv);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:277:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_1(REC_EVENT_USER_LEAVE, uid, uid);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:35:76: note: expanded from macro 'MAKE_JS_CALL_1'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 1, argv);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:283:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_1(REC_EVENT_ACTIVE_SPEAKER, uid, uid);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:35:76: note: expanded from macro 'MAKE_JS_CALL_1'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 1, argv);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:406:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_2(REC_EVENT_ERROR, int32, err, int32, stat_code);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:47:76: note: expanded from macro 'MAKE_JS_CALL_2'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:419:18: error: no matching member function for call to 'Set'
obj->Set(napi_create_string
(isolate, "uid"), napi_create_uid
(isolate, speakers[i].uid));
~~~~~^~~
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:3670:37: note: candidate function not viable: requires 3 arguments, but 2 were provided
V8_WARN_UNUSED_RESULT Maybe Set(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:3673:37: note: candidate function not viable: requires 3 arguments, but 2 were provided
V8_WARN_UNUSED_RESULT Maybe Set(Local context, uint32_t index,
^
../agora_node_ext/AgoraSdk.cpp:420:18: error: no matching member function for call to 'Set'
obj->Set(napi_create_string
(isolate, "volume"), napi_create_uint32
(isolate, speakers[i].volume));
~~~~~^~~
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:3670:37: note: candidate function not viable: requires 3 arguments, but 2 were provided
V8_WARN_UNUSED_RESULT Maybe Set(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:3673:37: note: candidate function not viable: requires 3 arguments, but 2 were provided
V8_WARN_UNUSED_RESULT Maybe Set(Local context, uint32_t index,
^
../agora_node_ext/AgoraSdk.cpp:421:26: error: no matching member function for call to 'Set'
arrSpeakers->Set(i, obj);
~~~~~~~~~~~~~^~~
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:3670:37: note: candidate function not viable: requires 3 arguments, but 2 were provided
V8_WARN_UNUSED_RESULT Maybe Set(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:3673:37: note: candidate function not viable: requires 3 arguments, but 2 were provided
V8_WARN_UNUSED_RESULT Maybe Set(Local context, uint32_t index,
^
../agora_node_ext/AgoraSdk.cpp:428:72: error: too few arguments to function call, expected 4, have 3
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:417:26: warning: comparison of integers of different signs: 'int' and 'unsigned int' [-Wsign-compare]
for(int i = 0; i < speakerNumber; i++) {
~ ^ ~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:435:26: warning: comparison of integers of different signs: 'int' and 'unsigned int' [-Wsign-compare]
for(int i = 0; i < speakerNum; i++) {
~ ^ ~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:449:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_4(REC_EVENT_FIRST_VIDEO_FRAME, uid, uid, int32, width, int32, height, int32, elapsed);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:74:76: note: expanded from macro 'MAKE_JS_CALL_4'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 4, argv);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:455:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_2(REC_EVENT_FIRST_AUDIO_FRAME, uid, uid, int32, elapsed);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:47:76: note: expanded from macro 'MAKE_JS_CALL_2'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:461:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_2(REC_EVENT_STREAM_CHANGED, bool, receivingAudio, bool, receivingVideo);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:47:76: note: expanded from macro 'MAKE_JS_CALL_2'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 2, argv);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
../agora_node_ext/AgoraSdk.cpp:467:9: error: too few arguments to function call, expected 4, have 3
MAKE_JS_CALL_0(REC_EVENT_CONN_LOST);
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:24:79: note: expanded from macro 'MAKE_JS_CALL_0'
cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 0, nullptr);
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8.h:4468:3: note: 'Call' declared here
V8_WARN_UNUSED_RESULT MaybeLocal Call(Local context,
^
/Users/shealtiel/Library/Caches/node-gyp/14.17.0/include/node/v8config.h:431:31: note: expanded from macro 'V8_WARN_UNUSED_RESULT'
#define V8_WARN_UNUSED_RESULT attribute((warn_unused_result))
^
fatal error: too many errors emitted, stopping now [-ferror-limit=]
2 warnings and 20 errors generated.
make: *** [Release/obj.target/agorasdk/agora_node_ext/AgoraSdk.o] Error 1
gyp ERR! build error
gyp ERR! stack Error: make failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/node-gyp/lib/build.js:194:23)
gyp ERR! stack at ChildProcess.emit (events.js:376:20)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:277:12)
gyp ERR! System Darwin 20.4.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/bin/node-gyp" "build"
gyp ERR! cwd /Users/shealtiel/CodeBase/Personal/Basic-Recording/On-Premise-Recording-Nodejs/record/src
gyp ERR! node -v v14.17.0
gyp ERR! node-gyp -v v7.1.0
gyp ERR! not ok
cp: build/Release/agorasdk.node: No such file or directory

Error installing on node 12.22.10

We are getting below error when we run sudo sh build.sh
OS: ubuntu 18.04
node version: v12.22.10
npm version: 6.14.16

agorasdk.target.mk:119: recipe for target 'Release/obj.target/agorasdk/agora_node_ext/Agor
aSdk.o' failed
make: *** [Release/obj.target/agorasdk/agora_node_ext/AgoraSdk.o] Error 1
make: Leaving directory '/home/ubuntu/record/src/build'
gyp ERR! build error
gyp ERR! stack Error: make failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/lib/node_modules/node-gyp/lib/build.js:194
:23)
gyp ERR! stack at ChildProcess.emit (events.js:314:20)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:276:1
2)
gyp ERR! System Linux 4.15.0-1021-aws
gyp ERR! command "/usr/bin/node" "/usr/bin/node-gyp" "build"
gyp ERR! cwd /home/ubuntu/record/src
gyp ERR! node -v v12.22.10
gyp ERR! node-gyp -v v8.4.1
gyp ERR! not ok
cp: cannot stat 'build/Release/agorasdk.node': No such file or directory

可以部署在内网吗

声网的sdk 是视频直播和语音可以部署与内网调用吗?需要将视频录制保存在内网中

How to set full layout?

Hi,

I want to recording live broadcasting (only one streamer, all users are viewer - just watch streamer's video).

I try to record but layout not good. Could you help me? How to set full layout

Give me file to change all recording config.

Thanks!

It shows cannot find module './agorasdk'

node app.js
module.js:549
throw err;
^

Error: Cannot find module './agorasdk'
at Function.Module._resolveFilename (module.js:547:15)
at Function.Module._load (module.js:474:25)
at Module.require (module.js:596:17)
at require (internal/module.js:11:18)
at Object. (E:\Teenpatti\Agora\Agora-Restful-Recording-Nodejs\record\AgoraRecordSdk.js:1:77)
at Module._compile (module.js:652:30)
at Object.Module._extensions..js (module.js:663:10)
at Module.load (module.js:565:32)
at tryModuleLoad (module.js:505:12)
at Function.Module._load (module.js:497:3)

Video from record freeze after few minute in https protocol

I use a docker to run this project and user nginx as a web server in project. I make a docker-compose file in dev mode and production mode

This is docker-compose and nginx config for my recorder(run port 4000)

docker-compose file Dev mode run as http protocol

...
other code
...
recorder:  // my node recorder
    container_name: "recorder-project"
    build:
      context: ./recorder
      dockerfile: Dockerfile
    ports:
      - "4000:4000"
    command: >
      sh -c "tail -f /dev/null"
    volumes:
      - ./recorder:/recorder:Z
      - ./record_volume:/usr/src/recorder/output

nginx:
  container_name: nginx-project
    build:
      context: ./nginx
      dockerfile: Dockerfile    // dockerfile in nginx
    volumes:
      - ./media_volume:/uploads
    ports:
      - "80:80"
      - "443:443"
    depends_on:
      - frontend     // my frontend
      - backend     // my backend
      - recorder     // recorder in nodejs

docker-compose file Production Mode run as https protocal

...
other code
...
recorder:  // my node recorder
    container_name: "recorder-project"
    build:
      context: ./recorder
      dockerfile: Dockerfile
    ports:
      - "4000:4000"
    command: >
      sh -c "tail -f /dev/null"
    volumes:
      - ./recorder:/recorder:Z
      - ./record_volume:/usr/src/recorder/output

nginx-ssl:
    image: valian/docker-nginx-auto-ssl
    restart: on-failure
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./ssl_data:/etc/resty-auto-ssl
    environment:
      ALLOWED_DOMAINS: '127.0.0.1'
      SITES: '127.0.0.1=nginx:80'

nginx:
    container_name: nginx-homepro-live
    build:
      context: ./nginx
      dockerfile: Dockerfile
    depends_on:
      - frontend
      - backend
      - recorder

Nginx config (use this config both mode)

... other code ...
upstream recorder {
  server recorder:4000;
  keepalive 9;
}
server {
  client_max_body_size 20M;
  listen 80;

... other code ...

  location /recorder/ {
    proxy_pass http://recorder;
    proxy_redirect off;
    proxy_connect_timeout       6000;
    proxy_send_timeout          6000;
    proxy_read_timeout          6000;
    send_timeout                6000;
  }
}

When I run my project in dev mode (docker-compose file Dev mode).Then start to broadcast streaming and call api to start record. After stop record. The Result of video can watch normally (not freeze). But when I run in Production Mode (docker-compose file Production Mode) and start record broadcast streaming. It will freeze in 10s to 2 minute.For example of result https://drive.google.com/file/d/1jehoPCvoOxgFbkGiIy22_9DyP7V7SIDc/view?usp=sharing (start freeze in 00.06s and freeze again in 00.29s )

How can I solve it? or how to config recorder in production mode as https

ps. I'm weak english

Watermark feature

Are you planning to incorporate the watermark feature to Nodejs application?
If you don't plan to incorporate it, what makes it difficult?

编译无法通过

node版本 v13.2.0
agora的linux录制版本 v2.3.4

../agora_node_ext/AgoraSdk.cpp:  lambda 函数中:
../agora_node_ext/AgoraSdk.cpp:25:79: 错误‘v8::Function::Call(v8::Local<v8::Object>, int, std::nullptr_t)’的调用没有匹配的函数
             cb.callback.Get(isolate)->Call(cb.js_this.Get(isolate), 0, nullptr);\

麻烦能否看看是什么原因,谢谢!

使用nodejs版进行测试,录制不成功,如何进行调试?

现在的问题,我怎么入手调试,能否给点思路?谢谢。

按照说明编译好了文件,运行了server,按照说明文档调用

curl -i -X POST -H "Content-type: application/json" --data '{"appid":"xxxxxx","channel":"xxxx","key":"xxxxx"}' http://xxx.xxx.xxx.xxx:3000/recorder/v1/start 

output目录生成了一个目录,生成了一些文件,但是没有录制成功

文件

-rw-r----- 1 root root     3 12月  2 12:01 agorareport.dat
-rw-r----- 1 root root   475 12月  2 12:01 agorasdk.dat
-rw-r----- 1 root root  5385 12月  2 12:01 agorasdk.log
-rw-r----- 1 root root   106 12月  2 12:01 cfg.json
-rw-r----- 1 root root   101 12月  2 12:01 metadata.txt
-rw-r----- 1 root root 14211 12月  2 12:01 recording_0.log
-rw-r----- 1 root root     0 12月  2 12:01 recording2-done.txt
-rw-r----- 1 root root 36602 12月  2 12:01 recording_sys.log

recording_0.log的内容

INFO    (12: 1: 6:319 |    6)  27900; [rp] {"rtc.video.mute_me":true,"che.video.local.send":false}
INFO    (12: 1: 6:319 |    0)  27900; [rp] {"rtc.audio.mute_me":true,"che.audio.mute_me":true}
INFO    (12: 1: 6:320 |    1)  27900; [rp] {"rtc.video.set_remote_default_video_stream_type":0}
INFO    (12: 1: 6:320 |    0)  27900; API call to SetRemoteDefaultVideoStreamType: 0
INFO    (12: 1: 6:320 |    0)  27900; [rp] {"che.video.local.camera_index":1024}
INFO    (12: 1: 6:320 |    0)  27900; [rp] {"rtc.video.enabled":true}
INFO    (12: 1: 6:320 |    0)  27900; API call to enable video
INFO    (12: 1: 6:320 |    0)  27900; [rp] {"che.video.recording":false}
INFO    (12: 1: 6:320 |    0)  27900; ***CALL BEGIN: appid:'2f****************************28' cname:'868fdac5-c983-4dd6-b4b6-08d891d205b6' info:'' sid:'0FB885D20B404919A18FF16164EDA1A0'
INFO    (12: 1: 6:320 |    0)  27900; addRef of media engine, ref=1
INFO    (12: 1: 6:320 |    0)  27900; [che] create chat engine, ctx:(nil)
INFO    (12: 1: 6:320 |    0)  27900; [MYDEBUG] large group call false
INFO    (12: 1: 6:320 |    0)  27900; ChatEngineParameterHelper::applyMediaEngineMode:
INFO    (12: 1: 6:320 |    0)  27900; applyMediaEngineMode(): Hardware encoding false Hardware decoding false
INFO    (12: 1: 6:320 |    0)  27900; engine git commit version:66399d0 and branch:(detached
INFO    (12: 1: 6:320 |    0)  27900; audio jitterbuffer new smooth
INFO    (12: 1: 6:321 |    1)  27902; Thread with name:external_audio_module_thread started
INFO    (12: 1: 6:321 |    0)  27903; Thread with name:WebRtc_event_timer_thread started
INFO    (12: 1: 6:321 |    0)  27900; StereoPlayoutIsAvailable(), output: available=0
INFO    (12: 1: 6:321 |    0)  27900; StereoRecordingIsAvailable(), output: available=0
INFO    (12: 1: 6:321 |    0)  27904; Thread with name:EngineMonitorThread started
INFO    (12: 1: 6:321 |    0)  27900; setMuteStatus, muted: On
INFO    (12: 1: 6:321 |    0)  27900; setMuteOutput, muted: false
INFO    (12: 1: 6:321 |    0)  27900; Audio Engine Init success
INFO    (12: 1: 6:321 |    0)  27900; Available number of cores:8
INFO    (12: 1: 6:322 |    1)  27900; PipelineManager::SetDest  engine = 0x7f6bbc13fa80
INFO    (12: 1: 6:322 |    0)  27900; CreateVideoSendTrack
INFO    (12: 1: 6:322 |    0)  27900; init: feature prerotation disabled
INFO    (12: 1: 6:322 |    0)  27900; Agora Engine video codec set to standard mode role mode 3
INFO    (12: 1: 6:322 |    0)  27900; Agora Engine video codec index 1
INFO    (12: 1: 6:322 |    0)  27900; Agora Engine video stream type = 0
INFO    (12: 1: 6:322 |    0)  27905; Thread with name:VideoEncodeThread started
INFO    (12: 1: 6:323 |    1)  27900; Device type: 0
INFO    (12: 1: 6:323 |    0)  27900; last unique frame idx: -1 - -1
INFO    (12: 1: 6:323 |    0)  27900; Device type: 0
INFO    (12: 1: 6:323 |    0)  27900; EncoderWrapper::Create hardware_ = 0, hardware_low_ = 0
INFO    (12: 1: 6:323 |    0)  27900; low bit rate limit 1679360
INFO    (12: 1: 6:323 |    0)  27900; dont need to increase unique frame idx
INFO    (12: 1: 6:323 |    0)  27900; the init unique frame idx: -1 - -1
INFO    (12: 1: 6:323 |    0)  27906; Thread with name:VideoProcessThread started
INFO    (12: 1: 6:323 |    0)  27900; setCodec: index=1 width=640 height=360 framerate=15
INFO    (12: 1: 6:323 |    0)  27900; setCodec: Intra Request = 0
INFO    (12: 1: 6:323 |    0)  27900; h264WebInteropEnable: enable 0
INFO    (12: 1: 6:323 |    0)  27900; setCaptureDevice: index=1024
INFO    (12: 1: 6:323 |    0)  27900; setMaxVideoBitrate: max bitrate=0
INFO    (12: 1: 6:323 |    0)  27900; video fec method 1
INFO    (12: 1: 6:323 |    0)  27900; dynamic sending rate control enabled 0.

INFO    (12: 1: 6:323 |    0)  27900; videoEngine created and initialize here
INFO    (12: 1: 6:323 |    0)  27900; CreateVideoSendTrack
INFO    (12: 1: 6:323 |    0)  27900; [MIO] updateCapturer: ((nil)), type:(1)
INFO    (12: 1: 6:323 |    0)  27900; CreateAgoraDefaultCapture: type=0
INFO    (12: 1: 6:323 |    0)  27900; VideoSendTrackImpl::UpdateCapturer capturer=0x7f6bbc15dcd0
INFO    (12: 1: 6:323 |    0)  27900; CreateVideoCapturer: interface=0x7f6bbc15dcd0
INFO    (12: 1: 6:323 |    0)  27900; [MIO] updateLocalRender: ((nil)), type:(1)
INFO    (12: 1: 6:323 |    0)  27900; CreateAgoraDefaultRender
INFO    (12: 1: 6:323 |    0)  27900; VideoSendTrackImpl::UpdateRenderer, renderer=0x7f6bbc1abcb0
INFO    (12: 1: 6:323 |    0)  27900; CreateVideoRenderer: interface=0x7f6bbc1abcb0
INFO    (12: 1: 6:323 |    0)  27900; [MIO] video send track prepared !!
INFO    (12: 1: 6:323 |    0)  27900; [che] applyVideoProfile: 640x480 15 fps 1000 kbps, min 1 kbps orientationMode -1140612480
INFO    (12: 1: 6:323 |    0)  27900; validateVideoParameters: validate video parameters resolution 640x480, fps 15, rate 1000000
INFO    (12: 1: 6:323 |    0)  27900; setMaxVideoBitrate: max bitrate=1000000
INFO    (12: 1: 6:323 |    0)  27900; setCodecRates: set frame rate to 15
INFO    (12: 1: 6:323 |    0)  27900; setCodec: index=1 width=640 height=360 framerate=15
INFO    (12: 1: 6:323 |    0)  27900; setCodec: Intra Request = 0
INFO    (12: 1: 6:323 |    0)  27900; setCodecResolution: set to 640 x 480
INFO    (12: 1: 6:323 |    0)  27900; setCodec: index=1 width=640 height=480 framerate=15
INFO    (12: 1: 6:323 |    0)  27900; setCodec: Intra Request = 0
INFO    (12: 1: 6:333 |   10)  27907; Thread with name:VideoEncodeThread started
INFO    (12: 1: 6:333 |    0)  27900; Device type: 0
INFO    (12: 1: 6:333 |    0)  27900; last unique frame idx: -1 - -1
INFO    (12: 1: 6:333 |    0)  27900; Device type: 0
INFO    (12: 1: 6:333 |    0)  27900; EncoderWrapper::Create hardware_ = 0, hardware_low_ = 0
INFO    (12: 1: 6:333 |    0)  27900; low bit rate limit 33554432
INFO    (12: 1: 6:333 |    0)  27900; set last big unique frame idx: -1
INFO    (12: 1: 6:333 |    0)  27900; set last small unique frame idx: -1
INFO    (12: 1: 6:333 |    0)  27900; the init unique frame idx: -1 - -1
INFO    (12: 1: 6:333 |    0)  27900; SetTargetWidthHeight width:640, height:480
INFO    (12: 1: 6:333 |    0)  27900; Set broadcast min br to -1.
INFO    (12: 1: 6:333 |    0)  27900; [che] chat engine initialized
INFO    (12: 1: 6:334 |    1)  27900; [vocs] vocs initialized
INFO    (12: 1: 6:334 |    0)  27900; CacheManager: save cache to storage elapsed 0
INFO    (12: 1: 6:334 |    0)  27900; [cm] emit join channel signal, size=2
INFO    (12: 1: 6:334 |    0)  27900; [cm] connection state changed from 1 to 2
INFO    (12: 1: 6:334 |    0)  27900; CacheManager: save cache to storage elapsed 0
INFO    (12: 1: 6:334 |    0)  27900; [vocs] lookup channel...
INFO    (12: 1: 6:334 |    0)  27900; [vocs] selected: 52.52.84.170:8000
INFO    (12: 1: 6:334 |    0)  27900; connecting to 52.52.84.170:8000 handle bc1dacb0, 31
INFO    (12: 1: 6:334 |    0)  27900; [vocs] report bitrate: a/v/t: 50/1000/1050
INFO    (12: 1: 6:334 |    0)  27900; [vocs] creating channel with 52.52.84.170:8000, ts 1575259266334.......
INFO    (12: 1: 6:334 |    0)  27900; [vocs] selected: 47.244.4.122:1080
INFO    (12: 1: 6:334 |    0)  27900; [vocs] report bitrate: a/v/t: 50/1000/1050
INFO    (12: 1: 6:334 |    0)  27900; [vocs] creating channel with 47.244.4.122:1080, ts 1575259266334.......
INFO    (12: 1: 6:334 |    0)  27900; [vocs] selected: 47.74.211.17:25000
INFO    (12: 1: 6:334 |    0)  27900; [vocs] report bitrate: a/v/t: 50/1000/1050
INFO    (12: 1: 6:334 |    0)  27900; [vocs] creating channel with 47.74.211.17:25000, ts 1575259266334.......
INFO    (12: 1: 6:334 |    0)  27900; [ap] selected: 47.74.211.17:8000
INFO    (12: 1: 6:334 |    0)  27900; connecting to 47.74.211.17:8000 handle bc1dda00, 32
INFO    (12: 1: 6:334 |    0)  27900; [ap] creating channel with 47.74.211.17:8000, ts 266344679, flag: 2
INFO    (12: 1: 6:335 |    1)  27900; [ap] selected: 106.14.12.130:1080
INFO    (12: 1: 6:335 |    0)  27900; [ap] creating channel with 106.14.12.130:1080, ts 266344679, flag: 2
INFO    (12: 1: 6:335 |    0)  27900; [ap] selected: 52.58.56.244:25000
INFO    (12: 1: 6:335 |    0)  27900; [ap] creating channel with 52.58.56.244:25000, ts 266344679, flag: 2
INFO    (12: 1: 6:335 |    0)  27900; [rp] {"che.audio.audioSampleRate":48000}
INFO    (12: 1: 6:335 |    0)  27900; [dns] parsed ip 106.14.12.130
INFO    (12: 1: 6:335 |    0)  27900; [dns] parsed ip 118.190.148.38
INFO    (12: 1: 6:335 |    0)  27900; [dns] parsed ip 47.96.234.219
INFO    (12: 1: 6:335 |    0)  27900; [dns] parsed ip 39.96.163.113
INFO    (12: 1: 6:335 |    0)  27900; [dns] parsed ip 47.106.183.233
INFO    (12: 1: 6:335 |    0)  27900; [dns] parsed ip 47.100.214.39
INFO    (12: 1: 6:335 |    0)  27900; [rs] dns parse result code: 0, servers size: 3
INFO    (12: 1: 6:335 |    0)  27900; [rs] updateServers 39.96.163.113:8000, priority 2
INFO    (12: 1: 6:335 |    0)  27900; [rs] updateServers 47.106.183.233:8000, priority 2
INFO    (12: 1: 6:335 |    0)  27900; [rs] updateServers 47.100.214.39:8000, priority 2
INFO    (12: 1: 6:335 |    0)  27900; [dns] parsed ip 118.190.148.38
INFO    (12: 1: 6:335 |    0)  27900; [dns] parsed ip 47.96.234.219
INFO    (12: 1: 6:335 |    0)  27900; [dns] parsed ip 106.14.12.130
INFO    (12: 1: 6:335 |    0)  27900; [ap] onParsedDns with err 0, 118.190.148.38, 47.96.234.219, 106.14.12.130,
INFO    (12: 1: 6:336 |    1)  27900; [dns] parsed ip 118.190.148.38
INFO    (12: 1: 6:336 |    0)  27900; [dns] parsed ip 47.96.234.219
INFO    (12: 1: 6:336 |    0)  27900; [dns] parsed ip 106.14.12.130
INFO    (12: 1: 6:357 |   21)  27900; [ap/u] **responsed from 106.14.12.130:1080, CDS(8).
INFO    (12: 1: 6:357 |    0)  27900; [ap] onAPCdsRes success with config: �Ɛ���ڤ����ϟᒖ���ܭ��⃅��
INFO    (12: 1: 6:357 |    0)  27900; [cs] applied directly: {"configs":{},"version":"27"}, elapsed: 0
INFO    (12: 1: 6:357 |    0)  27900; CacheManager: save cache to storage elapsed 0
INFO    (12: 1: 6:357 |    0)  27900; [ap/u] **responsed from 106.14.12.130:1080, TDS(64).
INFO    (12: 1: 6:357 |    0)  27900; [ap] onAPTdsRes success with config: {}, size: 0
ERROR   (12: 1: 6:384 |   27)  27900; [vocs/u] responsed from 47.244.4.122:1080 with error: 9, elapsed: 75, server ts: 1575259268805. connection aborted
INFO    (12: 1: 6:385 |    1)  27901; Error in mediasdk: 110, (null)
INFO    (12: 1: 6:385 |    0)  27891; event_loop Required to stop :0
WARN    (12: 1: 6:385 |    0)  27891; Before cleanup cnt 0, errno 11 4, joined_ 0, term_sig 0, leave path code 16
INFO    (12: 1: 6:385 |    0)  27891; Leaving channel and ready to cleanup
INFO    (12: 1: 6:385 |    0)  27891; API call to leave channel
INFO    (12: 1: 6:385 |    0)  27900; Recording LeaveEvent Argus report.......
INFO    (12: 1: 6:385 |    0)  27900; [rp] {"rtc.audio.mute_peers":true}
INFO    (12: 1: 6:385 |    0)  27900; [rp] {"rtc.video.mute_peers":true}
WARN    (12: 1: 6:386 |    1)  27900; leaving channel that was not joined yet
INFO    (12: 1: 6:386 |    0)  27900; [cm] emit leave channel signal
INFO    (12: 1: 6:386 |    0)  27900; stopLocalRender
INFO    (12: 1: 6:386 |    0)  27900; stopLocalRender success
WARN    (12: 1: 6:386 |    0)  27900; stopCapture: VideoEngine haven't startCapture
INFO    (12: 1: 6:386 |    0)  27900; stopRemoteRender
INFO    (12: 1: 6:386 |    0)  27900; [che] stopCall begins
INFO    (12: 1: 6:386 |    0)  27900; [che] stop call returns -1, elapsed 0
INFO    (12: 1: 6:386 |    0)  27900; [rs] **report stats: seq: 12, report list size 12, tx/rx: 2109/0, cache size: 0
INFO    (12: 1: 6:386 |    0)  27900; [cm] connection state changed from 2 to 1
INFO    (12: 1: 6:386 |    0)  27900; **CALL STATS: duration 0s, tx 2.769K bytes, rx 420 bytes, total 3.165K bytes
INFO    (12: 1: 6:386 |    0)  27900; CacheManager: save cache to storage elapsed 1
INFO    (12: 1: 6:386 |    0)  27900; delRef of media engine, ref=0
INFO    (12: 1: 6:386 |    0)  27900; [che] chat engine destroying
INFO    (12: 1: 6:386 |    0)  27900; stopLocalRender
INFO    (12: 1: 6:386 |    0)  27900; stopLocalRender success
WARN    (12: 1: 6:386 |    0)  27900; stopCapture: VideoEngine haven't startCapture
INFO    (12: 1: 6:386 |    0)  27900; stopRemoteRender
INFO    (12: 1: 6:386 |    0)  27900; [che] stopCall begins
INFO    (12: 1: 6:386 |    0)  27900; [che] stop call returns -1, elapsed 0
INFO    (12: 1: 6:386 |    0)  27900; stopLocalRender
INFO    (12: 1: 6:386 |    0)  27900; stopLocalRender success
INFO    (12: 1: 6:386 |    0)  27900; stopRemoteRender
WARN    (12: 1: 6:386 |    0)  27900; stopCapture: VideoEngine haven't startCapture
INFO    (12: 1: 6:397 |   11)  27900; PipelineManager::SetDest  engine = (nil)
WARN    (12: 1: 6:397 |    0)  27900; terminate: VideoEngine haven't init
INFO    (12: 1: 6:398 |    1)  27900; [DEBUGG] ViERenderManager Destructor, engine_id: 0
INFO    (12: 1: 6:408 |   10)  27900; AgoraCameraCapture::Dispose
INFO    (12: 1: 6:408 |    0)  27900; VideoSendTrackImpl::UpdateCapturer capturer=(nil)
INFO    (12: 1: 6:408 |    0)  27900; CreateVideoCapturer: interface=(nil)
INFO    (12: 1: 6:408 |    0)  27900; VideoSendTrackImpl::UpdateRenderer, renderer=(nil)
INFO    (12: 1: 6:408 |    0)  27900; CreateVideoRenderer: interface=(nil)
INFO    (12: 1: 6:438 |   30)  27900; [che] chat engine destroyed
INFO    (12: 1: 6:438 |    0)  27900; ***CALL END
INFO    (12: 1: 6:438 |    0)  27900; [cc] setLocalMuteAudioState: false, priority: 4
INFO    (12: 1: 6:438 |    0)  27900; [cc] setLocalMuteVideoState: false, priority: 4
INFO    (12: 1: 6:438 |    0)  27900; onAudioStatusChanged enable audio
INFO    (12: 1: 6:439 |    1)  27900; [MIO] media io controller destroyed
INFO    (12: 1: 6:439 |    0)  27900; [rlbs/u] responsed from 52.80.192.229:9700 with servers 112.13.110.214:8913
INFO    (12: 1: 6:439 |    0)  27891; async task worker thread exited gracefully
INFO    (12: 1: 6:439 |    0)  27900; [rs] updateServers 112.13.110.214:8913, priority 3
INFO    (12: 1: 6:439 |    0)  27900; [rs] updateServers 112.25.33.229:8913, priority 3
INFO    (12: 1: 6:439 |    0)  27900; [rs] updateServers 111.62.9.201:8913, priority 3

is there go sdk can use?

i want to use golang to use the api : audioFrameReceived() to get the realtime frame, is there any method?

Getting gyp ERR! build error while running command sudo sh build.sh

Getting gyp ERR! build error while running command sudo sh build.sh
Logs:
gyp ERR! stack Error: make failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/usr/local/lib/node_modules/node-gyp/lib/build.js:196:23)
gyp ERR! stack at ChildProcess.emit (events.js:198:13)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12)
gyp ERR! System Darwin 18.0.0
gyp ERR! command "/usr/local/bin/node" "/usr/local/bin/node-gyp" "build"
gyp ERR! cwd /Users/dhruvkaushal/PASCOLAN AE/assets/Basic-Recording-master/On-Premise-Recording-Nodejs/record/src
gyp ERR! node -v v10.16.0
gyp ERR! node-gyp -v v5.0.3
gyp ERR! not ok

Vertical Recording

Hello, I'm recording vertically as this video will be used in an app.

I'm doing like this:

recorder_local --appId APPID --channel CHANNEL --uid USER --channelProfile 1 --triggerMode 0 --idle 5 --isMixingEnabled 1 --layoutMode 0 --mixedVideoAudio 2 --mixResolution 405,720,10,1000 --appliteDir AGORA_BIN --channelKey TOKEN --recordFileRootDir RECORD_DIR --maxResolutionUid MAIN_USER --defaultVideoBg VIDEO_BG --defaultUserBg USER_BG

the problem is layout is not really good as I want the 2 video streams to split vertically the space.
I also tried with vertical layout or best-fit layout, but it split horizontally creating an awful effect.

Is there a way I can make it split vertically?
As you can see I'm using command line as I can't integrate c++ or java in my server. I'm using compiled c++ code.

Many thanks

Vertical-layout -- layoutConfig

How can i get the laoutConfig of the vertical-layout recording in composite mode.

I want layout to change from vertical-layout to a custom layout whenever someone shares the screen to something like this.

@@@@[##]
@@@@ $ $
@@@@ $ $

Screenshare-window = @..
maxResolutionUid = [##]
Other users = $

Not able to set layout mode

I am not able to set layout mode to best fit layout i.e. 1,
let layout = {
"canvasWidth": 1920,
"canvasHeight": 1080,
"layoutMode": 1,
"backgroundColor": "#ffffff",
"isMixingEnabled": 1,
"mixedVideoAudio": 2,
"regionCount": 2,
"regions": []
}

and these are my region settings

let region = {
"x": 0,
"y": 0,
"width": 1920,
"height": 1080,
"zOrder": 1,
"alpha": 1,
"uid": uid
}

can you please help me with this.
this is a video call between two, so, i want it to be recorded half area for first user and other half for other.
Screenshot from 2021-01-22 18-28-09

Convert video tools

As Agora document:

"Using the Transcoding Script

Once recording is finished, use video_convert.py and ffmpeg to merge the recorded files (decompress the transcoding tool with the command line tar -xvf)"

How to auto convert to mp4 when finish live stream? Now I must do via command line (SSH and run command), but I think customer cant do it. So any suggestion in this case?

安装好nodejs后,127.0.0.1:3000/recorder/v1/start执行服务报错

nodejs安装顺利,都没什么问题。

请求日志:
[root@iZbp1d7lhouczzmadqkxeyZ ~]# curl -i -X POST -H "Content-type: application/json" --data '{"appid":"8bbac01e1a0c4cf296da026e00c47fc2","channel":"6f7ds8fd67s8"}' 127.0.0.1:3000/recorder/v1/start
HTTP/1.1 500 Internal Server Error
X-Powered-By: Express
Content-Type: application/json; charset=utf-8
Content-Length: 39
ETag: W/"27-AVZqv8UOgmCjnJ8GRaCVqINlECs"
Date: Mon, 27 May 2019 01:42:43 GMT
Connection: keep-alive
{"success":false,"err":"generic error"}

nodejs日志,我们自己加了一些入参打印:
/root/.pm2/logs/agora-out.log last 15 lines:
0|agora | /recorder/v1/start 入参: {"appid":"8bbac01e1a0c4cf296da026e00c47fc2","channel":"6f7ds8fd67s8"}
0|agora | setting mix layout...
0|agora | joinChannel...
0|agora | appliteDir /home/hsyun/agoraIO/record/src/sdk/bin/
0|agora | pRecording->m_agorasdk->createChannel return result:1

/root/.pm2/logs/agora-error.log last 15 lines:
0|agora | Error: appid is mandatory
0|agora | at app.post (/home/hsyun/agoraIO/server/app.js:18:15)
0|agora | at Layer.handle [as handle_request] (/home/hsyun/agoraIO/server/node_modules/express/lib/router/layer.js:95:5)
0|agora | at next (/home/hsyun/agoraIO/server/node_modules/express/lib/router/route.js:137:13)
0|agora | at Route.dispatch (/home/hsyun/agoraIO/server/node_modules/express/lib/router/route.js:112:3)
0|agora | at Layer.handle [as handle_request] (/home/hsyun/agoraIO/server/node_modules/express/lib/router/layer.js:95:5)
0|agora | at /home/hsyun/agoraIO/server/node_modules/express/lib/router/index.js:281:22
0|agora | at Function.process_params (/home/hsyun/agoraIO/server/node_modules/express/lib/router/index.js:335:12)
0|agora | at next (/home/hsyun/agoraIO/server/node_modules/express/lib/router/index.js:275:10)
0|agora | at jsonParser (/home/hsyun/agoraIO/server/node_modules/body-parser/lib/types/json.js:119:7)
0|agora | at Layer.handle [as handle_request] (/home/hsyun/agoraIO/server/node_modules/express/lib/router/layer.js:95:5)
0|agora | Error: 13,with stat_code:3
0|agora | undefined
0|agora | Error: 13,with stat_code:3
0|agora | undefined

appId货真价实

build.sh error

gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | x64
gyp info ok
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | x64
gyp info find Python using Python version 3.6.9 found at "/usr/bin/python3"
gyp info spawn /usr/bin/python3
gyp info spawn args [ '/home/ubuntu/.nvm/versions/node/v10.23.1/lib/node_modules/node-gyp/gyp/gyp_main.py',
gyp info spawn args 'binding.gyp',
gyp info spawn args '-f',
gyp info spawn args 'make',
gyp info spawn args '-I',
gyp info spawn args '/var/www/niya-server/modules/recording/record/src/build/config.gypi',
gyp info spawn args '-I',
gyp info spawn args '/home/ubuntu/.nvm/versions/node/v10.23.1/lib/node_modules/node-gyp/addon.gypi',
gyp info spawn args '-I',
gyp info spawn args '/home/ubuntu/.cache/node-gyp/10.23.1/include/node/common.gypi',
gyp info spawn args '-Dlibrary=shared_library',
gyp info spawn args '-Dvisibility=default',
gyp info spawn args '-Dnode_root_dir=/home/ubuntu/.cache/node-gyp/10.23.1',
gyp info spawn args '-Dnode_gyp_dir=/home/ubuntu/.nvm/versions/node/v10.23.1/lib/node_modules/node-gyp',
gyp info spawn args '-Dnode_lib_file=/home/ubuntu/.cache/node-gyp/10.23.1/<(target_arch)/node.lib',
gyp info spawn args '-Dmodule_root_dir=/var/www/niya-server/modules/recording/record/src',
gyp info spawn args '-Dnode_engine=v8',
gyp info spawn args '--depth=.',
gyp info spawn args '--no-parallel',
gyp info spawn args '--generator-output',
gyp info spawn args 'build',
gyp info spawn args '-Goutput_dir=.' ]
gyp info ok
gyp info it worked if it ends with ok
gyp info using [email protected]
gyp info using [email protected] | linux | x64
gyp info spawn make
gyp info spawn args [ 'BUILDTYPE=Debug', '-C', 'build' ]
make: Entering directory '/var/www/niya-server/modules/recording/record/src/build'
CXX(target) Debug/obj.target/agorasdk/agora_node_ext/AgoraSdk.o
make: g++: Command not found
agorasdk.target.mk:111: recipe for target 'Debug/obj.target/agorasdk/agora_node_ext/AgoraSdk.o' failed
make: *** [Debug/obj.target/agorasdk/agora_node_ext/AgoraSdk.o] Error 127
make: Leaving directory '/var/www/niya-server/modules/recording/record/src/build'
gyp ERR! build error
gyp ERR! stack Error: make failed with exit code: 2
gyp ERR! stack at ChildProcess.onExit (/home/ubuntu/.nvm/versions/node/v10.23.1/lib/node_modules/node-gyp/lib/build.js:194:23)
gyp ERR! stack at ChildProcess.emit (events.js:198:13)
gyp ERR! stack at Process.ChildProcess._handle.onexit (internal/child_process.js:248:12)
gyp ERR! System Linux 5.4.0-1029-aws
gyp ERR! command "/home/ubuntu/.nvm/versions/node/v10.23.1/bin/node" "/home/ubuntu/.nvm/versions/node/v10.23.1/bin/node-gyp" "build"
gyp ERR! cwd /var/www/niya-server/modules/recording/record/src
gyp ERR! node -v v10.23.1
gyp ERR! node-gyp -v v7.1.2
gyp ERR! not ok
cp: cannot stat 'build/Debug/agorasdk.node': No such file or directory

./build.sh 报错

CXX(target) Release/obj.target/agorasdk/agora_node_ext/AgoraSdk.o
In file included from ../agora_node_ext/AgoraSdk.cpp:10:
../sdk/include/IAgoraRecordingEngine.h:297:24: warning: field 'channelProfile' will be initialized after field 'isAudioOnly' [-Wreorder]
RecordingConfig(): channelProfile(agora::linuxsdk::CHANNEL_PROFILE_COMMUNICATION),
^
../sdk/include/IAgoraRecordingEngine.h:304:9: warning: field 'idleLimitSec' will be initialized after field 'appliteDir' [-Wreorder]
idleLimitSec(300),
^
../sdk/include/IAgoraRecordingEngine.h:310:9: warning: field 'captureInterval' will be initialized after field 'decodeAudio' [-Wreorder]
captureInterval(5),
^
../sdk/include/IAgoraRecordingEngine.h:311:9: warning: field 'decodeAudio' will be initialized after field 'decodeVideo' [-Wreorder]
decodeAudio(agora::linuxsdk::AUDIO_FORMAT_DEFAULT_TYPE),
^
../sdk/include/IAgoraRecordingEngine.h:312:9: warning: field 'decodeVideo' will be initialized after field 'mixedVideoAudio' [-Wreorder]
decodeVideo(agora::linuxsdk::VIDEO_FORMAT_DEFAULT_TYPE),
^
In file included from ../agora_node_ext/AgoraSdk.cpp:11:
In file included from ../agora_node_ext/AgoraSdk.h:13:
../sdk/include/base/atomic.h:4:5: error: function-like macro '__GNUC_PREREQ' is not defined
#if __GNUC_PREREQ(4, 6)
^
../sdk/include/base/atomic.h:8:7: error: function-like macro '__GNUC_PREREQ' is not defined
#elif __GNUC_PREREQ(4, 4)
^
../sdk/include/base/atomic.h:65:2: error: "version should be at least 4.4"
#error "version should be at least 4.4"
^
In file included from ../agora_node_ext/AgoraSdk.cpp:11:
../agora_node_ext/AgoraSdk.h:138:9: error: unknown type name 'atomic_bool_t'; did you mean 'std::atomic_bool'?
atomic_bool_t m_stopped;
^~~~~~~~~~~~~
std::atomic_bool
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/atomic:1833:36: note: 'std::atomic_bool' declared here
typedef atomic atomic_bool;
^
In file included from ../agora_node_ext/AgoraSdk.cpp:12:
In file included from ../agora_node_ext/node_async_queue.h:24:
../agora_node_ext/node_log.h:37:9: warning: 'LOG_WARNING' macro redefined [-Wmacro-redefined]
#define LOG_WARNING(format, ...) log(LOG_LEVEL_WARNING, format, ##VA_ARGS)
^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/sys/syslog.h:82:9: note: previous definition is here
#define LOG_WARNING 4 /* warning conditions /
^
In file included from ../agora_node_ext/AgoraSdk.cpp:12:
In file included from ../agora_node_ext/node_async_queue.h:24:
../agora_node_ext/node_log.h:42:9: warning: 'LOG_INFO' macro redefined [-Wmacro-redefined]
#define LOG_INFO(format, ...) log(LOG_LEVEL_INFO, format, ##VA_ARGS)
^
/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/sys/syslog.h:84:9: note: previous definition is here
#define LOG_INFO 6 /
informational */
^
../agora_node_ext/AgoraSdk.cpp:383:26: warning: comparison of integers of different signs: 'int' and 'unsigned int' [-Wsign-compare]
for(int i = 0; i < speakerNumber; i++) {
~ ^ ~~~~~~~~~~~~~
../agora_node_ext/AgoraSdk.cpp:401:26: warning: comparison of integers of different signs: 'int' and 'unsigned int' [-Wsign-compare]
for(int i = 0; i < speakerNum; i++) {
~ ^ ~~~~~~~~~~
9 warnings and 4 errors generated.
make: *** [Release/obj.target/agorasdk/agora_node_ext/AgoraSdk.o] Error 1

What are supported video mix mode resolutions?

I try to run the recording sample and it runs well. Only I have concern about the video resolution recorded that shows like a portrait video in a phone. So I try to change the video mix resolution to width: 1280 and height:720 to make it more like HD regular video. But when I start the recorder, it exit with error code 2 and stat_code 4.
When I check the log, there're these output which says video mix mode resolution is illegal:

video_recorder[23565]: (23565) /var/lib/jenkins/workspace/agora-release-linux/ServerSDK-Video/src/video_recorder/main.cpp:130: video recording wrapper:8, idle:300 write:5, read:6, live:0,channelid:2001 
video_recorder[23565]: (23565) /var/lib/jenkins/workspace/agora-release-linux/ServerSDK-Video/src/video_recorder/main.cpp:151: [ARS version] 79be5171ac5731ebb060e5e72512335ddb545ace
video_recorder[23565]: (23565) /var/lib/jenkins/workspace/agora-release-linux/ServerSDK-Video/src/video_recorder/main.cpp:153: uid 200 from vendor 77a35cc1724643be8c909f4a48457512 is joining channel 2001
video_recorder[23565]: (23565) /var/lib/jenkins/workspace/agora-release-linux/ServerSDK-Video/src/video_recorder/main.cpp:176: video mix mode resolution is illegal:ret=0x80, setting:(1280,720,15,500), mode:com

Thank you

No recorded video file in output folder

Here is the log from the server
setting mix layout...
0|index | joinChannel...
0|index | appliteDir /Meeting/record/src/sdk/bin/
0|index | pRecording->m_agorasdk->createChannel return result:1

Nothing happen.

When I try to use run sdkdemo.js
pRecording->m_agorasdk->createChannel return result:1
recording stats {"duration":1,"rxBytes":0,"rxKBitRate":0,"rxAudioKBitRate":0,"rxVideoKBitRate":0,"lastmileDelay":0,"userCount":0,"cpuAppUsage":0,"cpuTotalUsage":0}
recording stats {"duration":3,"rxBytes":0,"rxKBitRate":0,"rxAudioKBitRate":0,"rxVideoKBitRate":0,"lastmileDelay":0,"userCount":0,"cpuAppUsage":0,"cpuTotalUsage":1}
recording stats {"duration":5,"rxBytes":0,"rxKBitRate":0,"rxAudioKBitRate":0,"rxVideoKBitRate":0,"lastmileDelay":0,"userCount":0,"cpuAppUsage":0,"cpuTotalUsage":0}
(18715): INFO (23:28:59:414) | RecordingEngineImpl.cpp:1184: [Wrapper] channel id: FCEE2E51F853 packet stats, total: 0, callback_->AudioFrameReceived: pcmPackets: 0, pcmTotalPackets: 0, aacPackets: 0, yuvF2Packets: 0, h264F2Packets: 0, errPackets: 0, otherPackets: 0
recording stats {"duration":7,"rxBytes":0,"rxKBitRate":0,"rxAudioKBitRate":0,"rxVideoKBitRate":0,"lastmileDelay":0,"userCount":0,"cpuAppUsage":0,"cpuTotalUsage":0}
recording stats {"duration":9,"rxBytes":0,"rxKBitRate":0,"rxAudioKBitRate":0,"rxVideoKBitRate":0,"lastmileDelay":0,"userCount":0,"cpuAppUsage":0,"cpuTotalUsage":0}
recording stats {"duration":11,"rxBytes":0,"rxKBitRate":0,"rxAudioKBitRate":0,"rxVideoKBitRate":0,"lastmileDelay":0,"userCount":0,"cpuAppUsage":0,"cpuTotalUsage":0}
recording stats {"duration":13,"rxBytes":0,"rxKBitRate":0,"rxAudioKBitRate":0,"rxVideoKBitRate":0,"lastmileDelay":0,"userCount":0,"cpuAppUsage":0,"cpuTotalUsage":1}
recording stats {"duration":15,"rxBytes":0,"rxKBitRate":0,"rxAudioKBitRate":0,"rxVideoKBitRate":0,"lastmileDelay":0,"userCount":0,"cpuAppUsage":0,"cpuTotalUsage":0}

Upload to 3rd party cloud storage

Can we upload recording directly to a 3rd party cloud storage(cloudinary in this case) instead locally ?
Right now recording is stored in local path and then i upload it to a cloud storage.

Video is blank

Hi, Using this I am able to record/get .aac and and .mp4 file. But when I tried to play the video there is all black screen.
.aac file is working correctly.
when I run python video_convert.py , the converted .mp4 file has green background only.
I am playing video on VLC and QuickTime player on Mac

Get RAW video from an Agora WebRTC livestream using Agora Cloud Recording

I was thinking if it is possible for Agora Cloud Recording to get the RAW video and audio from a web app using Agora Web SDK/ Agora WebRTC SDK. I have read it could be done in Agora On-premise Recording.

The web app uses a preset video encoder 480p_1 from the SDK, returning a 480x640 encoded video to its clients.
I need the video available in either RAW/ Full HD.

Broken link in readme.

"This project presumes you have basic ideas of how Agora Recording SDK works, if not please read here carefully before start."

Help me solve this error

Hi,

Could you help me this error?

Before i can setup but now cant, I tried on 2 Centos server.

Screenshot at May 19 01-07-42

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.