1. 程式人生 > >視訊直播常見問題與解決辦法彙總【系列三—直播推流】

視訊直播常見問題與解決辦法彙總【系列三—直播推流】

直播推流初始化設定

要進行直播推流,您必須開啟直播加速 > 配置直播域名 > 直播推流,詳情參考 快速開始

如何獲取推流地址

直播加速配置成功後,您可以通過以下方式獲取對應的推流地址。

  • 單擊 域名管理。
  • 選擇所需地域。
  • 選擇所需的域名。
  • 選擇所需域名,並單擊右側的 管理。
  • 在 基本資訊 中,獲取對應的推流地址:rtmp://video-center.alivecdn.com/AppName/StreamName?vhost=videolive.aliyuntest.club 。
    image

注意:

  • 直播配置成功後,對應的推流地址獲取是不需要呼叫 API 或者 SDK 生成或者初始化的,使用推流工具推流的時候,填入需要的 AppName 或者 StreamName 進行推流即可。如指定推流地址:rtmp://video-center.alivecdn.com/1/2?vhost=live.aliyun.com。
  • 推流地址中 APPName 是應用名稱,支援自定義,可以更改。
  • 推流地址中 StreamName 是流名稱,支援自定義,可以更改。
  • 推流的 APPName 或 StreamName 不建議設定為中文字元。

為何OBS推流不成功

OBS 推流不成功,對應 視訊直播控制檯 > 流管理,正在推流資訊中不能看到對應流.OBS如何進行推流,詳情參考 OBS 操作指南

排查

  • 排查對應域名是否進行直播配置:視訊直播控制檯 > 域名管理 中能否看到對應的域名。直播加速配置參考 直播加速配置
  • 排查OBS推流配置填寫的是否準確,詳情參考 OBS 推流

OBS推流配置如下: 
FMS URL / URL: rtmp://video-center.alivecdn.com/AppName 
播放路徑/串碼流(如果存在)/ 流祕鑰: StreamName?vhost=live.aliyun.com

  • 排查直播域名是否開啟了A鑑權。
  1. 登入 視訊直播控制檯。
  2. 單擊 域名管理。
  3. 選擇所需的地域。
  4. 選擇所需的域名。
  5. 單擊所選域名右側 管理。
  6. 單擊 鑑權配置。

如果開啟,計得算推流地址(rtmp://video-center.alivecdn.com/AppName/StreamName?vhost=videolive.aliyuntest.club)的鑑權地址進行推流,鑑權地址計算參考 快速開始 第4點鑑權配置。
image
image

直播推流支援哪些協議

視訊直播只支援rtmp協議推流

直播推流如何進行鑑權推流

直播鑑權開啟及鑑權地址計算參考 快速開始 第4點鑑權配置。

鑑權地址計算完成後,使用對應的鑑權地址進行推流:

OBS推流配置類似如下: 
FMS URL / URL: rtmp://video-center.alivecdn.com/AppName 
播放路徑/串碼流(如果存在)/ 流祕鑰: StreamName?vhost=live8.aliyuntest.club&auth_key=1487766738-0-0-a96e76d2ebf9bbd855b0d4a9168ee600;

如何確認推流成功

  1. 登入 視訊直播控制檯。
  2. 單擊 流管理。
  3. 選擇所需的地域。
  4. 選擇所需的域名。
  5. 流狀態選擇 正在推流。
  6. 如果可以檢視到存在對應流,則推流成功。

image

禁止推流的情況該如何實現?

使用者存在業務場景需求某路流臨時禁止推流。例如,對應的鑑權推流地址暴露,客戶惡意推流該地址、業務需求禁止該推流URL進行推流等,就可以使用直播的禁止推流功能滿足該需求。推流及鑑權推流地址概念參考 直播推流地址相關問題。

直播控制檯禁止推流

1.獲取正在推流地址並加入黑名單

直播推流成功後,您可以在 視訊直播控制檯 > 流管理 > 選擇所需的地域和域名 > 選擇正在推流,檢視到正在推流的地址,單擊 加入黑名單 即可。

image

2.獲取歷史推流地址並加入黑名單

直播推流成功後,您可以在 視訊直播控制檯 > 流管理 > 選擇所需的地域和域名 > 選擇歷史推流,檢視到歷史推流地址,單擊 加入黑名單 即可。

image

SDK實現禁止推流

視訊直播的API是基於阿里雲的OpenAPI實現的。因此,SDK的呼叫也是對OpenAPI封裝後呼叫。以Java SDK為例,Java SDK建議使用maven管理專案依賴,在pom.xml中新增如下的依賴項:

<dependencies>
  <dependency>
     <groupId>com.aliyun</groupId>
     <artifactId>aliyun-java-sdk-cdn</artifactId>
     <version>2.3.1</version>
  </dependency>
  <dependency>
        <groupId>com.aliyun</groupId>
       <artifactId>aliyun-java-sdk-core</artifactId>
      <optional>true</optional>
        <version>2.3.8</version>
    </dependency>
</dependencies>

其中,aliyun-java-sdk-core是對阿里雲OpenAPI封裝的核心模組,在使用OpenAPI的產品呼叫Java SDK均需要新增該依賴項,而aliyun-java-sdk-cdn包括了視訊直播介面的Request和Response類;其中禁止推流的Request和Response類為ForbidLiveStreamRequest及ForbidLiveStreamResponse,Java程式碼示例如下:

public static void main(String[] args) throws Exception  {
          IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessId, accessKey);
          DefaultAcsClient client = new DefaultAcsClient(profile);
          ForbidLiveStreamResponse res=ForbidLiveStreamR(client);
          System.out.println(res.getRequestId());
   }
