通过阅读本文,您可以快速了解如何集成RTS SDK。为方便您接入,同时提供封装了artc-stream的OBS OutPut插件。

SDK及测试Demo下载

集成RTS SDK

  1. 下载SDK
    SDK及测试Demo下载中,下载对应版本的ali_rts_sdk.zip,SDK目录如下所示:Ali RTS SDK目录
    说明 完整的接入示例可参考artc-stream.c。
  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);

集成OBS示例插件artc-stream

集成步骤
  1. 下载OBS源码

    若已有OBS源码,请直接进入下一步。

  2. 下载SDK,导入头文件和库
    1. SDK及测试Demo下载中下载对应版本的SDK,将SDK解压到OBS源码的obs/plugins/obs-outputs目录下。
    2. 将obs-output-example文件夹下的artc-stream.h和artc-stream.c,复制到obs/plugins/obs-outputs目录下,如下图所示:artc-stream目录
  3. 修改编译脚本
    修改obs/plugins/obs-outputs/CMakeLists.txt,如下图所示:修改编译脚本
    关键代码:
    set(obs-artc_HEADERS
      ${CMAKE_CURRENT_SOURCE_DIR}/ali_rts_sdk/include/ali_rts_sdk.h
            artc-stream.h)
    set(obs-artc_SOURCES
            artc-stream.c)
    
    if(WIN32)
            set(obs-artc_LIBS
                ${CMAKE_CURRENT_SOURCE_DIR}/ali_rts_sdk/lib/win64/ali_rts_sdk.lib
          ${CMAKE_CURRENT_SOURCE_DIR}/ali_rts_sdk/lib/win64/RtsSDK.lib)
    else()
            set(obs-artc_LIBS
                      ${CMAKE_CURRENT_SOURCE_DIR}/ali_rts_sdk/lib/mac/ali_rts_sdk.dylib
          ${CMAKE_CURRENT_SOURCE_DIR}/ali_rts_sdk/lib/mac/libRtsSDK.dylib)
    endif()
    
    set(obs-outputs_HEADERS
            "${CMAKE_BINARY_DIR}/plugins/obs-outputs/config/obs-outputs-config.h"
            obs-output-ver.h
            rtmp-helpers.h
            rtmp-stream.h
            net-if.h
            flv-mux.h
            ${obs-artc_HEADERS})
    set(obs-outputs_SOURCES
            obs-outputs.c
            null-output.c
            rtmp-stream.c
            rtmp-windows.c
            flv-output.c
            flv-mux.c
            net-if.c
            ${obs-artc_SOURCES})
    
    if(WIN32)
            set(MODULE_DESCRIPTION "OBS output module")
            if(NOT BUILD_LIVE_ENGINE_SHARED)
                    add_definitions(-DENGINE_STATIC)
            endif()
            configure_file(${CMAKE_SOURCE_DIR}/cmake/winrc/obs-module.rc.in obs-outputs.rc)
            list(APPEND obs-outputs_SOURCES
                    obs-outputs.rc)
    endif()
    
    add_library(obs-outputs MODULE
            ${ftl_SOURCES}
            ${ftl_HEADERS}
            ${obs-outputs_SOURCES}
            ${obs-outputs_HEADERS}
            ${obs-outputs_librtmp_SOURCES}
            ${obs-outputs_librtmp_HEADERS})
    
    target_link_libraries(obs-outputs ${obs-artc_LIBS})
  4. 注册artc_output插件
    修改obs/plugins/obs-outputs/obs-outputs.c文件中的代码注册artc_output_info,如下图所示:注册artc_output插件
    关键代码:
    extern struct obs_output_info artc_output_info;
    
    obs_register_output(&artc_output_info);
  5. 启动artc_output插件
    修改obs/UI/window-basic-main-outputs.cpp文件,配置启动artc_output插件,如下图所示:启动artc_output插件
    关键代码:
    const char *type = obs_service_get_output_type(service);
    if (!type) {
        type = "rtmp_output";
        const char *url = obs_service_get_url(service);
        if (url != NULL &&
            strncmp(url, FTL_PROTOCOL, strlen(FTL_PROTOCOL)) == 0) {
            type = "ftl_output";
        } else if (url != NULL &&
            strncmp(url, ARTC_PROTOCOL, strlen(ARTC_PROTOCOL)) == 0) {
            type = "artc_output";
        } else if (url != NULL && strncmp(url, RTMP_PROTOCOL,
                          strlen(RTMP_PROTOCOL)) != 0) {
            type = "ffmpeg_mpegts_muxer";
        }
    }
  6. 编译运行

    按照obs-studio官方文档进行编译。

    注意 运行之前需要将SDK动态库拷贝obs运行目录下,否则会出现下图错误。错误
    以Debug环境为例说明:
    • Mac端需要将ali_rts_sdk.dylib和libRtsSDK.dylib拷贝到obs/build/rundir/Debug/bin/目录下。
    • Windows端需要将ali_rts_sdk.dll和RtsSDK.dll拷贝到obs/build/rundir/Debug/bin/64bit目录下。
artc_output测试
  1. 打开OBS,在设置页面单击推流,然后服务器编辑框中可填入artc://<推流地址>,完成即可进行RTS超低延时推流。
    注意 服务器输入框中需填写完整的推流地址。
    OBS
  2. 播放器通过填入artc://<拉流地址> 或者 rtmp://<拉流地址>,可以正常播放。