小言_互联网的博客

零基础通过直播小程序组件实现电商带货

359人阅读  评论(0)

之前,我们已经介绍了即构小程序直播组件的功能、适用类目以及组件的集成方法,可以戳下面查看:

 

即构小程序组件功能及适用类目

即构小程序组件的集成指引

 

小程序直播功能可应用的场景非常广泛,例如秀场直播、在线直播课、电商直播卖货等。针对不同的场景需求,即构小程序直播组件提供了个性化的功能,例如针对电商直播场景,提供了音视频直播、商家后台管理、IM互动、商品列表推送、美颜、后台管理等功能。

 

下面我们来看,基于即构直播小程序组件,如何从零实现目前大热的电商直播功能。

 

一、初始化SDK

集成 SDK 后,若想使用 SDK 的功能,还需要对 SDK 进行初始化操作。


  
  1. // 声明变量
  2. let { ZegoExpressEngine } = require( "../lib/ZegoExpressMiniProgram-1.6.0");
  3. let zg;
  4. // 初始化实例
  5. zg = new ZegoExpressEngine( this. data.appID, this. data.server);
  6. // 配置必要参数
  7. zg.setLogConfig({
  8. logLevel: 'debug',
  9. remoteLogLevel: 'debug',
  10. logURL: this. data.logUrl
  11. })

如果要实现一个完整的直播功能,还需要处理 SDK 的相关回调。回调只要在 SDK 生命周期内设置一次即可。

 

二、登录房间

1、设置房间相关回调

登录房间之前需要设置房间相关回调,便于登录房间成功后接收房间相关的事件通知,比如处理因网络中断退出房间等问题。

以房间状态回调为例:


  
  1. zg. on( 'roomStateUpdate', (roomID, updateType, err) => {
  2. console.log( '>>>[liveroom-room] roomStateUpdate, updateType: ' + updateType + ', err: ' , err);
  3. })

房间状态 updateType 分为 'DISCONNECTED','CONNECTING' 和 'CONNECTED'。

DISCONNECTED:表示未连接状态,在登录房间前和退出房间后进入该状态。如果登录房间的过程出现稳态异常,例如 AppID 和 AppSign 不正确,或者有相同用户名在其他地方登录导致本端被 KickOut,都会进入该状态。

CONNECTING:表示正在请求连接状态,登录房间成功后会进入此状态,通常通过该状态进行应用界面的展示。如果因为网络质量不佳产生的连接中断,SDK 会进行内部重试,也会回到正在请求连接状态。

CONNECTED:表示连接成功状态,进入该状态表示已经登录房间成功,用户可以正常收到房间内的用户和流信息增删的回调通知。

其余回调接口请根据业务实际情况进行选择处理,完整的房间回调接口请戳这里查看~~~

 

2、登录获取Token

在开发阶段,ZEGO 提供了只用于测试环境获取 token 的接口,正式上线一定要由开发者的业务服务器实现 token 逻辑。登录 token 的获取详见:房间登录安全

调用示例:


  
  1. /* ZEGO 提供开发阶段获取 token 接口:https://wsliveroom-alpha.zego.im:8282/token,只能用于测试环境,正式环境一定要由客户业务服务器实现 token
  2. */
  3. // 获取登录 token
  4. getLoginToken: function () {
  5. var self = this;
  6. const requestTask = wx.request({
  7. url: 'xxxx', // 该接口由开发者后台自行实现,开发者的 token 从各自后台获取
  8. data: {
  9. app_id: self.data.appID,
  10. id_name: self.data.userID,
  11. },
  12. header: {
  13. 'content-type': 'text/plain'
  14. },
  15. success: function (res) {
  16. console.log( ">>>[liveroom-room] get login token success. token is: " + res.data);
  17. if (res.statusCode != 200) {
  18. return;
  19. }
  20. zg.setUserStateUpdate( true);
  21. self.loginRoom(res.data, self);
  22. },
  23. fail: function (e) {
  24. console.log( ">>>[liveroom-room] get login token fail, error is: ")
  25. console.log(e);
  26. }
  27. });
  28. },

  
  1. /**调用 `loginRoom` 登录房间
  2. **注意:需保证 `roomID` 信息的全局唯一,只支持长度不超过 128 字节 的数字,下划线,字母。
  3. 登录房间成功是后续所有操作的前提。小程序中演示源码片段如下,仅供参考:
  4. **/
  5. zg.loginRoom( this. data.roomID, token, { userID: this. data.userID, userName: this. data.userName })
  6. .then(result => {
  7. console.log(TAG_NAME, 'login room succeeded', result);
  8. }). catch(err => {
  9. console.error(TAG_NAME, 'login room fail', err);
  10. })

 

三、推流

直播过程中,主播要推送自己的本地画面,需要执行推流操作。

1、组件说明

微信小程序中的推流功能,需要使用 ZEGO "小程序直播插件”提供的 zego-pusher 标签。

