本章节为您介绍推流 SDK 进阶功能的接入方式,支持的进阶功能包括但不限于 RTM 协议推流、QUIC 协议推流、多 URL 推流、H.265 硬件编码等。您可以根据实际业务需求,借助推流 SDK 实现更复杂的功能。
真机调试:由于 SDK 使用了大量的音视频接口,这些接口在仿真模拟器下可能会出现异常,推荐您使用真机进行代码调试。
视频直播推流 SDK 支持 RTM 协议推流,详细信息可参考超低延时直播介绍。
使用视频直播控制台的地址生成器,生成 RTM 推流地址。
开始推流时,将 SDK 推流地址设置为 RTM 地址。代码示例如下所示:
mLivePusher.startPush('http://example.push/stream.sdp'); //添加 RTM 协议推流地址
(可选)配置自动降级。代码示例如下所示:
说明
配置自动降级后,RTM 推流失败时,推流 SDK 将自动降级到 RTMP 推流。使用此功能需同时设置 RTM 和 RTMP 推流地址。
const urls = []; urls.push('http://example.push/stream.sdp'); // 添加 RTM 协议推流地址 urls.push('rtmp://example.push/stream'); // 添加 RTMP 协议推流降级地址 mLivePusher.startPushWithUrls(urls);
视频直播推流 SDK 支持 RTMPS 协议推流。
使用视频直播控制台的地址生成器,生成 RTMP 推流地址。
修改推流地址协议,将 RTMP 推流地址中的 rtmp 协议修改为 rtmps。例如:
rtmp://example.push/stream
rtmps://example.push/stream
mLivePusher.startPush('rtmps://example.push/stream'); //添加 RTMPS 协议推流地址
(可选)配置自定降级。代码示例如下所示:
说明
配置自动降级后,RTMPS 推流失败时,推流 SDK 将自动降级到 RTMP 推流。使用此功能需同时设置 RTMPS 和 RTMP 推流地址。
const urls = []; urls.push('rtmps://example.push/stream'); // 添加 RTMPS 协议推流地址 urls.push('rtmp://example.push/stream'); // 添加 RTMP 协议推流降级地址 mLivePusher.startPushWithUrls(urls);
视频直播推流 SDK 支持 QUIC 协议推流。
使用视频直播控制台的地址生成器,生成 RTMP 推流地址。
修改推流地址协议,将 RTMP 推流地址中的 rtmp 协议修改为 rtmpq。例如:
rtmp://example.push/stream
rtmpq://example.push/stream
mLivePusher.startPush('rtmpq://example.push/stream'); //添加 QUIC 协议推流地址
说明
推流 SDK 默认开启 QUIC 协议推流的自动降级策略。无需额外配置, QUIC 协议推流失败后,SDK 将自动降级为 RTMP 协议推流。
使用多 URL 推流,可以在推流失败后自动切换到下一个推流地址继续推流,提高推流的稳定性和可靠性。
说明
多 URL 推流的地址数量无限制,推流引擎会按顺序遍历所有的推流地址,直至最后无可用地址后报错。
代码示例如下所示:
const urls = []; urls.push('rtmp://example.push/stream_1'); urls.push('rtmp://example.push/stream_2'); mLivePusher.startPushWithUrls(urls);
使用 H.265 硬件编码,可在相同画质下有效降低带宽开销;也可在带宽开销相同时,提供更优异的画质体验。
说明
License 版本为高级版的 SDK 应用支持 H.265 硬件解码。
配置白名单。
说明
部分 Android 机型不支持 H.265 硬件编码,视频直播云端提供机型白名单,使用 H.265 硬件编码前请联系技术支持配置云端白名单。
配置硬件编码并创建推流引擎。代码示例如下所示:
// 创建推流配置 const encoderConfiguration = new VeLiveVideoEncoderConfiguration(); // 配置编码类型为 H.265 encoderConfiguration.setCodec(VeLiveVideoCodec.VeLiveVideoCodecByteVC1); // 创建推流引擎 const mLivePusher = config.build(); // 设置推流引擎的编码配置 mLivePusher.setVideoEncoderConfiguration(encoderConfiguration);
推流 SDK 除支持手机摄像头采集推流外,还支持使用单张图片推流。代码示例如下所示:
const image = Image.resolveAssetSource({ uri: 'PATH/bg.jpg', }); // 更新推流图片 mLivePusher.updateCustomImage(bitmap); // 开启视频采集类型为自定义图片 mLivePusher.startVideoCapture( VeLiveVideoCaptureType.VeLiveVideoCaptureCustomImage, );
在直播业务中,有些主播会在直播间 K 歌或播放背景音乐,下面为您介绍相关能力的接口。
获取媒体音乐播放器。代码示例如下所示:
const mediaPlayer = mLivePusher.createPlayer();
设置音乐文件路径,支持的文件格式包括 MP3、AAC、M4A、WAV。代码示例如下所示:
// 设置文件路径 mediaPlayer.prepare('PATH/music.mp3');
设置是否混音到直播流。代码示例如下所示:
// 设置是否混音到直播流 mediaPlayer.enableMixer(true);
设置是否循环播放。代码示例如下所示:
// 设置是否循环播放。 mediaPlayer.enableBGMLoop(true);
开始播放。代码示例如下所示:
// 开始播放 mediaPlayer.start();
调整背景音乐音量和主播音量。代码示例如下所示:
// 设置背景音乐音量大小 0.0 - 1.0 mediaPlayer.setBGMVolume(0.8); // 设置主播声音音量大小 0.0 - 1.0 mediaPlayer.setVoiceVolume(1.0);
快进播放。代码示例如下所示:
// 快进到某个时间点,可以通过 mediaPlayer.getDuration() 获取文件总时长 mediaPlayer.seek(3000);
暂停播放、继续播放。代码示例如下所示:
// 暂停 mediaPlayer.pause(); // 继续 mediaPlayer.resume();
停止播放。代码示例如下所示:
// 停止播放 mediaPlayer.stop();
在直播过程中,有些信息需要跟随视频帧到达每一个观众,推流引擎提供了发送 SEI 的接口,可以编码自定义信息到关键帧或者每个视频帧里。代码示例如下所示:
// 发送 SEI 信息 mLivePusher.sendSeiMessage( 'key', { key: 'value', key2: 'value2', }, -1, true, true, );
直播过程中,支持主播将自己的精彩直播录制并保存在手机上,推流 SDK 提供了相应的录制能力。
配置录制参数,开始录制。代码示例如下所示:
// 设置录制参数 VeLivePusherDef.VeLiveFileRecorderConfiguration recordConfig = new VeLivePusherDef.VeLiveFileRecorderConfiguration(); // 录制视频的宽度 recordConfig.setWidth(720); // 录制视频的高度 recordConfig.setHeight(1280); // 录制视频的帧率 recordConfig.setFps(15); // 录制视频的码率 recordConfig.setBitrate(2000); mLivePusher.startFileRecording("PATH/record.mp4", recordConfig, { // 直播录制开始回调。 onFileRecordingStarted() {}, // 直播录制停止回调。 onFileRecordingStopped() {}, // 错误码,详情请参见 VeLivePusherCode // 直播录制错误回调。 onFileRecordingError(errorCode: number, message: string) {} });
停止录制。代码示例如下所示:
mLivePusher.stopFileRecording();
直播过程中,支持主播在 App 进入到后台时持续推流,推流 SDK 提供了相应的后台推流能力。
说明
根据不同的模式,切换后台视频采集类型。代码示例如下所示:
AppState.addEventListener('change', async state => { if (state === 'active') { // 这里业务上可以记录上次开启的视频采集类型,在进入前台后切换为上次的采集类型 mLivePusher.switchVideoCapture(VeLiveVideoCaptureFrontCamera); } else if (state === 'backgroud') { // 尾帧推流 mLivePusher.switchVideoCapture(VeLiveVideoCaptureLastFrame); // 黑帧推流 // mLivePusher.switchVideoCapture(VeLiveVideoCaptureDummyFrame); // 后台图片推流 // Bitmap bitmap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888); // mLivePusher.updateCustomImage(bitmap); // mLivePusher.switchVideoCapture(VeLiveVideoCaptureCustomImage); } });
推流 SDK 除了支持手机摄像头采集推流外,还支持手机屏幕采集推流。屏幕采集推流适用于游戏直播、移动端 App 演示等场景。
import {startScreenCapture} from '@volcengine/react-native-velive-push'; // 开启屏幕采集 startScreenCapture(mLivePusher, { enableAppAudio: true, });