避坑:启动sdk-c demo master需要注意的事情
这两天在写shell脚本,想通过shell脚本启动master,在调试的时候报错:
2025-06-11 06:37:14.740 INFO main(): [KVS Master] Finished setting handlers
2025-06-11 06:37:14.740 ERROR main(): [KVS Master] Terminated with status code 0x00000009
2025-06-11 06:37:14.740 INFO main(): [KVS Master] Cleaning up....
2025-06-11 06:37:14.740 ERROR main(): [KVS Master] signalingClientGetMetrics() operation returned status code: 0x00000001
2025-06-11 06:37:14.740 VERBOSE freeSignalingClient(): Freeing Signaling Client
2025-06-11 06:37:14.740 PROFILE createRtcCertificate(): [Certificate creation time] Time taken: 0 ms
2025-06-11 06:37:14.740 VERBOSE pregenerateCertTimerCallback(): New certificate has been pre-generated and added to the queue
2025-06-11 06:37:14.740 INFO main(): [KVS Master] Cleanup done
错误code说明:
0x00000009:SERVICE_CALL_NOT_AUTHORIZED
0x00000001:STATUS_INTERNAL_ERROR
说明传入的 ak/sk/token 没有权限去访问指定的 KVS Signaling Channel(频道)。即:
拿到的 token 有效,但不具备访问该频道的权限。
所以刚开始就把查找问题的方向放在了密钥上,修改了设置密钥的方式,由开始的:
export AWS_ACCESS_KEY_ID="$ak"export AWS_SECRET_ACCESS_KEY="$sk"export AWS_SESSION_TOKEN="$token"export AWS_DEFAULT_REGION="cn-xxx-x"export AWS_KVS_LOG_LEVEL=1export DEBUG_LOG_SDP=TRUE
修改为:
AWS_ACCESS_KEY_ID="$ak" AWS_SECRET_ACCESS_KEY="$sk" AWS_SESSION_TOKEN="$token" \
AWS_DEFAULT_REGION="cn-xxx-x" AWS_KVS_LOG_LEVEL=1 DEBUG_LOG_SDP=TRUE \
nohup ./build/samples/kvsWebrtcClientMaster "$CHANNEL" > "$LOG_FILE" 2>&1 &
不行,启动master时依然报错。
后来以为从接口获取到的密钥不对,经过再三确认,密钥确实是通过业务云获取到的拉流端的密钥,密钥没问题。
检查了channel也没有问题。
一时间不知道该如何解决了。
这时想通过手动启动master再试一下,于是手动请求了业务云接口,填写了ak、sk、token,但启动命令是在项目根目录执行:
[ec2-user@ip-10-xx-0-xxx kvs-webrtc-sdk]$ nohup ./build/samples/kvsWebrtcClientMaster 123d5496a790712345678 > "./log/master/output_$(date +%Y%m%d_%H%M%S).log" 2>&1 &
[1] 166884
启动后报错,错误信息同上。
难道跟启动,目录有关?
重新手动获取密钥,之后进入build目录,再次启动:
[ec2-user@ip-10-xx-0-xxx build]$ nohup ./samples/kvsWebrtcClientMaster 123d5496123472412345 > "output_$(date +%Y%m%d_%H%M%S).log" 2>&1 &
[1] 167229
这次启动成功!
【所以结论是】
启动master需要在build目录下。
对于 amazon-kinesis-video-streams-webrtc-sdk-c
项目,某些组件(比如 kvsWebrtcClientMaster
)依赖于在 build/
目录下启动,否则会因为找不到资源或库路径而启动失败,报错 status code 0x00000009
。
【原因分析】
相对路径依赖:
SDK 的可执行文件 kvsWebrtcClientMaster 是通过 CMake 构建生成的,在运行时依赖一些相对路径资源或库文件(如证书、配置文件、库路径、插件等)。
如果从项目根目录运行:
./build/samples/kvsWebrtcClientMaster "$CHANNEL"
虽然执行文件路径正确,但它的当前工作目录是根目录,导致它运行时的相对路径指向了错误的地方(比如 certs/、kvslog/、config/ 这些目录找不到)。
这就会导致报错。