觀看直播

模塊列表

room

room

此模塊提供了收聽直播的相關功能

函數列表

Find 用於查找直播間,通常用於管理員查詢正在直播的直播間其簽名如下:

rpc Find(FindRequest) returns (FindResponse){
    option (google.api.http) = {
        get: "/api/v1/stream/room/find"
    };
}

http 路徑:

/api/v1/stream/room/find

權限要求: root(1) or reviewer_post(121)

Close

Close 用於強制關閉一個直播間,這通常是管理員在發現非法直播時用於強制關閉直播以停止非法內容,其簽名如下:

rpc Close(CloseRequest) returns (CloseResponse){
    option (google.api.http) = {
        delete: "/api/v1/stream/room"
    };
}

http 路徑:

/api/v1/stream/room

權限要求: root(1) or reviewer_post(121)

Listen

listen 接口用於收聽直播間的直播數據其簽名如下:

rpc Listen (stream ListenRequest) returns (stream ListenResponse);

websocket 路徑:

websocket /api/v1/stream/room/listen

權限要求: session

ListenRequest

message Assets{
    // 標註資產 id
    string id = 1; 
    // 標註資產塊
    repeated string block = 2;
}
message ListenRequest{
  // 標註 這是 什麼 數據
    // * -2 向服務器發送一個消息,服務器原樣返回消息
    // * -1 這是可選的心跳包
    // * 50 收聽直播,第一幀數據必須設置 what=50
    // * 60 添加記錄到緩存列表
    // * 61 從緩存記錄中刪除指定數據
    // * 62 清空緩存列表
    // * 63 清空所有緩存
    int32 what = 1;
    // 直播間類型
    // * 1 mp3
    int32 path = 2;
    // 直播間房間號
    string room = 3;
    // what = 50 時有效,表示客戶端不支持緩存系統
    bool nocahce = 10;
    // what = -2 時有效
    string message = 5;

    // what range in [60,62] 時有效,指定了緩存列表
    repeated Assets assets = 6; 
}

ListenResponse

message ListenResponse{
    // 標註 這是 什麼 數據
    // * -1 這是可選的心跳包,客戶端可以自行決定如何處理,通常情況可以直接忽略或重置超時時間
    // * 1 這是直播的數據流
    // * 40 通知設備直播開始或從暫停中恢復,此後將會收到 what=1 的數據流
    // * 41 通知設備直播被暫停,此後將不會再收到新都 what=1 的數據流除非直播被重新恢復,但可能會收到未處理的緩存數據流
    // * 100 響應
    int32 what = 1;
    // what=1時有效,表示數據,
    //
    // 如果客戶端第一幀數據設置 nocahce 爲 true,則此數據爲 mp3 幀
    //
    // 如果客戶端第一幀數據設置 nocahce 爲 true 之外的值,則數據爲 2字節元length+元信息+數據幀
    // length只使用 15bit 最高 bit 給緩存系統使用
    // 元信息是以分號分隔的 Assets.id 和 Assets.block
    // 如果最高 bit 爲 1 則代表 應該從 緩存中獲取音頻數據
    bytes data = 2;
    // what=100時有效,響應碼 表示對 Request 請求的響應,0 表示請求成功
    uint32 code = 3;
    // 當響應 Request 時的額外信息
    string message = 4;
    // 應該延遲多少幀數據再播放,只在響應what=50請求時有效
    uint32 delay = 5;
}

如果使用 websocket 通信,服務器將直接使用 binary 通道傳輸 ListenRequest.data 的二進制數據

Example

這個一個例子,描述了應該如何創收聽 mp3 直播間直播內容

  1. C -> S 發送 what=50 監聽直播內容

    C -> S ListenRequest{
        what:50,
        path:1,
        nocahce: true, // or false, or 不設置作爲 false 處理
        room:"XXX"
    }
    

    等待服務器響應

    S -> C ListenResponse{
        what:100,
        message:"success"
        delay: 38
    }
    
  2. 重複此步驟收聽直播內容 S -> C what=1

    S -> C CreateResponse{
        what:1,
        data:audio binary data,
    }
    

    如果 nocahce 設置爲 true 則, data 爲mp3 幀,否則 data 爲 2字節元length+元信息+數據幀