天天看點

産品百科 |Ali RTC Linux 基本功能介紹(C++)

  1. 下載下傳最新的 SDK,更多資訊,請參見 SDK 下載下傳
  2. 初始化 SDK。
//初始化SDK
AliRTCSdk::Linux::EngineEventHandlerInterface *linuxEventHandler = new AliRTCSdk::Linux::FakeLinuxEventHandler();
AliRTCSdk::Linux::AliRTCEngineInterface *linuxEngine = (AliRTCSdk::Linux::AliRTCEngineInterface*)CreateAliRTCEngineInstance(linuxEventHandler, 42000, 45000, nullptr, nullptr);
// 如果建立失敗,需要銷毀EventHandler執行個體
if (linuxEngine == nullptr) {
    delete linuxEventHandler;
    linuxEventHandler = nullptr;
    return;
}      

注意

    • 建立一個 SDK 執行個體需要占用一個系統端口進行音視訊資料傳輸,建議端口範圍設定為 42000~45000,并保證其他服務不會占用此範圍的端口。
    • log:示例代碼中傳入的第四個參數,表示 log 存放的路徑,設定為 nullptr,會預設放在 /tmp 路徑下。
    • AliRtcCoreService:示例代碼中傳入的第五個參數,表示 AliRtcCoreService 可執行程式存放的絕對路徑,設定為 nullptr,會預設在目前路徑下尋找。
  1. 獲得加入頻道必須的頻道鑒權令牌(Token)。
    • 您可以在控制台生成臨時 Token 校驗加入頻道是否成功,詳情請參見 控制台生成 Token
    • 在安全要求更高的場景下,建議您在服務端生成 Token,詳情請參見 服務端生成 Token
  1. 加入頻道。
AliRTCSdk::Linux::AuthInfo authInfo;
authInfo.appid = "";              //應用ID
authInfo.channel = room.c_str();  //頻道ID
authInfo.userid = "";             //使用者ID
authInfo.username = "";           //使用者名稱
authInfo.nonce = "";              //随機碼     
authInfo.token = "";              //頻道鑒權令牌
authInfo.timestamp = 1591430980;  //頻道過期時間戳
int gslbCount = 1;
authInfo.gslb_count = gslbCount;
const char *gslbArray[gslbCount];
if (gslbCount > 0)
{
  for(int i = 0; i < gslbCount; i++)
  {
    gslbArray[i] = "*****";
  }
  authInfo.gslb = gslbArray;
}
int agentCount = 0;
authInfo.agent_count = agentCount;
const char *agentArray[agentCount];
if (agentCount > 0)
{
  for (int i = 0; i < agentCount; i++)
  {
    agentArray[i] = "";
  }
  authInfo.agent = agentArray;
}
// 初始化入會的設定
AliRTCSdk::Linux::JoinChannelConfig joinConfig;
// 關閉自動錄制
joinConfig.recordingMode = AliRTCSdk::Linux::RecordingManually;
// 關閉自動推流
joinConfig.publishMode = AliRTCSdk::Linux::PublishManually;
// 入會
linuxEngine->JoinChannel(authInfo, joinConfig);      
參數 描述
appid 應用 ID,在控制台應用管理頁面建立和檢視。
channel 頻道 ID。1~64 位,支援大小寫字母、數字、下劃線(_)、短劃線(-)。
userid

使用者 ID。1~64 位,支援大小寫字母、數字、下劃線(_)、短劃線(-)。

說明 同一個使用者 ID 在其他端登入,先入會的端會被後入會的端踢出頻道。

username 使用者名。
nonce 随機碼。需要加上字首 AK-,由字母 [a-zA-Z] 和數字 [0-9] 組成,不包含特殊字元,最大 64 位元組。例如:AK-2b9be4b25c2d38c409c376ffd2372be1。
timestamp 頻道過期時間戳。代表令牌有效時間為目前時間 + 所選擇小時數。
token 頻道鑒權令牌,計算方法:

token = sha256(appId + appKey + channel + userId + nonce + timestamp)

gslb gslb 服務位址,該參數是數組類型,目前請使用:

["https://****"]

,請您通過業務伺服器下發到用戶端 SDK,不建議您将該位址固化在用戶端代碼。
agent agent 服務位址,該參數是數組類型,目前請使用:

["https://****"]

  1. 釋出或取消釋出本地流。
    • 自動釋出模式:加入頻道成功後,即可釋出本地流,無需再次調用 publish 接口。
    • 手動釋出模式:加入頻道成功後,可通過以下接口釋出本地流。

