通过阅读本文,您可以了解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);