直播相关——腾讯直播SDK(一)

梳理了下项目中使用的腾讯直播SDK相关,为再接入一套声网RTC SDK做些准备工作。

1.sdk集成

dependencies {implementation 'com.tencent.liteav:LiteAVSDK_Professional:latest.release'
}

初始化与摄像头推流相关

初始化与摄像头推流相关

2.给 SDK 配置 License 授权

  1. 获取 License 授权: 获得相关 License 授权,需在 云直播控制台 获取 License URL 和 License Key。
  2. 在您的 App 调用 SDK 相关功能之前(建议在 Application 类中)进行如下设置:
    官方推荐如下:
public class MApplication extends Application {@Override
public void onCreate() {super.onCreate();String licenceURL = ""; // 获取到的 licence urlString licenceKey = ""; // 获取到的 licence keyV2TXLivePremier.setLicence(this, licenceURL, licenceKey);V2TXLivePremier.setObserver(new V2TXLivePremierObserver() {@Overridepublic void onLicenceLoaded(int result, String reason) {Log.i(TAG, "onLicenceLoaded: result:" + result + ", reason:" + reason);}});
}

而在开发中,我们选择在启动页SplashActivity中处理配置授权逻辑,以及相关初始化操作,这个设计到启动优化的相关思维。

val licenceURL =   "获取到的 licence url" // 
val licenceKey = "获取到的 licence key" // 
TXLiveBase.getInstance().setLicence(application, licenceURL, licenceKey)

3.初始化TXLivePusher,以及配置相关配置(垫片)

官方推荐如下:
创建一个 V2TXLivePusher 对象,该对象负责完成推流的主要工作。

// 指定对应的直播协议为 RTMP,该协议不支持连麦
V2TXLivePusher mLivePusher = new V2TXLivePusherImpl(this, V2TXLiveDef.V2TXLiveMode.TXLiveMode_RTMP);
// 指定对应的直播协议为 RTC,该协议支持连麦。如果在直播过程中有连麦需求,需要选择该协议
V2TXLivePusher mLivePusher = new V2TXLivePusherImpl(this, V2TXLiveDef.V2TXLiveMode.TXLiveMode_RTC);

ps:如果您有连麦需求,需要创建V2TXLivePusher对象时选择RTC协议。RTC协议与RTMP协议在 API 使用上没有区别。
而在开发中,依旧是在启动页SplashActivity中处理配置授权逻辑,以及相关初始化操作。

通过 TXLivePushConfig 中的setPauseImg接口可以设置垫片用的背景图片、垫片的最大时长以及视频帧率。
通过 TXLivePushConfig 中的setPauseFlag接口可以设置是暂停视频采集、还是暂停声音采集,还是两者都暂停

TXLivePushConfig mLivePushConfig  = new TXLivePushConfig();         
TXLivePusher mLivePusher = new TXLivePusher(this);  // bitmap: 用于指定垫片图片,最大尺寸不能超过 1920*1920  
// time:垫片最长持续时间,单位是秒,300即代表最长持续300秒    
// fps:垫片帧率,最小值为 5fps,最大值为 20fps。   
Bitmap bitmap = decodeResource(getResources(), R.drawable.pause_publish);   
mLivePushConfig.setPauseImg(bitmap);    
mLivePushConfig.setPauseImg(300, 5);    
//表示仅暂停视频采集,不暂停音频采集 
//mLivePushConfig.setPauseFlag(PAUSE_FLAG_PAUSE_VIDEO); 
//表示同时暂停视频和音频采集 
mLivePushConfig.setPauseFlag(PAUSE_FLAG_PAUSE_VIDEO|PAUSE_FLAG_PAUSE_AUDIO);    
mLivePusher.setConfig(mLivePushConfig);     

设置完成之后,就可以调用 TXLivePusher 中的pausePusher进入隐私模式,也可以调用resumePusher退出隐私模式,
但请注意保持正确的调用顺序:startPush=> ( pausePush => resumePush ) => stopPush,错误的调用顺序会导致 SDK 表现异常,
因此使用成员变量对执行顺序进行保护是很有必要的。

// 进入隐私模式   
mLivePusher.pausePusher();  
... 
// 退出隐私模式   
mLivePusher.resumePusher(); 

项目中:

object BaobanAppLifecycle : AppLifecycleManager() {lateinit var mLivePausePusher: TXLivePusherval mLivePushConfigget() = TXLivePushConfig().also {// bitmap: 用于指定垫片图片,最大尺寸不能超过 1920*1920// time:垫片最长持续时间,单位是秒,300即代表最长持续300秒// fps:垫片帧率,最小值为 5fps,最大值为 20fps。val bitmap = BitmapFactory.decodeResource(DangkouApplication.app.resources,R.mipmap.ic_live_pause_img)it.setPauseImg(bitmap)it.setPauseImg(30 * 60, 5)it.setPauseFlag(TXLiveConstants.PAUSE_FLAG_PAUSE_AUDIO or TXLiveConstants.PAUSE_FLAG_PAUSE_VIDEO)}
}
//SplashActivity
BaobanAppLifecycle.mLivePausePusher = TXLivePusher(application).also { it.config = BaobanAppLifecycle.mLivePushConfig }

4.开启摄像头预览

想要开启摄像头的预览画面,您需要先给 SDK 提供一个用于显示视频画面的TXCloudVideoView对象
1.在 xml 文件中添加一个视频渲染控件:

<com.tencent.rtmp.ui.TXCloudVideoViewandroid:id="@+id/pusher_tx_cloud_view"android:layout_width="match_parent"android:layout_height="match_parent" />

2.通过调用 V2TXLivePusher 中的startCamera接口开启当前手机摄像头的预览画面

//启动本地摄像头预览    TXCloudVideoView mPusherView = (TXCloudVideoView) findViewById(R.id.pusher_tx_cloud_view); mLivePusher.startCameraPreview(mPusherView);

需要注意,这里需要检查下权限。需要申请相机、存储、通话、音频权限。开启之后再调用摄像头预览。

5. 启动和结束推流

如果已经启动了摄像头预览,就可以调用 TXLivePusher 中的startPusher接口开始推流。

int ret = mLivePusher.startPusher("rtmpurl 推流地址".trim());  
if (ret == -5) {    Log.i(TAG, "startRTMPPush: license 校验失败");  
}       

推流结束后,可以调用 TXLivePusher 中的stopPusher接口结束推流。请注意,如果已经启动了摄像头预览,请在结束推流时将其关闭,否则会导致 SDK 的表现异常。

mLivePusher.stopPusher();   
mLivePusher.stopCameraPreview(true); //如果已经启动了摄像头预览,请在结束推流时将其关闭。    

项目开发中,需要留意,在onDestroy中,执行这些方法。