static ForbidLiveStreamResponse ForbidLiveStreamR(DefaultAcsClient client){
       ForbidLiveStreamRequest request =new ForbidLiveStreamRequest();
       request.setDomainName("<DomainName>");
       request.setAppName("<AppName>");
       request.setStreamName("<StreamName>");
       request.setLiveStreamType("publisher");
       ForbidLiveStreamResponse response=null;
       try {
            response = client.getAcsResponse(request);
           }catch (ServerException e) {
                  e.printStackTrace();
              } 
              catch (ClientException e) {
                  e.printStackTrace();
              } 
       return response;
   }

Demo程式碼主要流程如下:

  • 初始化Client物件。SDK需要通過IAcsClient物件完成對OpenAPI的呼叫,而初始化IAcsClient物件時根據IClientProfile物件配置region、AccessKeyId和AccessKeySecret引數。其中,region請一直寫cn-hangzhou,因為這裡指的是OpenAPI的伺服器所在區域。AccessKeyId和AccessKeySecret引數即是賬號許可權驗證,如果是主賬號的AccessKeyId和AccessKeySecret,則可以正常使用。如果是子賬號的AccessKeyId和AccessKeySecret引數,則需要保證該子賬號有視訊直播的許可權。
  • 初始化請求Request類。SDK對每個介面實現了對應的Request類和Response類,對應的禁止推流Request類需要傳入哪些引數,看API介面定義 禁止推流API
  • 發起請求獲取結果。使用Client物件的getAcsResponse方法發起Request物件請求,並根據該方法反饋的反序列化的結果例項化為對應介面的Response類。並且在執行該方法時可以catch ServerException和ClientException異常類,當http status>=300且<500 SDK拋ClientException,表示客戶端錯誤。當http status>=500 SDK拋ServerException,表示伺服器端錯誤。如果沒有丟擲異常則表示介面呼叫成功。

如何檢視推流黑名單

1.直播控制檯檢視推流黑名單

直播推流成功後,您可以在 視訊直播控制檯 > 流管理 > 選擇所需的地域和域名 > 選擇黑名單,檢視到黑名單中的推流地址。

image

2.SDK獲取黑名單地址視訊直播的API是基於阿里雲的OpenAPI實現的,因此SDK的呼叫也是對OpenAPI封裝後呼叫。以Java SDK為例:Java SDK建議使用maven管理專案依賴,在pom.xml中新增如下的依賴項:

<dependencies>
 <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-cdn</artifactId>
    <version>2.3.1</version>
 </dependency>
 <dependency>
       <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
     <optional>true</optional>
       <version>2.3.8</version>
   </dependency>
</dependencies>

其中,aliyun-java-sdk-core是對阿里雲OpenAPI封裝的核心模組,在使用OpenAPI的產品呼叫Java SDK均需要新增該依賴項,而aliyun-java-sdk-cdn包括了視訊直播介面的Request和Response類。其中,查詢推流黑名單列表的Request和Response類為DescribeLiveStreamsBlockListRequest及DescribeLiveStreamsBlockListResponse,Java程式碼示例如下:

public static void main(String[] args) throws Exception  {
         IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessId, accessKey);
         DefaultAcsClient client = new DefaultAcsClient(profile);
         DescribeLiveStreamsBlockListResponse res=DescribeLiveStreamsBlockListR(client);
         System.out.println(res.getStreamUrls());
  }
static DescribeLiveStreamsBlockListResponse DescribeLiveStreamsBlockListR(DefaultAcsClient client){
      DescribeLiveStreamsBlockListRequest request =new DescribeLiveStreamsBlockListRequest();
      request.setDomainName("<DomainName>");
      DescribeLiveStreamsBlockListResponse response=null;
      try {
           response = client.getAcsResponse(request);
          }catch (ServerException e) {
                 e.printStackTrace();
             } 
             catch (ClientException e) {
                 e.printStackTrace();
             } 
      return response;
  }

