通過閱讀本文,您可以了解OBS插件SDK的集成與實現方法。

前提條件

推流域名已開啟低延時推流功能。具體操作,請參見通過控制臺開啟低延時推流功能

操作步驟

說明 本文中的實現方法僅供參考,您可以根據實際業務需求進行開發,詳細示例請參見ali_rts_sdk/obs-output-example/artc-stream.c
  1. 下載并解壓OBS插件SDK。下載地址,請參見SDK下載
  2. 工程中導入頭文件ali_rts_sdk.h。
    #include "ali_rts_sdk.h"
  3. 創建實例。
    /** 1.事件回調設置 **/
    alirts_event_handler_t event_handler = {0};
    // user_data
    event_handler.user_data = user_data;
    // 日志回調
    event_handler.on_log_data = on_log_data;
    // 錯誤回調
    event_handler.on_error = on_error;
    // 推流開始回調
    event_handler.on_push_start = on_push_start;
    // 推流結束回調
    event_handler.on_push_stop  = on_push_stop;
    // 網絡斷開回調
    event_handler.on_connection_lost = on_connection_lost;
    // 重連狀態回調
    event_handler.on_reconnect_state = on_reconnect_state;
    
    /** 2.創建alirts實例,獲得句柄 **/
    alirts_handler_t* alirts = alirts_create(&event_handler);
  4. 推流。
    /** 1.推流配置設置 **/
    alirts_config_t config = {0};
    // 視頻相關配置 1280x720@25fps
    config.width = 1280;
    config.height = 720;
    config.gop_size = 2;
    config.max_fps = 25;
    // 視頻碼率設置為2.5M
    config.video_bitrate_bps = 2500000;
    // 視頻編碼器配置
    config.video_codec = VIDEO_CODEC_H264;
    config.video_preset = VIDEO_PRESET_FAST;
    config.video_profile = VIDEO_PROFILE_BASELINE;
    
    // 音頻相關配置
    // 音頻僅支持44.1k和48k
    config.sample_rate = SAMPLE_RATE_48000;
    // 音頻僅支持16bit
    config.sample_format = FORMAT_16BIT;
    // 音頻通道設置
    config.channel = 2;
    // 當前音頻碼率設置為64k
    config.audio_bitrate_bps = 64000;
    
    // 重連配置
    //建議開啟自動重連
    config.enable_auto_reconnect = true;
    // 設置重連超時時間為10s
    config.reconnect_timeout = 10;
    
    // 推流地址
    config.url= "artc://xxxx/xx/xxxxx";
    
    /** 2.開始推流 **/
    int ret = alirts_start(alirts, &config);
    if (ret != 0) {
      // 開始推流失敗
    }
    說明 alirts_start調用成功之后,會觸發on_push_start回調。
  5. 發送數據。
    // 以發送視頻數據為例,音頻發送類似
    /** 1.設置視頻幀 **/
    // 視頻數據設置之前必須要清零
    alirts_frame_t video_frame = {0};
    // 當前視頻僅支持MEDIA_TYPE_VIDEO_I420輸入
    video_frame.type = MEDIA_TYPE_VIDEO_I420;
    
    video_frame.width = frame->width;
    video_frame.height = frame->height;
    video_frame.timestamp = frame->timestamp;
    video_frame.data[0] = frame->data[0];
    video_frame.data[1] = frame->data[1];
    video_frame.data[2] = frame->data[2];
    video_frame.linesize[0] = frame->linesize[0];
    video_frame.linesize[1] = frame->linesize[1];
    video_frame.linesize[2] = frame->linesize[2];
    /** 2.發送視頻幀 **/
    int ret = alirts_send_frame(alirts, &video_frame);
    if (ret != 0) {
        // 視頻發送失敗
    }
    說明 建議在on_push_start回調之后,調用alirts_send_frame發送數據。
  6. 結束推流。
    alirts_stop(alirts);
    說明 alirts_stop調用成功之后,會觸發on_push_stop回調。
  7. 釋放實例。
    alirts_destroy(alirts);