调用示例:


  
  1. <zego-pusher
  2. id= "zg-pusher"
  3. url= " {{pusherInfo.url}} "
  4. class= "push-content"
  5. waitingImage= " {{waitingImage}} "
  6. enableCamera= " {{enableCamera}} "
  7. debug= " {{debug}} "
  8. autoFocus= " {{autoFocus}} "
  9. aspect= " {{aspect}} "
  10. minBitrate= " {{minBitrate}} "
  11. maxBitrate= " {{maxBitrate}} "
  12. zoom= " {{zoom}} "
  13. mode= " {{mode}} "
  14. muted= " {{muted}} "
  15. beauty= " {{beauty}} "
  16. whiteness= " {{whiteness}} "
  17. orientation= " {{orientation}} "
  18. bindstatechange= "onPushStateChange"
  19. bindnetstatus= "onPushNetStateChange">
  20. </zego-pusher>

2、开始推流

主播登录房间成功后,根据业务逻辑准备推流。使用 SDK 推流播放需要执行如下步骤:

1)触发推流。

2)调用 SDK 的 startPublishingStream 获取 streamID 对应的推流地址。

3)将步骤 2 中获取的推流地址设置为 zego-pusher 的 url。

4)获取推流组件实例,然后调用实例 的 start() 录制视频。

调用示例:

zgPusher = this.selectComponent("#zg-pusher");

  
  1. // 1/2. 主播登录房间成功后触发推流,调用 SDK 的 startPublishingStream 获取 streamID 对应的推流地址
  2. zg.loginRoom( this. data.roomID, token, { userID: this. data.userID, userName: this. data.userName })
  3. .then(result => {
  4. console.log(TAG_NAME, 'login room succeeded', result);
  5. zg.startPublishingStream( this. data.pusherInfo.streamID).then(({ streamID, url}) => {
  6. this. data.pusherInfo = {
  7. streamID,
  8. url
  9. }
  10. this.setData({
  11. pusherInfo: this. data.pusherInfo
  12. }, () => {
  13. zgPusher.start();
  14. })
  15. });
  16. }). catch(err => {
  17. console.error(TAG_NAME, 'login room fail', err);
  18. })

3、推流事件处理

微信小程序会在 zego-pusher 的 bindstatechange 绑定的方法中通知出推流状态事件,开发者需要执行如下操作:

1)在 bindstatechange 绑定的回调函数中,调用 SDK 提供的 updatePlayerState API 将推流事件透传给 SDK。

2)在 SDK 提供的 publisherStateUpdate 回调中处理推流的开始、失败状态。

调用示例:


  
  1. // zego-pusher 绑定推流事件
  2. onPushStateChange(e) {
  3. console.log(
  4. `${TAG_NAME} onPushStateChange `,
  5. e.detail.code ,
  6. e.detail.message
  7. );
  8. zg.updatePlayerState( this.data.pusherInfo.streamID, e);
  9. },
  10. // 推流后,服务器主动推过来的,流状态更新;主动停止推流没有回调,其他情况均回调
  11. zg.on( 'publisherStateUpdate', ({ streamID, state, errorCode }) => {
  12. console.warn(TAG_NAME, 'publisherStateUpdate', state, streamID, errorCode);
  13. this.setData({
  14. publishing: state === 'PUBLISHING' ? true : false,
  15. beginToPush: false
  16. })
  17. })

3)微信小程序会在 zego-pusher 的 bindnetstatus 绑定的方法中通知出推流网络事件,开发者也需要在对应的小程序回调中,调用 updatePlayerNetStatus 将推流事件透传给 SDK。

调用示例:


  
  1. // zego-pusher 绑定网络状态事件
  2. onPushNetStateChange(e) {
  3. console.log(
  4. `${TAG_NAME} onPushNetStateChange `,
  5. e.detail.code ,
  6. e.detail.message
  7. );
  8. zg.updatePlayerNetStatus( this.data.pusherInfo.streamID, e);
  9. },
  10. // SDK 获取推流网络质量
  11. zg.on( 'publishQualityUpdate', (streamID, publishStats) => {
  12. console.log( 'publishQualityUpdate', streamID, stats);
  13. });

4)停止推流

停止推流,开发者需要执行如下操作:

1)调用 SDK 提供的 stopPublishingStream(streamID) 清空推流状态。

2)调用 zego-pusher 实例提供的 stop() 停止推流。

注意:上述第 1 步为必选操作,否则可能导致 SDK 状态异常。

调用示例:


  
  1. // 停止推流
  2. zg.stopPublishingStream ( this. data.pushStreamID);
  3. zgPusher.stop();

 

四、拉流

直播过程中,如果直播间里的观众要看到主播的推流画面,就需要执行拉流操作。

1、组件说明

微信小程序中的拉流流功能,需要用到插件提供的 zego-player 标签。