Demo程式碼主要流程如下:

  • 初始化Client物件。SDK需要通過IAcsClient物件完成對OpenAPI的呼叫,而初始化IAcsClient物件時根據IClientProfile物件配置region、AccessKeyId和AccessKeySecret引數。其中,region請一直寫cn-hangzhou,因為這裡指的是OpenAPI的伺服器所在區域。AccessKeyId和AccessKeySecret引數即是賬號許可權驗證,如果是主賬號的AccessKeyId和AccessKeySecret則可以正常使用,如果是子賬號的AccessKeyId和AccessKeySecret引數則需要保證該子賬號有視訊直播的許可權。
  • 初始化請求Request類。SDK對每個介面實現了對應的Request類和Response類,對應的禁止推流Request類需要傳入哪些引數,看API介面定義 查詢推流黑名單列表API
  • 發起請求獲取結果。使用Client物件的getAcsResponse方法發起Request物件請求,並根據該方法反饋的反序列化的結果例項化為對應介面的Response類。並且在執行該方法時可以catch ServerException和ClientException異常類,當http status>=300且<500 SDK拋ClientException,表示客戶端錯誤。當http status>=500 SDK拋ServerException,表示伺服器端錯誤。如果沒有丟擲異常則表示介面呼叫成功。

如何恢復黑名單直播流推送地址

1.直播控制檯恢復
直播推流成功後,您可以在 視訊直播控制檯 > 流管理 > 選擇所需的地域和域名 > 選擇正在推流 > 選擇黑名單,檢視到黑名單中的推流地址,進行恢復。

image

2.SDK恢復黑名單直播流推送地址

視訊直播的API是基於阿里雲的OpenAPI實現的,因此SDK的呼叫也是對OpenAPI封裝後呼叫。以Java SDK為例。Java SDK建議使用maven管理專案依賴,在pom.xml中新增如下的依賴項:

<dependencies>
 <dependency>
    <groupId>com.aliyun</groupId>
    <artifactId>aliyun-java-sdk-cdn</artifactId>
    <version>2.3.1</version>
 </dependency>
 <dependency>
       <groupId>com.aliyun</groupId>
      <artifactId>aliyun-java-sdk-core</artifactId>
     <optional>true</optional>
       <version>2.3.8</version>
   </dependency>
</dependencies>

其中,aliyun-java-sdk-core是對阿里雲OpenAPI封裝的核心模組,在使用OpenAPI的產品呼叫Java SDK均需要新增該依賴項,而aliyun-java-sdk-cdn包括了視訊直播介面的Request和Response類。其中,恢復直播流推送的Request和Response類為ResumeLiveStreamRequest及ResumeLiveStreamResponse,Java程式碼示例如下:

public static void main(String[] args) throws Exception  {
         IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", accessId, accessKey);
         DefaultAcsClient client = new DefaultAcsClient(profile);
         ResumeLiveStreamResponse res=ResumeLiveStreamR(client);
         System.out.println(res.getRequestId());
  }
static HttpResponse ForbidLiveStream(DefaultAcsClient client){
      ForbidLiveStreamRequest request =new ForbidLiveStreamRequest();
      request.setDomainName("<DomainName>");
      request.setAppName("<AppName>");
      request.setStreamName("<StreamName>");
      request.setLiveStreamType("publisher");
      HttpResponse response=null;
      try {
           response = client.doAction(request);
          }catch (ServerException e) {
                 e.printStackTrace();
             } 
             catch (ClientException e) {
                 e.printStackTrace();
             } 
      return response;
  }

Demo程式碼主要流程如下:

  • 初始化Client物件。SDK需要通過IAcsClient物件完成對OpenAPI的呼叫,而初始化IAcsClient物件時根據IClientProfile物件配置region、AccessKeyId和AccessKeySecret引數。其中region請一直寫cn-hangzhou,因為這裡指的是OpenAPI的伺服器所在區域。AccessKeyId和AccessKeySecret引數即是賬號許可權驗證。如果是主賬號的AccessKeyId和AccessKeySecret,則可以正常使用。如果是子賬號的AccessKeyId和AccessKeySecret引數,則需要保證該子賬號有視訊直播的許可權。
  • 初始化請求Request類。SDK對每個介面實現了對應的Request類和Response類,對應的禁止推流Request類需要傳入哪些引數,看API介面定義 恢復直播流推送API
  • 發起請求獲取結果。使用Client物件的getAcsResponse方法發起Request物件請求,並根據該方法反饋的反序列化的結果例項化為對應介面的Response類。並且在執行該方法時可以catch ServerException和ClientException異常類,當http status>=300且<500 SDK拋ClientException,表示客戶端錯誤。當http status>=500 SDK拋ServerException,表示伺服器端錯誤。如果沒有丟擲異常則表示介面呼叫成功。

原文作者:樰籬

原文連結:https://yq.aliyun.com/articles/556695?spm=a2c41.11181499.0.0