跳到主要内容

融云 CDN 播放器

提示

融云 CDN 插件(RongRTCPlayer) 从 5.3.0 版本开始提供 CDN 播放器 RCRTCMediaPlayer

融云 CDN 插件 RongRTCPlayer 中提供了 CDN 流播放组件 RCRTCMediaPlayer,可用于播放第三方 CDN 直播流、获取 SEI 数据、或直接获取音视频帧数据用于自行处理。

  • 仅支持播放 CDN 直播流,不支持点播文件或网络点播资源。
  • 支持的 CDN 直播流协议:RTMP、HTTP-FLV、HLS
  • 仅支持播放 60fps 以下(不含)帧率的视频。

适用场景

融云 CDN 插件(RongRTCPlayer)直接在 RTC 房间内提供了 融云 CDN 服务的订阅、播放等处理逻辑,降低了 App 业务侧的接入成本。

CDN 流播放组件 RCRTCMediaPlayer 可直接输入 CDN 流地址进行播放,不依赖于用户加入 RTC 房,能有效降低 CDN 首屏打开延时,带来更优秀的用户体验。具体适用场景如下:

  • 您的 App 自行接入了第三方 CDN 服务,希望通过融云 CDN 播放器组件播放第三方拉流地址。
  • 您的 App 使用了融云 CDN 服务,按照融云指定的规则自行拼接生成推流、拉流地址后(详见融云 CDN 服务配置),通过融云客户端旁路推流服务端旁路推流接口将 CDN 推流地址提交给融云。配置成功后,可在融云 CDN 播放器中输入您自行生成的 CDN 拉流地址进行播放。该方式要求您将融云 CDN 的「推拉流模式」配置为自行生成推拉流地址模式。
  • 您的 App 使用了融云 CDN 服务,并直接使用融云服务端接口获取融云 CDN 拉流地址,您也可以通过融云 CDN 播放器组件进行播放。该方式要求您将融云 CDN 的「推拉流模式」配置为开播自动推流开播手动推流模式。

集成 CDN 播放器组件

RCRTCMediaPlayer 在融云 CDN 插件(RongRTCPlayer)中提供。

融云 CDN 插件(RongRTCPlayer) 支持通过 Maven 或 Android 本地库模块 (Module) 导入。详见导入 SDK

使用 CDN 播放器组件

  1. 创建 RCRTCMediaPlayer 实例,同时设置播放事件代理 RCRTCMediaPlayerEventListener。注意,设置代理必须在加载资源(open)调用之前。

    mMediaPlayer = new RCRTCMediaPlayer();
    /**注册播放器事件监听,不需要时可取消注册 unRegisterEventListener() */
    mMediaPlayer.registerEventListener(mediaPlayerEventListener);
  2. 加载资源。资源缓冲完成后,不会自动播放。

    /** ret==0时加载成功,其他返回值为错误码。注意 open 调用后,需要在收到 OPEN_COMPLETED 通知后,调用 play 接口才会播放 **/
    int ret = mMediaPlayer.open(url);
  3. 播放资源。

    /** ret==0时加载成功,其他返回值为错误码。如果想暂停播放,请调用pause方法 **/
    int ret = mMediaPlayer.play()
  4. 设置渲染视图。注意 setVideoView 必须在 open 接口后才能调用。

    提示

    如果设置音频帧数据监听 RCRTCMediaPlayerVideoFrameListener,则播放器不执行内部渲染。

    RCRTCVideoView videoView = new RCRTCVideoView(context.getApplicationContext());
    FrameLayout.LayoutParams layoutParams =
    new FrameLayout.LayoutParams(
    ViewGroup.LayoutParams.MATCH_PARENT,
    ViewGroup.LayoutParams.MATCH_PARENT);
    layoutParams.gravity = Gravity.CENTER_HORIZONTAL;
    frameLayout.addView(videoView, layoutParams);

    /** 注意 setVideoView接口 需要在 open 接口调用后才能调用 */
    mMediaPlayer.setVideoView(videoView);
  5. (可选)设置渲染模式。如不设置,默认为 ScalingType.SCALE_ASPECT_FIT,等比例填充黑边,直到一个维度到达区域边界。

    // 注意要先设置视图,再设置视图渲染模式,详细见 ScalingType 枚举
    mMediaPlayer.setRenderMode(ScalingType.SCALE_ASPECT_FILL);
  6. 销毁当前播放资源。App 用户可能需要切换到另一个主播的 CDN 流,或者切换到不同分辨率的 CDN 流地址时,此时必须先调用 destroy,再调用 open 加载另一个资源。

    /** 停止播放,如果想恢复播放,请调用 open方法 **/
    mMediaPlayer.destroy();

播放控制

  • 在播放过程中可暂停。暂停后调用 play 方法可恢复播放。

    /** ret==0时加载成功,其他返回值为错误码。如果想恢复播放,请调用play方法 **/
    int ret = mMediaPlayer.pause();
  • 设置播放音量。如不设置,使用默认值 100。

    /**播放器支持设置播放音量,以及取值当前音量,取值范围 [0,100],如果用户没有设置音量,默认值 100(媒体文件的原始音量)。**/
    mMediaPlayer.setVolume(progress);
  • 获取当前音量

    int volume = mMediaPlayer.getVolume();

