实时音视频

  • 实时音视频 > 使用指南 > HarmonyOS >CDN 转推

    CDN 转推

    最近更新时间: 2024-12-24 14:52:10

    本部分介绍了 CDN 转推的使用姿势及其应用场景。

    CDN 转推可实现直播场景的功能,实时音视频场景下的直播单路流直播的直播场景

    CDN 转推需要配置本地或者远端的音视频 Track,因此,调用转推接口前请务必保证已加入房间,且已发布或者订阅了相应的音视频 Track

    下面将会对这三种场景的使用姿势进行分别说明。

    设置监听

    在进行 CDN 转推之前,需要实现 QNLiveStreamingListener 有关 CDN 转推的代理回调方法:

    export interface QNLiveStreamingListener {
      /**
       * 转推任务成功创建时触发此回调
       *
       * @param streamID 转推成功的 streamID
       */
      OnStarted: (streamID: string) => void
    
      /**
       * 转推任务成功停止时触发此回调
       *
       * @param streamID 停止转推的 streamID
       */
      OnStopped: (streamID: string) => void
      
      /**
       * 转推任务配置更新时触发此回调
       *
       * @param streamID 更新后的转推 streamID
       */
      OnTranscodingTracksUpdated: (streamID: string) => void
    
      /**
       * 转推任务出错时触发此回调
       *
       * @param streamID 出现错误的 streamID
       * @param info 详细错误原因
       */
      OnError: (streamID: string, info: QNLiveStreamingErrorInfo) => void
    }
    

    设置回调实现示例:

    this.client!.SetLiveStreamingListener(this.liveStreamingListener)
    

    其中,转推任务出错时的错误信息及原因可参考 QNLiveStreamingErrorInfo

    在设置好 QNLiveStreamingListener 代理并实现相应回调后,便可以基于实际业务场景进行单路转推的创建和使用了。

    单路流直播场景

    单路流直播的场景,顾名思义,就是将一条音视频流直接转推到直播服务器,主要适用于不包含连麦的秀场直播连麦中需要将某一路流单独转推落存储等场景。

    场景示意图如下:

    单路流直播

    该场景的主要实现步骤如下:

    创建单路转推任务

    QNDirectLiveStreamingConfig 用于配置单路转推的相关信息,包括推流地址以及参与 CDN 转推的音视频 Track

    相关配置及创建转推任务的示例代码如下:

    this.directLiveStreamingConfig = new QNDirectLiveStreamingConfig()
    this.directLiveStreamingConfig.localAudioTrack = this.micTrack
    this.directLiveStreamingConfig.localVideoTrack = this.cameraTrack
    this.directLiveStreamingConfig.streamId = this.roomName
    this.directLiveStreamingConfig.publishUrl = CommonConstants.PREFIX_PUBLISH_URL + this.roomName
    let ret: number = this.client.StartLiveStreaming(this.directLiveStreamingConfig)
    
    

    单路转推任务创建成功后,会触发 QNLiveStreamingListener.OnStarted 回调接口:

      /**
       * 转推任务成功创建时触发此回调
       *
       * @param streamID 转推成功的 streamID
       */
      OnStarted: (streamID: string) => void
    

    创建成功后,就可以通过相应的播放链接拉取直播流进行观看了。

    注意: QNDirectLiveStreamingConfig 仅支持配置一路视频轨和一路音频轨,重复设置将会被覆盖。

    停止单路转推任务

    可以通过如下方式,调用 QNRTCClient.StopLiveStreaming 实现单路转推任务的停止:

    let ret: number = this.client.StopLiveStreaming(this.directLiveStreamingConfig)
    

    单路转推任务停止成功后,会触发 QNLiveStreamingListener.OnStopped 回调:

      /**
       * 转推任务成功停止时触发此回调
       *
       * @param streamID 停止转推的 streamID
       */
      OnStopped: (streamID: string) => void
    

    停止转推成功后,相应的播放链接直播流就无法观看了。

    多路流合流直播场景

    多路流合流直播场景,主要适用于连麦互动直播PK 直播以及单主播需要两路以上视频合流转推等场景。简单来说,就是对连麦各方的视频画面进行合流,然后转推。这种场景相较于纯直播场景的单路流转推会复杂一些。

    场景示意图如下:

    多路流合流直播

    实现该场景需要先了解下相关的配置类及其作用:

    该场景的主要实现步骤如下:

    开启合流直播

    创建合流转推任务

    private transcodingLiveStreamingConfig: QNTranscodingLiveStreamingConfig = new QNTranscodingLiveStreamingConfig()
    
    // 设置流 id
    this.transcodingLiveStreamingConfig.streamId = this.roomName
    
    // 设置推流 url
    this.transcodingLiveStreamingConfig.publishUrl = CommonConstants.PREFIX_PUBLISH_URL + this.roomName
    
    // 设置合流宽高
    this.transcodingLiveStreamingConfig.width = this.mTranscodWidth
    this.transcodingLiveStreamingConfig.height = this.mTranscodHeight
    
    // 设置合流帧率、码率、最小码率、最大码率
    this.transcodingLiveStreamingConfig.fps = this.mTranscodFps
    this.transcodingLiveStreamingConfig.bitrate = this.mTranscodBitrate
    this.transcodingLiveStreamingConfig.minBitrate = this.mTranscodMinBitrate
    this.transcodingLiveStreamingConfig.maxBitrate = this.mTranscodMaxBitrate
    
    // 是否是纯音频
    this.transcodingLiveStreamingConfig.isAudioOnly = this.mIsAudioOnly
    
    // 合流渲染方式
    this.transcodingLiveStreamingConfig.stretchMode = this.mStretchModeIndex
    
    // 设置背景图片
    let mergeBackground: QNTranscodingLiveStreamingImage = new QNTranscodingLiveStreamingImage()
    mergeBackground.layerUrl = this.mLayerUrl
    mergeBackground.x = this.mImageX
    mergeBackground.y = this.mImageY
    mergeBackground.layerWidth = this.mLayerWidth
    mergeBackground.layerHeight = this.mLayerHeight
    this.transcodingLiveStreamingConfig.mergeBackground = mergeBackground
    
    // 设置水印
    this.transcodingLiveStreamingConfig.mergeWatermark = [mergeBackground]
    
    // 开始转推
    let ret: number = this.client?.StartTranscodingLiveStreaming(this.transcodingLiveStreamingConfig) 
    

    合流转推任务创建成功后,会触发如下 QNLiveStreamingListener.OnStarted 回调:

    OnStarted: (streamID: string) => void
    

    此时,可以在该回调接口中设置合流布局。

    设置合流布局

    合流转推任务创建成功之后,就可以基于用户发布的 Track 进行合流布局的配置了。这里首先需要了解下 QNTranscodingLiveStreamingTrack 的概念。

    相关配置的示例代码如下:

    this.transcodingTrack = new QNTranscodingLiveStreamingTrack()
    // 设置待合流 Track id
    this.transcodingTrack.trackId = remoteVideoTrack.GetTrackID() 
    // 设置 Track 画面在合流画面中位置的 x、y 及宽高的位置
    this.transcodingTrack.x = 480
    this.transcodingTrack.y = 848
    this.transcodingTrack.width = 480
    this.transcodingTrack.height = 848
    // 设置 Track 画面在合流画面中的层级,0 是最底层
    this.transcodingTrack.z = 0
    this.transcodingTrack.stretchMode = QNStretchMode.StretchScaleToFit
    this.transcodingTrack.isSupportSei = false
    

    音频 Track 和视频 Track 创建合流布局的方法相同,音频 Track 对应创建的 QNTranscodingLiveStreamingTrack 只需传入 trackID 即可。

    其中,远端用户的 trackID 可以通过 SDK 提供的相关回调返回的 QNRemoteAudioTrackQNRemoteVideoTrack 获取:

      OnSubscribed: (userid: string, remoteAudioTrackList: QNRemoteAudioTrack[], remoteVideoTrackList: QNRemoteVideoTrack[]) => void {
    	// 当成功订阅远端 Track 时会触发此回调
    }
    

    通过调用下面的方法 QNTranscodingLiveStreamingTrack 更新已有 Track 的布局:

      SetTranscodingLiveStreamingTracks(streamId: string, transcodingTrackList: QNTranscodingLiveStreamingTrack[]): number
    

    当期望取消某路合流布局时,可以通过调用 QNRTCClient.RemoveTranscodingLiveStreamingTracks 接口实现:

      RemoveTranscodingLiveStreamingTracks(streamId: string, transcodingTrackList: QNTranscodingLiveStreamingTrack[]): number
    

    停止合流直播

    可以通过如下方式,调用 QNRTCClient.StopTranscodingLiveStreaming 实现合流转推任务的停止

      StopTranscodingLiveStreaming(config: QNTranscodingLiveStreamingConfig): number
    

    合流转推任务停止成功后,会触发 QNLiveStreamingListener.OnStopped 回调:

    OnStopped: (streamID: string) => void
    

    单路流、多路流合流二者切换的场景

    单路流、多路流合流二者切换的场景,主要适用于有连麦需求的秀场直播等场景,能够满足主播在自己单路流直播和连麦两路流合流直播二者间切换的需求。对于该场景的实现,需要注意的问题是,在两种场景切换的过程中,如何保证观看端不会断流黑屏。

    为了避免切换过程中断流黑屏的问题,这里我们七牛直播云引入 serialnum 的概念,支持 serialnum 决定流的优先级,值越大,优先级越高,可以帮助更好的实现两路流的平滑切换:

    • QNDirectLiveStreamingConfigQNTranscodingLiveStreamingConfig 两种任务场景推流地址需要保持一致,以避免播放端需要实现多余的切流操作
    • 由于上述完全一致的地址可能会导致抢流的现象出现,所以需要在推流地址后面加上 serialnum 的参数,如 "rtmp://domain/app/streamName?serialnum=xxx",其中,serialnum 决定流的优先级,值越大,优先级越高,便不会出现抢流的现象。也基于此,合流任务必须使用自定义合流任务,以便自定义推流地址。

    综上,单路流、合流切换场景的实现步骤如下:

    1. 创建单路流转推任务,同时进行单路流直播
    2. 需要从单路转推任务切换到合流转推任务时,创建自定义合流任务,注意要使用自定义合流任务指定带有 serialnum 参数的推流地址,在收到合流转推任务的 OnStarted 回调之后,在回调中执行 StopLiveStreaming(directLiveStreamingConfig) 来停止单路转推任务
    3. 需要从合流转推任务切换到单路转推任务时,创建单路转推任务,其推流地址需要带有 serialnum 参数,在收到单路转推任务的 OnStarted 回调之后,在回调中执行 StopTranscodingLiveStreaming(transcodingLiveStreamingConfig) 来停止合流转推任务

    通过上述方式,即可实现单路流直播、多路流合流直播之间的切换

    发送 SEI

    CDN 转推场景支持 SEI 信息的发送,设置方式如下:

    let ret: number = this.cameraTrack.SendSEI("SEI Message", "123456789", 1)
    

    对于单路流直播的场景,调用上述接口后,播放端即可通过使用支持 SEI 解析的播放器获取到对应的 SEI 信息。

    注意事项

    • CDN 转推需要配置本地或者远端的音视频 Track,因此,调用转推接口前请务必保证加入了房间,并且已经发布或者订阅了相应的音视频 Track
    • 单路流直播场景,一路流仅支持一路音频轨和一路视频轨的设置,重复设置会被覆盖
    • 如果场景涉及到单路流直播、多路流合流直播之间的切换,那么合流任务务必使用自定义合流任务以指定带有 serialnum 的推流地址。其中,serialnum 决定流的优先级,从 1 开始递增,值越大,优先级越高

    示例代码

    CDN 转推场景的示例代码可参考 API-Examples-HarmonyOS

    以上内容是否对您有帮助?
  • Qvm free helper
    Close