调用示例:


  
  1. <zego-player
  2. id= "zg-player"
  3. sid= " {{playerInfo.streamID}} "
  4. url= " {{playerInfo.url}} "
  5. orientation= " {{orientation}} "
  6. objectFit= " {{objectFit}} "
  7. minCache= " {{minCache}} "
  8. maxCache= " {{maxCache}} "
  9. mode= " {{mode}} "
  10. muted= " {{muted}} "
  11. debug= " {{debug}} "
  12. pictureInPictureMode= " {{pictureInPictureMode}} "
  13. objectFit= " {{objectFit}} "
  14. class= "play-content"
  15. bindstatechange= "onPlayStateChange"
  16. bindnetstatus= "onPlayNetStateChange">
  17. </zego-player>

2、开始拉流

观众登录房间成功后,根据业务逻辑准备拉流。使用 SDK 拉流播放需要执行如下步骤:

1)触发拉流

2)调用 SDK 的 startPlayingStream 获取 streamID 对应的播放地址

3)将步骤 2 中获取的推流地址设置为 zego-player 的 url, 流ID设置为sid。

4)获取拉流组件实例,然后调用实例 的 play() 播放视频 或者设置拉流组件的 autoplay 属性为 true,实现自动拉流。

调用示例:


  
  1. // 通过 SDK 获取 streamID 对应的播放地址
  2. zg.startPlayingStream(streamList[ 0].streamID). then( ({ streamID, url }) => {
  3. console.warn(TAG_NAME, 'startPlayingStream', streamID, url);
  4. that.data.playerInfo.streamID = streamID;
  5. that.data.playerInfo.url = url;
  6. that.setData({
  7. playerInfo: that.data.playerInfo
  8. }, () => {
  9. console.error(that.data.playerInfo, zgPlayer)
  10. zgPlayer.play();
  11. })
  12. }). catch(err => {
  13. console.warn(TAG_NAME, 'startPlayingStream', err);
  14. });
zgPlayer = this.selectComponent("#zg-player");
zgPlayer.play();

3、拉流事件处理

微信小程序会在 zego-player 的 bindstatechange 绑定的方法中通知出拉流状态事件,开发者需要执行如下操作:

1)在 bindstatechange 绑定的回调函数中,调用 SDK 提供的 updatePlayerState API将推流事件透传给 SDK。

2)在 SDK 提供的 onPlayStateUpdate 回调中处理播推、拉流的开始、失败状态。

调用示例:


  
  1. // zego-player 绑定的拉流事件
  2. onPlayStateChange(e) {
  3. // 透传拉流事件给 SDK,type 0 拉流
  4. zg.updatePlayerState(e.detail.streamID, e);
  5. },
  6. // 服务端主动推过来的 流的播放状态, 视频播放状态通知;type: { start:0, stop:1};
  7. zg.onPlayStateUpdate = function (updatedType, streamID) {
  8. console.log( `${TAG_NAME} onPlayStateUpdate ${updatedType === 0 ? 'start ' : 'stop '} ${streamID}`);
  9. };

3)微信小程序会在 zego-player 的 bindnetstatus 绑定的方法中通知出拉流网络事件,开发者也需要在对应的小程序回调中,调用 updatePlayerNetStatus 将推流事件透传给 SDK。

调用示例:


  
  1. // zego-player 绑定网络状态事件
  2. onPlayNetStateChange(e) {
  3. console.log(
  4. `${TAG_NAME} onPlayNetStateChange `,
  5. e.detail.info
  6. );
  7. zg.updatePlayerNetStatus(e.detail.streamID, e);
  8. },
  9. // SDK 拉流网络质量回调
  10. zg.on( 'playQualityUpdate', (streamID, stats) => {
  11. console.log( `${TAG_NAME} playQualityUpdate ${streamID}`, stats);
  12. });

4、停止拉流

停止拉流,开发者需要执行如下操作:

1)调用 SDK 提供的 stopPlayingStream(streamid) 清空拉流状态。

2)调用 zego-player 提供的 stop() 停止推流。

注意:上述第 1 步为必选操作,否则可能导致 SDK 状态异常。

调用示例:


  
  1. // 停止拉流
  2. zg.stopPlayingStream( this. data.playInfo.streamID);
  3. zgPlayer.stop();

 

五、退出房间

调用如下 logoutRoom 退出房间。在退出房间前,请确保停止推拉流,并清理相关状态。

调用示例:


  
  1. // 停止拉流
  2. zg.stopPlayingStream( this. data.playInfo.streamID);
  3. zgPlayer.stop();

 

六、配置公众平台域名

ZEGO分配给开发者的 URL(包含 HTTPS、WSS 协议),需要在微信公众平台进行“合法域名”配置后,小程序才能正常访问。

微信后台配置地址:微信公众平台 -> 设置 -> 开发设置 -> 服务器域名

请开发者将 ZEGO 分配的请求域名,按照协议分类,填到指定的 request合法域名 或者 socket合法域名 中。例如:

 

通过以上步骤即可实现小程序直播功能,对于商品列表、后台管理等功能,可以在留言区或私信我开通,只需1周即可完成全部功能的配置。


转载:https://blog.csdn.net/zego_0616/article/details/112581304
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场