本章节为您介绍拉流基础功能的接入方法,根据文档提供的操作步骤进行配置,您可接入直播拉流播放控制能力。
真机调试:由于 SDK 使用了大量的音视频接口,这些接口在仿真模拟器下可能会出现异常,推荐您使用真机进行代码调试。
本节为您详细介绍如何通过拉流 SDK 实现直播拉流播放控制的能力,包括但不限于创建播放器、初始化配置、事件监听、设置渲染 View、设置播放地址。
使用拉流 SDK,需要先创建直播播放器。您可以参考以下代码创建播放器。
import {initPlayer} from '@volcengine/react-native-velive-pull'; const mLivePlayer = await initPlayer({ viewId: 'pull-view', enableSei: true, // 初始化配置参数 networkTimeoutMs: 10000, });
播放器进行初始化相关配置。详细参数说明如下表所示。
参数 | 类型 | 说明 |
---|---|---|
enableSei | boolean | 是否开启 SEI 消息的解析。默认值为 false 。 |
enableHardwareDecode | boolean | 是否开启硬件解码功能。默认值为 true 。开启后,如果硬件解码失败,播放器会自动切换为软解码。 |
networkTimeoutMs | int | 网络超时时间,单位为 ms。默认值为 5000 。如果网络请求在超时时间内未收到服务器响应,播放器会认为请求失败。 |
retryIntervalTimeMs | int | 重试时间间隔,单位为 ms。默认值为 5000 。在播放直播时,如果出现网络异常等导致播放中断,播放器会尝试进行重试。 |
retryMaxCount | int | 播放器在网络连接错误的情况下的最大重试次数。默认值为 5 。如果配置为 0 ,表示关闭播放器内部的重试机制。 |
enableLiveDNS | boolean | 是否开启本地 DNS 预解析。默认值为 注意 如果预解析出现异常,可能会影响播放器的正常使用。 |
enableStatisticsCallback | boolean | 是否开启播放信息周期性回调。默认值为 false 。 |
statisticsCallbackInterval | int | 播放信息周期性回调的时间间隔,单位为 s。默认值为 5 。 |
您可以通过配置事件回调监听来获取播放器的内部状态信息,包括播放器状态、错误信息、音视频首帧回调以及周期性统计数据等。代码示例如下所示。
mLivePlayer.setObserver({ onFirstVideoFrameRender() { addLog('视频首帧渲染'); }, onFirstAudioFrameRender() { addLog('音频首帧渲染'); }, onVideoRenderStall() { addLog('视频渲染卡顿'); }, onAudioRenderStall() { addLog('音频渲染卡顿'); }, onResolutionSwitch(_player, resolution) { if (resolution !== playerConfig.resolution) { playerConfig.resolution = resolution; } addLog(`清晰度切换: ${VeLivePlayerResolution[resolution]}`); }, onVideoSizeChanged(_player, width, height) { addLog(`分辨率切换: ${width} * ${height}`); }, onReceiveSeiMessage(_player, message) { if (message.includes('[RTS]')) { return; } addLog(`收到sei消息: ${message}`); }, onMainBackupSwitch(_player, _streamType, _error) { addLog('主备切换'); }, onPlayerStatusUpdate(_player, status) { addLog('播放器状态更新' + VeLivePlayerStatus[status]); }, onSnapshotComplete(_player, _bitmap) { addLog('截图完成'); }, onStreamFailedOpenSuperResolution(_player, err) { addLog(`开启超分失败 (${err.errorCode || ''}) ${err.errorMsg || ''}`); }, onStatistics(_player, info) { playerConfig.info = `url: ${info.url} 当前播放延迟: ${info.delayMs} 下载码率: ${info.bitrate} 当前播放格式: ${VeLivePlayerFormat[info.format]} 当前帧率: ${info.fps} 分辨率: ${info.width} * ${info.height} 解码方式: ${info.isHardwareDecode ? '硬解' : '软解'} 传输协议: ${VeLivePlayerProtocol[info.protocol]} 累计卡顿时长: ${info.stallTimeMs} 音频缓冲区大小: ${info.audioBufferMs} 视频缓冲区大小: ${info.videoBufferMs} 视频编码类型: ${info.videoCodec}`; }, onError(_player, error) { addLog(`播放错误: (${error.errorCode}) ${error.errorMsg}`); }, });
为了展示播放器的视频画面,您需要配置一个渲染 View。播放器提供了 NativeViewComponent 来进行配置。
import {NativeViewComponent} from '@volcengine/react-native-velive-pull'; const PullView = () => { return ( <NativeViewComponent id="pull-view" kind={ Platform.select({ android: 'SurfaceView', ios: 'UIView', })! } onViewLoad={initPlayer} style={{width: '100%', height: '100%'}} /> ); };
通过 setPlayUrl
接口配置单一播放地址,支持 RTMP、FLV、HLS 等直播协议地址。代码示例如下所示。
// 通过 URL 进行播放 const playUrl = "http://pull.example.com/live/stream.flv"; // 配置播放地址 mLivePlayer.setPlayUrl(playUrl);
说明
如果您需要配置多路组合播放地址,可使用 setPlayStreamData
接口,该接口支持 RTM、QUIC、主备流、多档位、ABR 等功能,详细的代码示例和接入方法请参考进阶功能接入。
您可以通过以下接口调整播放画面的填充模式、镜像和旋转角度,以获得更好的观看体验。
通过播放器的 setRenderFillMode
接口可以配置播放画面的填充模式,播放器支持以下 3 种填充模式。
填充模式 | 说明 |
---|---|
VeLivePlayerFillModeAspectFit | 显示完整的视频帧。视频帧等比缩放,直至视频帧恰好在画布上全部显示。如果视频帧长宽比例与画布不同,视窗上未被视频帧填满区域将填充为黑色。 |
VeLivePlayerFillModeFullFill | 视频帧自适应画布。视频帧非等比缩放,直至填满画布。在此过程中,视频帧的长宽比例可能会发生变化。 |
VeLivePlayerFillModeAspectFill | 视频填满画布。视频帧等比缩放,直至填满画布,超出屏幕的部分将被裁剪,画面可能不完整。 |
您可以参考以下代码示例配置填充模式。
// 配置填充模式 mLivePlayer.setRenderFillMode( VeLivePlayerFillMode.VeLivePlayerFillModeAspectFill, );
通过播放器的 setRenderMirror
接口可以配置播放画面的镜像模式,播放器支持以下 3 种镜像模式。
镜像 | 说明 |
---|---|
VeLivePlayerMirrorNone | 关闭镜像 |
VeLivePlayerMirrorHorizontal | 水平镜像 |
VeLivePlayerMirrorVertical | 垂直镜像 |
您可以参考以下代码示例配置镜像。
// 配置水平镜像 mLivePlayer.setRenderMirror(VeLivePlayerMirror.VeLivePlayerMirrorHorizontal);
通过播放器的 setRenderRotation
接口可以配置播放画面的旋转角度,播放器支持以下 4 种旋转角度。
旋转 | 说明 |
---|---|
VeLivePlayerRotation0 | 关闭旋转 |
VeLivePlayerRotation90 | 顺时针旋转 90 度 |
VeLivePlayerRotation180 | 顺时针旋转 180 度 |
VeLivePlayerRotation270 | 顺时针旋转 270 度 |
您可以参考以下代码示例配置旋转角度。
// 配置画面旋转 90 度 mLivePlayer.setRenderRotation(VeLivePlayerRotation.VeLivePlayerRotation90);
调用播放器的 play
接口开始播放。代码示例如下所示。
mLivePlayer.play(); //开始播放。
调用播放器的 isPlaying
接口可以获取当前的播放状态。代码示例如下所示。
const isPlaying = mLivePlayer.isPlaying(); //获取播放状态
调用播放器的 pause
接口暂停播放,代码示例如下所示。
mLivePlayer.pause(); //暂停播放
说明
在直播中,暂停和停止的行为相同。暂停后再调用 play
方法,播放器将重新拉流。
调用播放器的 stop
接口停止播放。代码示例如下所示。
mLivePlayer.stop(); //停止播放
调用播放器的 destroy
接口销毁播放器并释放内存。当您停止播放后需要销毁播放器时,请调用该接口。代码示例如下所示。
mLivePlayer.destroy(); // 销毁拉流引擎,退出前释放播放器和内存
在应用程序从前台切换到后台时,播放器默认会继续播放音频。如果您希望在后台状态停止播放,可参考以下示例代码。
AppState.addEventListener('change', state => { state === 'active' && mLivePlayer.play(); state === 'background' && mLivePlayer.pause(); });
调用播放器的 setMute
接口可以控制是否静音播放。代码示例如下所示。
mLivePlayer.setMute(true); // 配置静音播放
调用播放器的 isMute
接口可以获取当前是否为静音状态。代码示例如下所示。
boolean isMute = mLivePlayer.isMute(); // 获取静音状态
调用播放器的 setPlayerVolume
接口可以控制播放音量,参数表示音量大小,默认值为 1.0,取值范围为 [0.0,1.0]。代码示例如下所示。
mLivePlayer.setPlayerVolume(0.5); // 配置播放音量