You need to enable JavaScript to run this app.
导航
RTM 协议拉流
最近更新时间:2025.05.07 11:20:52首次发布时间:2025.05.07 11:20:52
我的收藏
有用
有用
无用
无用

本文为您提供了 Web 拉流 SDK(VePlayer)RTM 拉流的接入方式,该功能适用于需超低延时的场景,如连麦互动、实时竞答等业务,强调端到端响应速度,对网络质量稳定性要求较高。

适用版本

本文档适用于最新版本的 Web 拉流 SDK,版本信息请参考发布历史,历史版本请参考历史文档

自动降级机制

RTM 协议对终端设备和网络环境的要求较高,为了确保在各种情况下都能提供流畅的播放体验,强烈建议在使用 RTM 拉流时配置播放降级机制。在本文的所有示例场景均配置了降级策略。

当遇到以下任一情况,播放器将自动触发降级机制,切换到备用的拉流地址:

  • 浏览器或设备环境不支持 RTM 协议播放;
  • RTM 拉流请求失败或连接建联失败;
  • 播放过程中发生错误(如数据流异常、中断等)。

了解播放器如何判断浏览器是否支持 RTM / FLV 播放,请参考如何检测协议兼容性

协议兼容性要求

RTM 协议播放对终端环境要求较高,部分设备或网络状况下可能无法正常播放。为保障播放体验,VePlayer 支持在 RTM 播放失败后,自动降级到其他协议(如 FLV 或 HLS)。根据终端设备和浏览器环境,降级兼容性要求如下:

客户端环境降级支持协议降级流音频编码要求
PC / AndroidFLV 或 HLSAAC
iOS ≥ 17.1FLV 或 HLS
iOS ≤ 17.0HLS

前提条件

  • 已完成 SDK 集成
  • 如果 RTM 格式的直播流含 B 帧或音频为 AAC 编码,请参考常见问题,删除 B 帧并修改音频编码格式为 Opus。

配置示例

以下是 RTM 拉流的配置示例,包括单地址拉流和多清晰度或多线路拉流两种场景。

  • 单地址拉流:适用于简单直播需求,网络稳定且无需选择清晰度或线路的场景。
  • 多清晰度或多线路拉流:适用于需要根据网络状况或设备性能切换清晰度或线路的场景,确保更流畅的播放体验。

场景一:单地址拉流

在单地址拉流场景中,支持 RTM 播放失败后自动降级根据错误类型区分是否降级自定义降级优先级顺序,下文分别示例各类配置方法。

当 RTM 播放失败时,播放器可自动切换到其他协议。以下示例展示了如何通过不同方式集成该自动降级机制。
VePlayer.createLivePlayer({
    height: 360,
    playlist: [
      {
        // RTM 流为去 B 帧且音频为 Opus 的转码流,降级流为未转码或音频非 Opus 的 HLS 或 FLV 流
        definitions: [
          'https://pull-demo.volcfcdnrd.com1/live/st-4536521_webrtm.sdp',
          'https://pull-demo.volcfcdnrd.com/live/st-4536521.flv',
          'https://pull-demo.volcfcdnrd.com/live/st-4536521.m3u8',
        ],
      },
    ],
    fallback: {
      // 1. RTM 不支持或播放失败时降级到 FLV 地址
      fallbackOrder: ['rtm', 'flv'],
      // 2. RTM 不支持或播放失败时降级到 HLS 地址
      // fallbackOrder: ['rtm', 'hls'],
      // 3. RTM 不支持或播放失败时降级到 FLV 地址,FLV 不支持时降级到 HLS 地址
      // fallbackOrder: ['rtm', 'flv', 'hls'],
    },
}).then(function(veplayer) {
    veplayer.on(VePlayer.live.Events.FALLBACK_ERROR, function(){
        // 所有协议降级完后失败
    });
})
        

场景二:多清晰度或多线路拉流