在釋出 Yuv 和 Pcm 資料之前,需要設定推流的音視訊參數。

// 開啟Yuv輸入,使用視訊流(原相機流)進行推送
// 注意:第二個參數useTexture目前隻能設定為false
linuxEngine->SetExternalVideoSource(true, false, AliRTCSdk::Linux::VideoSourceCamera);
// 開啟Pcm輸入
// 第二個參數為pcm的采樣率,請根據實際情況設定
// 第三個參數為pcm的channel數,請根據實際情況設定
linuxEngine->SetExternalAudioSource(true, 16000, 2);      

如果釋出過程中需要變更配置或者停止釋出,需要按如下流程先重新設定配置參數,然後再調用 publish 接口。

說明 Linux SDK 通過原相機流和螢幕流通道傳遞視訊流,Linux SDK 不支援攝像頭采集視訊。

//設定是否推視訊流(原相機流)。true表示允許釋出,false表示不允許。
linuxEngine->ConfigLocalCameraPublish(true);
//設定是否推音頻流。true表示允許釋出,false表示不允許。 
linuxEngine->ConfigLocalAudioPublish(true);
//設定是否推視訊流(原螢幕流)。true表示允許釋出,false表示不允許。
linuxEngine->ConfigLocalScreenPublish(true);
//設定是否推次要視訊流。true表示允許釋出,false表示不允許。
linuxEngine->ConfigLocalSimulcast(true, AliRTCSdk::Linux::VideoSourceCamera);
linuxEngine->publish();
while (true) {
    ...
   // 推Yuv資料
   linuxEngine->PushExternalVideoFrame(&sample, AliRTCSdk::Linux::VideoSourceCamera);
   // 推Pcm資料
   linuxEngine->PushExternalAudioFrameRawData(cache_buf, frame_length, 0);
}      

取消釋出本地流。

// 設定是否推視訊流(原相機流)
linuxEngine->ConfigLocalCameraPublish(false);
// 設定是否推音頻流
linuxEngine->ConfigLocalAudioPublish(false);
// 設定是否推視訊流(原螢幕流)
linuxEngine->ConfigLocalScreenPublish(false);
// 設定是否推次要視訊流
linuxEngine->ConfigLocalSimulcast(false, AliRTCSdk::Linux::VideoSourceCamera);
linuxEngine->publish();      

釋出和取消釋出本地流回調代碼如下所示。

/**
* @brief 推流結果回調
* @param result 傳回0表示成功,傳回其他表示失敗
* @param isPublished true表示推流成功,false表示停止推流
*/
virtual void OnPublishChangedNotify(int result, bool isPublished) = 0;      
  1. 錄制和取消錄制。
    • 自動錄制模式:加入頻道成功後,無需調用以下接口,即可開始錄制。
    • 手動錄制模式:加入頻道成功後,可通過以下接口進行錄制操作。

開始錄制。

linuxEngine->StartRecording();      

取消錄制。

linuxEngine->StopRecording();      

錄制回調示例代碼如下所示。

/**
* @brief 遠端使用者上線回調
* @param uid 遠端使用者ID
*/
virtual void OnRemoteUserOnLineNotify(const char * uid) = 0;
/**
* @brief 遠端使用者下線回調
* @param uid 遠端使用者ID
*/
virtual void OnRemoteUserOffLineNotify(const char * uid) = 0;
/**
* @brief 音頻原始資料的回調
* @param frame 音頻原始資料
*/
virtual void OnAudioFrameReceived(const AliRTCSdk::Linux::AudioFrame * frame) = 0;
/**
* @brief 視訊原始資料的回調
* @param uid 遠端使用者ID
* @param frame 視訊原始資料
*/
virtual void OnVideoFrameReceived(const char * uid, const AliRTCSdk::Linux::VideoFrame * frame) = 0;      
  1. 離開頻道。
linuxEngine->LeaveChannel();      
  1. 銷毀 SDK。
linuxEngine->Release();
linuxEngine = nullptr;      

接口詳情請參見

AliRtcEngine 接口
「視訊雲技術」你最值得關注的音視訊技術公衆号,每周推送來自阿裡雲一線的實踐技術文章,在這裡與音視訊領域一流工程師交流切磋。
産品百科 |Ali RTC Linux 基本功能介紹(C++)

繼續閱讀