上一篇讲了如何安装sdk-c demo环境、构建以及编译,这一篇写一下如何实现master端推流和viewer端拉流。
1、准备master端的ak、sk、session token:
aws密钥来自业务云,根据指定的业务云接口获取,直接使用就可以。我把业务云返回的密钥组,放在shell文件中:
#!/bin/bash
# AWS 临时凭证配置
export AWS_ACCESS_KEY_ID=str1
export AWS_SECRET_ACCESS_KEY=str2
export AWS_SESSION_TOKEN=long_str3
export AWS_DEFAULT_REGION=str4
export AWS_KVS_LOG_LEVEL=1
export DEBUG_LOG_SDP=TRUE
export AWS_ENABLE_FILE_LOGGING=TRUE
echo "✅ Master 环境变量已设置"
2、将上面的shell文件,例如,set_aws_env_master.sh上传到ec2实例上面:
testmanzhang@TestMandeMBP Downloads % scp -i ~/Documents/cert/qa.pem ~/Downloads/set_aws_env_master.sh ec2-user@70.xxx.165.xxx:/home/ec2-user/kvs-webrtc-sdk
set_aws_env_master.sh 100% 962 13.4KB/s 00:00
3、上传成功后修改文件权限:
chmod +x set_aws_env_master.sh
4、执行sh文件:
[ec2-user@ip-10-xx-0-xxx kvs-webrtc-sdk]$ source set_aws_env_master.sh
✅ Master 环境变量已设置
5、验证环境变量是否设置生效:
echo $AWS_ACCESS_KEY_ID
注:通过上面的方式设置密钥组只针对当前终端生效,如果再启动一个终端,需要再次执行sh。
6、后台启动master:
nohup ./samples/kvsWebrtcClientMaster channel_no > "master_output_$(date +%Y%m%d_%H%M%S).log" 2>&1 &
6-1、启动之前要进入build目录,不然会报错:
-bash: ./samples/kvsWebrtcClientMaster: No such file or directory
7、查看master进程id:
7-1、jobs -l 用于查找当前终端通过后台&启动的进程:
[ec2-user@ip-10-xx-0-xxx kvs-webrtc-sdk]$ jobs -l
[1]+ 114886 Exit 127 nohup ./samples/kvsWebrtcClientMaster channel no > "master_output_$(date +%Y%m%d_%H%M%S).log" 2>&1
7-2、ps aux | grep kvsWebrtcClientMaster,这个更直观一些:
[ec2-user@ip-10-xx-0-xxx build]$ ps aux | grep kvsWebrtcClientMaster
ec2-user 115130 0.0 0.1 172180 6676 pts/0 Sl 02:56 0:00 ./samples/kvsWebrtcClientMaster lzgd5496a7907243e22d
ec2-user 115129 0.0 0.0 223224 2092 pts/0 S+ 02:58 0:00 grep --color=auto kvsWebrtcClientMaster
8、从ec2实例中拉取日志:
testmanzhang@TestMandeMBP Downloads % scp -i ~/Documents/cert/qa.pem ec2-user@70.xxx.165.xxx:/home/ec2-user/kvs-webrtc-sdk/build/master_output_20250610_025651.log ./
master_output_20250610_025651.log 100% 85KB 105.8KB/s 00:00
9、通过日志查看master进入了推流状态:
2025-06-10 02:57:22.660 DEBUG lwsWssCallbackRoutine(): Client is writable
2025-06-10 02:57:22.680 VERBOSE lwsWssCallbackRoutine(): WSS callback with reason 9
2025-06-10 02:57:22.680 INFO lwsWssCallbackRoutine(): WSS callback with reason 9
2025-06-10 02:57:27.603 VERBOSE signalingClientGetCurrentState(): Signaling Client Get Current State
2025-06-10 02:57:27.603 VERBOSE signalingClientGetCurrentState(): Current state: 0x0000000000000100
2025-06-10 02:57:32.603 VERBOSE signalingClientGetCurrentState(): Signaling Client Get Current State
2025-06-10 02:57:32.603 VERBOSE signalingClientGetCurrentState(): Current state: 0x0000000000000100
2025-06-10 02:57:32.680 VERBOSE lwsWssCallbackRoutine(): WSS callback with reason 10
10、准备viewer端的ak、sk、session token:
从业务云指定接口获取,也是采用sh的方式存储和执行(参考前面的1-5步)。
11、后台启动viewer:
nohup ./samples/kvsWebrtcClientViewer channel_no > "view1_output_$(date +%Y%m%d_%H%M%S).log" 2>&1 &
12、查看viewer端日志,viewer端收到流了:
2025-06-10 03:24:01.754 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 139985014205056, Size: 160, Flags 3388975000
2025-06-10 03:24:01.774 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 139985014205056, Size: 160, Flags 3388975000
2025-06-10 03:24:01.774 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 139985014205056, Size: 4458, Flags 3388975000
2025-06-10 03:24:01.795 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 139985014205056, Size: 160, Flags 3388975000
2025-06-10 03:24:01.814 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 139985014205056, Size: 263, Flags 3388975000
2025-06-10 03:24:01.815 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 139985014205056, Size: 160, Flags 3388975000
2025-06-10 03:24:01.836 VERBOSE sampleAudioFrameHandler(): Audio Frame received. TrackId: 139985014205056, Size: 160, Flags 3388975000
2025-06-10 03:24:01.854 VERBOSE sampleVideoFrameHandler(): Video Frame received. TrackId: 139985014205056, Size: 314, Flags 3388975000