 private fun stopLive() {mPresenter.removeImMsgListener()mLivePusher.stopPusher()testSpeedThreadPool.shutdown()video_view.onDestroy()video_view.stop(true)mLivePusher.stopCameraPreview(true) livePlayer.stopPlay(true)

6.设定画面清晰度

可以设定观众端的画面清晰度:
标清:VIDEO_QUALITY_STANDARD_DEFINITION
高清:VIDEO_QUALITY_HIGH_DEFINITION
超清:VIDEO_QUALITY_SUPER_DEFINITION

mLivePusher.setVideoQuality(TXLiveConstants.VIDEO_QUALITY_STANDARD_DEFINITION,true,false
)

7.美颜美白和红润特效

调用 TXLivePush 中的setBeautyFilter接口可以设置美颜效果,SDK 中提供了三种磨皮算法(style)
TXLiveConstants.BEAUTY_STYLE_SMOOTH :光滑风格,算法更加注重皮肤的光滑程度,适合秀场直播类场景下使用。

TXLiveConstants.BEAUTY_STYLE_NATURE :自然风格,算法更加注重保留皮肤细节,适合对真实性要求更高的主播。

TXLiveConstants.BEAUTY_STYLE_HAZY :朦胧风格,算法会更加侧重画面去噪,使整体画面风格偏柔和。

 //style             美颜算法:  0:光滑  1:自然  2:朦胧    //beautyLevel       磨皮等级: 取值为 0-9.取值为 0 时代表关闭美颜效果.默认值: 0,即关闭美颜效果.  //whiteningLevel    美白等级: 取值为 0-9.取值为 0 时代表关闭美白效果.默认值: 0,即关闭美白效果.  //ruddyLevel        红润等级: 取值为 0-9.取值为 0 时代表关闭美白效果.默认值: 0,即关闭美白效果.  // public boolean setBeautyFilter(int style, int beautyLevel, int whiteningLevel, int ruddyLevel);    
mLivePusher.setBeautyFilter(1, meiYanLevel, meiBaiLevel, meiBaiLevel)

8.控制摄像头

TXLivePusher 提供了一组 API 用户控制摄像头的行为:

切换前后摄像头: switchCamera

打开或关闭闪光灯(仅在当前是后置摄像头时有效):turnOnFlashLight

调整摄像头的焦距(可以通过 TXLivePusher 的getMaxZoom()函数获取最大焦距,setZoom的取值范围即为 1 - 最大焦距。):setZoom

9.主播端弱网提醒

TXLivePushListener 里的 onPlayEvent 可以捕获 PUSH_WARNING_NET_BUSY 事件,它代表当前主播的网络已经非常糟糕,出现此事件即代表观众端会出现卡顿。
此时就可以像上图一样在 UI 上弹出一个“弱网提示”。

@Override   public void onPushEvent(int event, Bundle param) {  if (event == TXLiveConstants.PUSH_ERR_NET_DISCONNECT    || event == TXLiveConstants.PUSH_ERR_INVALID_ADDRESS    || event == TXLiveConstants.PUSH_ERR_OPEN_CAMERA_FAIL   || event == TXLiveConstants.PUSH_ERR_OPEN_MIC_FAIL) {   // 遇到以上错误,则停止推流 //...   } else if (event == TXLiveConstants.PUSH_WARNING_NET_BUSY) {    //您当前的网络环境不佳,请尽快更换网络保证正常直播  showNetBusyTips();  }   }   

可以这么处理:

livePlayer.setPlayListener(object : ITXLivePlayListener {override fun onPlayEvent(p0: Int, p1: Bundle?) {}override fun onNetStatus(bundle: Bundle?) {bundle?.also {setNetSpeed(it.getInt(NET_STATUS_NET_SPEED) / 1000f)}}})mLivePusher.setPushListener(object : ITXLivePushListener {override fun onNetStatus(bundle: Bundle?) {bundle?.also {setNetSpeed(it.getInt(NET_STATUS_NET_SPEED) / 1000f)}}override fun onPushEvent(code: Int, bundle: Bundle) {}})

TXLivePlayer

视频播放器

请参见 TXLivePlayer。TXLivePlayer
主要负责将直播流的音视频画面进行解码和本地渲染,包含如下技术特点:
针对腾讯云的拉流地址,可使用低延时拉流,实现直播连麦等相关场景。
针对腾讯云的拉流地址,可使用直播时移功能,能够实现直播观看与时移观看的无缝切换。
支持自定义的音视频数据处理,让您可以根据项目需要处理直播流中的音视频数据后,进行渲染以及播放。

TXLivePusher

直播推流类

请参见 TXLivePusher。TXLivePusher
主要负责将本地的音视频画面进行编码和 RTMP 推送,包含如下技术特点:
针对腾讯云的推流地址,会采用 QUIC 协议进行加速,配合改进后的 BBR2 带宽测算方案,可以最大限度的利用主播的上行带宽,降低直播卡顿率。
内嵌套的 Qos 流量控制技术具备上行网络自适应能力,可以根据主播端网络的具体情况实时调节音视频数据量。
内嵌多套美颜磨皮算法(自然&光滑)和多款色彩空间滤镜(支持自定义滤镜),可以根据需要自行选择。
商业版包含了基于优图 AI 识别技术的大眼、瘦脸、隆鼻以及动效挂架,只需要购买优图 License 就可以零成本集成。
支持自定义的音视频采集和渲染,让您可以根据项目需要选择自己的音视频数据源。

主要的、常用的直播推流api与流程已梳理完毕。
完整的api可以看 API文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/665047.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

寒假刷代码随想录

数组 二分 在循环中 始终坚持根据查找区间的定义来做边界处理。 第一种写法&#xff0c;我们定义 target 是在一个在左闭右闭的区间里&#xff0c;也就是[left, right] &#xff08;这个很重要非常重要&#xff09;。 区间的定义这就决定了二分法的代码应该如何写&#xff0…

JMeter HTTP请求的详细指南,还不知道的快来看

HTTP请求简介 在JMeter中&#xff0c;服务器名称和它的路径对于检查请求是否到达了正确的目的地非常重要。默认情况下&#xff0c;HTTP协议与请求一起被遵循&#xff0c;如果需要&#xff0c;可以转换为HTTPS。如果需要&#xff0c;用户参数可以包含在特定页面的请求中。如果&a…

MySQL查询缓存

MySQL查询缓存 MySQL在查询的时候首先会查询缓存&#xff0c;如果缓存命中的话就直接返回结果&#xff0c;不需要解析sql语句&#xff0c;也不会生成执行计划&#xff0c;更不会执行&#xff1b;如果没有命中缓存&#xff0c;则再进行SQL解析以及进行查询&#xff0c;并将结果返…

机器学习系列-2 线性回归训练损失

机器学习系列-2 线性回归&训练损失 学习内容来自&#xff1a;谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1 线性回归&#xff1a; 举例&#xff1a;蝉&#xff08;昆虫物种&…

安装配置sqoop

一、了解Sqoop 1、Sqoop产生的原因 A. 多数使用hadoop技术的处理大数据业务的企业,有大量的数据存储在关系型数据中。 B. 由于没有工具支持,对hadoop和关系型数据库之间数据传输是一个很困难的事。 以上是sqoop产生的主要原因,也因此Sqoop主要用于hadoop与关系型数据库之…

java下载网络文件

/*** 下载文件** param urlStr* param response* throws Exception*/ GetMapping("/downLoadFile") public void downLoadFile(String urlStr, HttpServletResponse response) throws Exception{// 定义一个URL对象&#xff0c;就是你想下载的图片的URL地址URL url …

【C++】类和对象2:this指针

前言 今天来学习this指针 引入 我们用一个日期Date类来举个例子 class Date { public:void Init(int year, int month, int day){_year year;_month month;_day day;}void Print(){cout <<_year<< "-" <<_month << "-"<…

深度学习:数据驱动的人工智能革命

文章目录 每日一句正能量前言什么是深度学习推动AI发展不同阶段的“三大驱动 ”1、技术驱动&#xff1a;算法和计算力是主要驱动力2、计算力的三驾马车&#xff1a;芯片、超级计算机、云计算3、数据驱动&#xff1a;描绘个性化画像&#xff1b; 后记 每日一句正能量 一般青年的…

自然语言处理(02/10):自然语言处理任务和应用程序

一、描述 在广阔的人工智能领域&#xff0c;自然语言处理 &#xff08;NLP&#xff09; 是一个迷人而充满活力的领域。NLP 弥合了计算机和人类语言之间的鸿沟&#xff0c;使机器能够理解、解释和生成类似人类的文本。这项变革性技术具有深远的影响&#xff0c;影响着我们日常生…

telnet笔记

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、场景二、介绍1.测试端口2.访问百度3. 简单的爬虫 前言 最近telnet命令用的比较多&#xff0c;所以记录一下。 一、场景 ping应该是大家最常用的命令&…

深入理解Istio服务网格数据平面Envoy

一、服务网格概述(service mesh) 在传统的微服务架构中&#xff0c;服务间的调用&#xff0c;业务代码需要考虑认证、熔断、服务发现等非业务能力&#xff0c;在某种程度上&#xff0c;表现出了一定的耦合性 服务网格追求高级别的服务流量治理能力&#xff0c;认证、熔断、服…

macOS的设置与常用软件(含IntelliJ IDEA 2023.3.2 Ultimate安装,SIP的关闭与开启)

目录 1 系统设置1.1 触控板1.2 键盘 2 软件篇2.1 [科学上网](https://justmysocks5.net/members/)2.1 [安装Chrome浏览器](https://www.google.cn/chrome/index.html)2.2 [安装utools](https://www.u.tools)2.3 [安装搜狗输入法](https://shurufa.sogou.com/)2.4 [安装snipaste…

一、Redis之NoSQL

1.1 什么是NoSQL NoSQL&#xff08;Not Only SQL&#xff09;即不仅仅是SQL&#xff0c;泛指非关系型的数据库&#xff0c;它可以作为关系型数据库的良好补充。随着互联网web2.0网站的兴起&#xff0c;非关系型的数据库现在成了一个极其热门的新领域&#xff0c;非关系数据库产…

微服务架构中的关键组件:Dubbo、Nacos、Feign 和 Eureka

在构建微服务架构时&#xff0c;服务发现、配置管理和服务调用是不可或缺的组成部分。本文将详细介绍三个在这些领域中广泛使用的开源项目&#xff1a;Dubbo、Nacos 和 Eureka&#xff0c;它们各自的特点、区别以及适用的场景。 Dubbo Dubbo 是一个由阿里巴巴开源的高性能、轻…

【Git】03 图形化工具

文章目录 一、右击菜单二、打开仓库三、可视化所有分支历史四、总结 一、右击菜单 二、打开仓库 三、可视化所有分支历史 四、总结 图形化工具了解一下&#xff0c;要懂得在哪里能找到。

Vue工程引入Element-ui

npm 安装ELement-ui npm i element-ui -S 于package.json中发现有“element-ui”版本号即可 引入 Element 在 main.js 中写入以下内容&#xff1a; import element-ui/lib/theme-chalk/index.css; import ElementUI from element-ui;Vue.use(ElementUI);之后根据自己的需求设计…

数据库指定某个列的某个值优先排序

有时候接到这么一个需求&#xff0c;就是指定某个商品某个品牌优先展示&#xff0c;那么数据库SQL该怎么实现呢&#xff1f; 比如商品表&#xff08;goods&#xff09;&#xff0c;有个品牌字段&#xff08;brand&#xff09;&#xff0c;公司要求优先展示【华为】品牌的商品&…

代码随想录二刷——栈与队列day11

文章目录 前言栈与队列知识点 一、 20. 有效的括号二、1047. 删除字符串中的所有相邻重复项三、150. 逆波兰表达式求值总结 前言 一个本硕双非的小菜鸡&#xff0c;备战24年秋招&#xff0c;计划二刷完卡子哥的刷题计划&#xff0c;加油&#xff01; 二刷决定精刷了&#xff0…

质量管理 了解

定义 质量管理就是在一定的技术经济条件下&#xff0c;为保证和提高产品质量所进行的一系列经营管理活动的总称。该管理活动包括质量管理体系的制定&#xff0c;质量的控制&#xff0c;质量的验收与评定等相关内容。 国际标准和国家标准的定义&#xff1a;质量管理是“在质量方…

位运算之妙用:识别独特数字(寻找单身狗)

目录 找单身狗1 图解&#xff1a; 代码如下&#xff1a; 找单身狗2 图解&#xff1a; 代码如下&#xff1a; 寻找单身狗1 从数组中 的1 2 3 4 5 1 2 3 4 中找出没有另一个相同的数与其匹配的数 这个问题的原理是利用异或运算的性质。异或运算&#xff08;XOR&#xff09…