获取流信息数据

在加载资源后可以获取流信息数据 [RCRTCMediaInfo],例如音视频的帧率、码率、视频尺寸、音频采样率等。

ArrayList<RCRTCMediaInfo> mediaInfoArrayList = mMediaPlayer.getStreamInfo();

播放事件回调

通过设置 RCRTCMediaPlayerEventListener 监听器,接收播放相关的事件,包括:

  • 播放器当前状态通知 onPlayerStateChangedstate 中返回播放器当前状态 [RCRTCMediaPlayerState]。error 中返回播放器当前错误状态 [RCRTCMediaPlayerError],您可以适当添加日志记录方便错误排查,没有错误时返回 NONE
  • 分辨率变化通知 onVideoSizeChanged,接收到视频首帧时,会通知上层当前帧分辨率,后续在推流分辨率发生变化时,也会通过该回调通知到上层。开发者可以通过此通知来适当调整当前视图尺寸。
  • 播放器收到音频首帧 onFirstVideoFrame
  • 播放器收到视频首帧 onFirstAudioFrame
  • 播放器收到 SEI 数据。CDN 播放器组件支持解析拉流资源的媒体增强补充信息(SEI)。在接收到 SEI 数据时,会通过该回调通知到上层。回调的频次和 SEI 帧率一致。另外,为配合融云的旁路推流功能,使用 RCRTCMediaPlayer 拉流时,默认会回调拉流房间内多个视频流的合流布局信息。回调频次以及数据结构与 IRCRTCRoomEventsListeneronReceiveLiveStreamSEI(String sei); 方法相同。
private RCRTCMediaPlayerEventListener mediaPlayerEventListener =
new RCRTCMediaPlayerEventListener() {
//播放器当前状态通知以及当前状态是否发生错误,播放器状态码详见枚举 RCRTCMediaPlayerState,错误码详见枚举RCRTCMediaPlayerError
@Override
public void onPlayerStateChanged(
IRCRTCMediaPlayer mediaPlayer,
RCRTCMediaPlayerState state,
RCRTCMediaPlayerError error) {
}
//分辨率变化通知。接收到视频首帧时,会通知上层当前帧分辨率,后续在推流分辨率发生变化时,也会通过该回调通知到上层。开发者可以通过此通知来适当调整当前视图尺寸。
@Override
public void onVideoSizeChanged(
IRCRTCMediaPlayer mediaPlayer, int width, int height) {

}
//播放器收到视频首帧
@Override
public void onFirstVideoFrame(
IRCRTCMediaPlayer mediaPlayer, int width, int height) {

}
//播放器收到音频首帧
@Override
public void onFirstAudioFrame(IRCRTCMediaPlayer mediaPlayer) {

}
//播放器收到SEI数据通知
@Override
public void onReceiveSEI(IRCRTCMediaPlayer mediaPlayer, String data) {

}
};

音视频数据回调

播放器提供音视频帧数据回调,需要用户在调用 open 前设置 RCRTCMediaPlayerAudioFrameListenerRCRTCMediaPlayerVideoFrameListener 监听器。调用播放时,播放器会上抛音视频帧。

/** 注册视频帧回调监听,不需要监听数据时(比如在播放器 activity 退出时)需要调用unRegisterVideoFrameListener() */
mMediaPlayer.registerVideoFrameListener(playerVideoFrameListener);
/** 注册音频帧回调监听,不需要监听数据时(比如在播放器 activity 退出时)需要调用unRegisterAudioFrameListener() */
mMediaPlayer.registerAudioFrameListener(audioFrameListener);

获取视频帧数据

设置 RCRTCMediaPlayerVideoFrameListener 监听器后,CDN 播放器不执行内部视频渲染。App 可自行处理视频渲染。

private RCRTCMediaPlayerVideoFrameListener playerVideoFrameListener =
new RCRTCMediaPlayerVideoFrameListener() {
@Override
public void onFrame(RCRTCMediaPlayerVideoFrame frame) {}
};

RCRTCMediaPlayerVideoFrame 参数说明:

参数类型说明
textureIdint纹理Id
widthint当前帧的宽度
heightint当前帧的高度
rotationint旋转角度
timestamplong视频帧的时间戳,单位毫秒
rotationint旋转角度
transformMatrixfloat[]转换矩阵

获取音频帧数据

如需自行处理音频播放,可将 CDN 播放器的音量置为 0。

private RCRTCMediaPlayerAudioFrameListener audioFrameListener =
new RCRTCMediaPlayerAudioFrameListener() {
@Override
public void onFrame(RCRTCMediaPlayerAudioFrame frame) {}
};

RCRTCMediaPlayerAudioFrame 参数说明:

参数类型说明
sampleRateint采样率
channelsint声道数量(如果是立体声,数据是交叉的) ,单声道: 1 双声道: 2
bytesPerSampleUInt32每个采样点的字节数: 对于 PCM 来说,一般使用 16 bit,即两个字节
bytesbyte[]音频数据