在多清晰度或多线路拉流场景中,支持配置多条线路与多种清晰度,播放器会自动展示切流菜单,用户可自由选择播放线路与画质。此外,也支持根据错误码设置有条件的降级策略,实现更灵活的播放体验。

在多线路拉流场景中,当 RTM 播放失败时,您可以根据错误码自定义降级策略,从而实现更灵活和稳定的播放体验。
VePlayer.createLivePlayer({
    height: 360,
    playlist: [
      {
        name: 'lineOne',
        text: 'lineOne',
        definitions: [
          {
            url: 'https://pull-demo.volcfcdnrd.com/live/st-4536521.sdp',
            definition: 'uhd',
            text: 'uhd',
          },
          {
            url: 'https://pull-demo.volcfcdnrd.com1/live/st-4536521_hd.sdp',
            definition: 'hd',
            text: 'hd',
          },
          {
            url: 'https://pull-demo.volcfcdnrd.com/live/st-4536521.m3u8',
            definition: 'uhd',
            text: 'uhd',
          },
          {
            url: 'https://pull-demo.volcfcdnrd.com/live/st-4536521_hd.m3u8',
            definition: 'hd',
            text: 'hd',
          },
          {
            url: 'https://pull-demo.volcfcdnrd.com1/live/st-4536521.flv',
            definition: 'uhd',
            text: 'uhd',
          },
          {
            url: 'https://pull-demo.volcfcdnrd.com1/live/st-4536521_hd.flv',
            definition: 'hd',
            text: 'hd',
          },
        ],
      },
      {
        name: 'lineTwo',
        text: 'lineTwo',
        definitions: [
          {
            url: 'https://pull-demo.volcfcdnrd.com/live/st-4536523.sdp',
            definition: 'uhd',
            text: 'uhd',
          },
          {
            url: 'https://pull-demo.volcfcdnrd.com/live/st-4536523.sdp',
            definition: 'hd',
            text: 'hd',
          },
          {
            url: 'https://pull-demo.volcfcdnrd.com/live/st-4536523.m3u8',
            definition: 'uhd',
            text: 'uhd',
          },
          {
            url: 'https://pull-demo.volcfcdnrd.com/live/st-4536523_hd.m3u8',
            definition: 'hd',
            text: 'hd',
          },
          {
            url: 'https://pull-demo.volcfcdnrd.com/live/st-4536523.flv',
            definition: 'uhd',
            text: 'uhd',
          },
          {
            url: 'https://pull-demo.volcfcdnrd.com/live/st-4536523_hd.flv',
            definition: 'hd',
            text: 'hd',
          },
        ],
      },
    ],
    fallback: {
      // 设置降级顺序:RTM 不支持或播放失败时降级到 FLV 地址,FLV 不支持时降级到 HLS 地址
      fallbackOrder: ['rtm', 'flv', 'hls'],
      // 自定义降级策略:以下以“流不在线(错误码 2104)”时不降级为例
      fallbackStrategy: {
        rtm: {
          Error: {
            excludeList: [2104],
          },
        },
      },
    },
}).then(function(veplayer) {
    veplayer.on(VePlayer.live.Events.FALLBACK_ERROR, function(){
        // 所有协议降级完后失败
    });
})
        

常见问题

如何检测协议兼容性?

VePlayer 在初始化播放源时,会自动根据当前浏览器环境判断是否支持 RTM 或 FLV 协议,从而决定是否触发降级。

  • 对 RTM 播放支持的判断逻辑如下:
    • isRTMSupported() 返回 true:表示浏览器整体支持 RTM 播放。
    • isRTMSupportCodec() 返回 true:表示浏览器支持 RTM 所需的音视频编解码格式。
    • 只有当上述两者均返回 true,才会尝试拉取 RTM 流,否则将触发降级。
  • 对 FLV 播放支持的判断逻辑如下:
    • isFLVSupported() 返回 true:表示浏览器支持通过 MSE 播放 FLV 协议流。