腾讯云直播

腾讯云直播

腾讯云有个简陋的 demo,将 demo 集成,UI 然后根据里面的代码自定义,例如“正在使用流量观看,约使用 xx m”功能、例如切换清晰度(切换横屏时又是大弹窗)等,这些控制器就是盖子视频 view 上

unknown_filename.7

推流域名

指用于推送直播流的域名,必选配置,该域名必须在使用直播服务前完成注册并备案
unknown_filename.8

播放域名
unknown_filename.9
unknown_filename.10

1
2
String flvUrl = "http://2157.liveplay.myqcloud.com/live/2157_xxxx.flv";
mLivePlayer.startPlay(flvUrl);

横竖屏切换

换不用的 view

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
      <com.tencent.liteav.demo.play.controller.TCControllerWindow
android:android:layout_width="match_parent"
android:layout_height="match_parent" />

<com.tencent.liteav.demo.play.controller.TCControllerFullScreen
android:android:layout_width="match_parent"
android:layout_height="match_parent" />

private void rotateScreenOrientation(int orientation) {
switch (orientation) {
case SuperPlayerConst.ORIENTATION_LANDSCAPE:
((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE);
break;
case SuperPlayerConst.ORIENTATION_PORTRAIT:
((Activity) mContext).setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
break;
}

Message message = new Message();
message.what = 1001;
message.arg1 = mScreenchange;
mUIHandler.sendMessageDelayed(message, 3000);

}



if (mCurrentPlayMode == SuperPlayerConst.PLAYMODE_WINDOW) {
mLayoutParamWindowMode = getLayoutParams();
}
try {
// 依据上层Parent的LayoutParam类型来实例化一个新的fullscreen模式下的LayoutParam
Class parentLayoutParamClazz = getLayoutParams().getClass();
Constructor constructor = parentLayoutParamClazz.getDeclaredConstructor(int.class, int.class);
mLayoutParamFullScreenMode = (ViewGroup.LayoutParams) constructor.newInstance(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

//请求全屏模式
if (mCurrentPlayMode == SuperPlayerConst.PLAYMODE_FULLSCREEN) {
addView(mControllerFullScreen);
mControllerFullScreen.hide();
setLayoutParams(mLayoutParamFullScreenMode);
fullScreen(true); //隐藏虚拟按键,并且全屏
}
// 请求窗口模式
else if (mCurrentPlayMode == SuperPlayerConst.PLAYMODE_WINDOW) {

if (mLayoutParamWindowMode == null)
return;
addView(mControllerWindow);
mControllerWindow.hide();
setLayoutParams(mLayoutParamWindowMode);
fullScreen(false);
}
} catch (Exception e) {
e.printStackTrace();
}

其他

注意

  • 使用云直播服务,至少需要2个域名,一个作为推流域名,一个作为播放域名,推流和播放不能使用相同的域名,备案的域名。添加成功后,系统会为您自动分配一个 CNAME 域名,但 CNAME 域名不能直接访问,您需要在域名服务提供商处完成 CNAME 配置,配置生效后,即可享受云直播服务。

  • 增值计费项为直播转码、直播录制、直播截图、直播鉴黄和移动直播连麦费用,这五项为标准直播的增值功能,您可以按需使用,根据您的实际使用情况进行付费。

  • 播放地址StreamName 要与推流地址 StreamName 一致才能播放对应的流。
    unknown_filename.3

unknown_filename.6
云点播录制

CNAME

即别名记录。这种记录允许您将多个名字映射到另外一个域名。从一个域名到另一个域名
简单来说,A记录就是把一个域名解析到一个IP地址,而CNAME记录就是把域名解析到另外一个域名。比如 www.baidu.com ,这个二级域名解析到的是一个服务器的IP地址,比如8.8.8.8,而CNAME是将新域名,比如:a.www.baidu.com解析到另外一个域名 ,比如: www.baidu.com

CNAME在CDN中的应用
子域名
unknown_filename.4
unknown_filename.5

直播转码功能(包含视频转码和音频转码)
指将直播现场推送出来的原始流,在云端转换为不同编码格式、不同分辨率、不同码率的转码流推送给观众,以满足不同网络环境、不同终端设备等各种场景下的播放需求。
将原始视频流中打上官方自定义水印

demo图

https://github.com/tencentyun/MLVBSDK/tree/master/Android/Demo

推流失败问题排查
创建房间失败[获取推流地址失败]

https://cloud.tencent.com/document/product/267/7972

在所有检查开始之前,您务必要先检查一下地址是否正确,因为这里出错概率最高,腾讯云的直播地址分推流地址和播放地址两种,我们要首先排除误拿推流地址来播放的错误。

创建直播间失败的原因

需要绑定已备案域名才能进行播放。现在没有配置所以接口在获取推拉流地址时返回失败。绑定域名可以进入 https://console.cloud.tencent.com/live/domainmanage 进操作
①、没有购买连麦套餐;②、没有域名备案

获取直播推流地址向后台请求用于直播推流用的推流地址
接口名:get_anchor_url

“小直播”需要搭建自己的后台,开通对象存储服务(COS)对象存储服务主要用于小直播 App 中的直播封面图片和个人头像存储。

https://cloud.tencent.com/document/product/454/15187

unknown_filename.1

码率、分辨率自适应
设置场景化配置后,SDK 内部会根据场景自动选择相关的配置参数,所以我们这里把内部的config获取出来,赋值到外部。

TRTC SDK 实现一个既支持视频连麦,又支持上万人高并发观看的在线直播功能

常见的直播协议

目前常见的直播协议有三种:RTMP、 FLV 和 HLS。

  • RTMP:RTMP 协议比较全能,既可以用来推送又可以用来直播,其核心理念是将大块的视频帧和音频帧拆分,然后以小数据包的形式在互联网上进行传输,而且支持加密,因此隐私性相对比较理想,但拆包组包的过程比较复杂,所以在海量并发时也容易出现一些不可预期的稳定性问题。
  • FLV:FLV 协议由 Adobe 公司主推,格式极其简单,只是在大块的视频帧和音视频头部加入一些标记头信息,由于这种简洁,在延迟表现和大规模并发方面都很成熟,唯一的不足就是在手机浏览器上的支持非常有限,但是用作手机端 App 直播协议却异常合适。
  • HLS:苹果推出的解决方案,将视频分成5秒 - 10秒的视频小分片,然后用 m3u8 索引表进行管理,由于客户端下载到的视频都是5秒 - 10秒的完整数据,故视频的流畅性很好,但也同样引入了很大的延迟(HLS 的一般延迟在10秒 - 30秒左右)。相比于 FLV, HLS 在 iPhone 和大部分 Android 手机浏览器上的支持非常给力,所以常用于 QQ 和微信朋友圈的 URL 分享。

unknown_filename.2

原始流与推流码率分辨率一致。
高清流建议使用码率:2000kbps,分辨率:1080p。
标清流建议使用码率:1000kbps,分辨率:720p。

txTime 是否过期?
有些客户担心自己的直播流量被人盗用,会将 txTime 设置得过于保守,例如从当前时间开始往后推5分钟。其实由于有 txSercet 签名的存在,txTime 的有效期不用设置得太短。相反,如果有效期设置得太短,当主播在直播过程中遭遇网络闪断时会因为推流 URL 过期而无法恢复推流。
txTime 建议设置为当前时间往后推12或者24小时为宜,也就是要长于一场普通直播的直播时间

连麦互动

https://cloud.tencent.com/document/product/454/14606
Step3. 购买连麦套餐包由于连麦功能会使用到高速专线来降低音视频传输延迟,这部分功能需要额外购买套餐包才能开通,否则移动直播的各端 SDK 只能使用云直播的普通服务(推流和拉流),并不能开启连麦功能。

由于连麦功能会使用到高速专线来降低音视频传输延迟,这部分功能需要额外购买套餐包才能开通,否则移动直播的各端 SDK 只能使用云直播的普通服务(推流和拉流),并不能开启连麦功能。
unknown_filename
MLVBLiveRoom:基于腾讯云直播(LVB)、云点播(VOD) 和即时通信(IM)三大 PAAS 服务组合而成

常用类

TXLivePusher 接口提供摄像头推流能力
TXLivePlayer 模块负责实现直播播放功能

硬件加速
硬件加速在1080p解码场景下效果显著,但细节之处并不如想象的那么美好:
(1) 只有 4.3 以上android系统才支持
(2) 兼容性我们目前还仅过了小米华为等常见机型,故这里的返回值您先不要太当真

缓存策略
自动、极速、流畅。
极速模式:时延会尽可能低、但抗网络抖动效果不佳;
流畅模式:时延较高、抗抖动能力较强

权限检测相关

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
private boolean checkPublishPermission() {
if (Build.VERSION.SDK_INT >= 23) {
List<String> permissions = new ArrayList<>();
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
permissions.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
}
if (PackageManager.PERMISSION_GRANTED != ActivityCompat.checkSelfPermission(this, Manifest.permission.CAMERA)) {
permissions.add(Manifest.permission.CAMERA);
}
if (permissions.size() != 0) {
ActivityCompat.requestPermissions(this,
permissions.toArray(new String[0]),
100);
return false;
}
}
return true;
}

硬件加速变更不需要重启推流,直接应用配置项即可

利用 QRCode 生成 Bitmap的工具函数
createQRCodeBitmap(String content, int widthPix, int heightPix)

保存并分享图片
saveAndSharePic


腾讯云直播
http://peiniwan.github.io/2024/04/f7f326192dff.html
作者
六月的雨
发布于
2024年4月6日
许可协议