移动直播(Mobile Live Video Broadcasting,MLVB)SDK 是云直播服务(LVB)在移动场景的延伸。相比于主要面向云对接的直播(LVB) 服务,移动直播既提供了基于 TXLiteAVSDK 的“快速集成方案”,也提供了云直播(LVB)、云点播(VOD)和即时通信(IM)等云端服务的“一体化解决方案”。
快速入门:https://cloud.tencent.com/document/product/454/7876
官方Demo体验:https://cloud.tencent.com/document/product/454/6555
官方Demo及SDK下载:https://cloud.tencent.com/document/product/454/7873
版本历史:https://cloud.tencent.com/document/product/454/7878
Android:SDK 默认会将 log 写到 /sdcard/Android/data/应用包名/files/log/tencent/liteav/ 下
iOS:SDK 默认会将 log 写到当前 App 的 Documents/logs 文件夹下,后缀为.xlog。
参考:https://cloud.tencent.com/developer/article/1502366?from=10680
TXLiteAVSDK 在6.9版本对Android 10做了兼容支持,若之前的版本在 Android Studio 中将工程编译脚本 build.gradle 配置参数 targetSdkVersion 设定为 28 或以下就可以在android 10.0的机器上运行。(29 为 Android 10)。
一般容易遇到undefined symbols、duplicate symbol、bcm.o和rsa.o等错误。参考:https://cloud.tencent.com/developer/article/1499960
新版本音频做了优化,需要添加openAL依赖库,软3A的处理依赖于这个库,参考:https://cloud.tencent.com/developer/ask/228567/answer/347719
SDK3.9之后的版本需要xcode9.0的版本去编译,3.7版本及之前的是可以用xcode8,因为3.9 SDK是用xcode9构建的。
参考:https://cloud.tencent.com/developer/article/1420952
产品 | 功能 | 功能特性 | Android | iOS |
---|---|---|---|---|
移动直播 | 推流 | |||
RTMP 协议推流 | ✔ | ✔ | ||
H.264 和 AAC 编码 | ✔ | ✔ | ||
实现主播端的屏幕推流功能(游戏直播) | ✔ | ✔ | ||
后台摄像头推流 | ✔ | ✔ | ||
后台垫片推流 | ✔ | ✔ | ||
纯音频推流 | ✔ | ✔ | ||
静音推流 | ✔ | ✔ | ||
本地预览镜像(主播) | ✔ | ✔ | ||
视频编码镜像(观众) | ✔ | ✔ | ||
硬件编码 | ✔ | ✔ | ||
自动调整码率 | ✔ | ✔ | ||
自动调整分辨率 | ✔ | ✔ | ||
自定义推 YUV、PCM 数据 | ✔ | ✔ | ||
视频(TextureId)和音频(PCM)数据回调 | ✔ | ✔ | ||
推流质量监控(事件回调) | ✔ | ✔ | ||
推流断流重连机制(支持自主配置) | ✔ | ✔ | ||
推流会就近选择服务器(针对腾讯云) | ✔ | ✔ | ||
背景混音 | ✔ | ✔ | ||
前后摄像头动态切换 | ✔ | ✔ | ||
摄像头缩放操作(Zoom) | ✔ | ✔ | ||
闪光灯 | ✔ | ✔ | ||
自动/手动对焦 | ✔ | ✔ | ||
基础美颜(磨皮、美白、红润) | ✔ | ✔ | ||
高级美颜(设置大眼、瘦脸、V脸、下巴调整、短脸、小鼻效果) | ✔ | ✔ | ||
动效贴纸(添加变形、覆盖贴纸挂件等效果) | ✔ | ✔ | ||
清新、唯美、怀旧、日系等滤镜 | ✔ | ✔ | ||
截流录制(推流过程中本地录制出视频) | ✔ | ✔ | ||
视频截图 | ✔ | ✔ | ||
添加静态水印 | ✔ | ✔ | ||
视频流中添加文本信息(如歌词进度) | ✔ | ✔ | ||
视频流中插入时间戳(直播答题方案能力支持) | ✔ | ✔ | ||
支持 BitCode(iOS提供的体积优化方案) | ✖ | ✔ | ||
直播 | ||||
支持 HTTP-FLV、RTMP、HLS 协议的流媒体播放 | ✔ | ✔ | ||
支持 HTTPS-FLV、HTTPS-HLS 的播放 | ✔ | ✔ | ||
播放没有域名限制(支持播放其他云产商的流) | ✔ | ✔ | ||
硬件解码 | ✔ | ✔ | ||
播放器秒开 | ✔ | ✔ | ||
静音播放 | ✔ | ✔ | ||
画面预览模式调整(调整填充模式、渲染角度) | ✔ | ✔ | ||
播放器延时调节 | ✔ | ✔ | ||
视频(YUV)和音频(PCM)数据回调 | ✔ | ✔ | ||
自定义渲染视频数据 | ✔ | ✔ | ||
截流录制(观众截取直播的流到文件中) | ✔ | ✔ | ||
屏幕截图 | ✔ | ✔ | ||
清晰度无缝切换 | ✔ | ✔ | ||
直播回看(腾讯云特有) | ✔ | ✔ | ||
拉流质量监控(事件回调) | ✔ | ✔ | ||
拉流断流重连机制(支持自主配置) | ✔ | ✔ | ||
点播 | ||||
支持 FLV、MP4、HLS、本地视频文件播放 | ✔ | ✔ | ||
支持 HTTPS 的点播地址播放 | ✔ | ✔ | ||
硬件解码 | ✔ | ✔ | ||
画面预览模式调整(调整填充模式、渲染角度) | ✔ | ✔ | ||
静音播放 | ✔ | ✔ | ||
变速播放 | ✔ | ✔ | ||
循环播放 | ✔ | ✔ | ||
本地缓存 | ✔ | ✔ | ||
预加载 | ✔ | ✔ | ||
贴片广告 | ✔ | ✔ | ||
播放加密文件 | ✔ | ✔ | ||
多码率切换(腾讯云特有) | ✔ | ✔ | ||
离线下载视频 | ✔ | ✔ | ||
视频截图 | ✔ | ✔ | ||
点播质量监控(事件回调) | ✔ | ✔ |
在AppDelegate里面调用下面接口:
TXLiveBase sharedInstance.delegate = nil;
TXLiveBase setConsoleEnabled:NO;
问题描述:编译SDK报duplicate symbols错误,冲突的符合为bcm.o和rsa.o
解决方案:
Xcode 工程配置 other linker flags 需要设置 -ObjC,Dead Code Stripping 设置成YES。
一般是推流还没有成功就去拉流就会报该错误,请保证推流成功后再去拉流。注意推流端能看到预览画面并不一定代表推流就成功了,可以在控制台查询流状态或者换腾讯云提供的测试Demo推流。
6.5版本的LiteAVSDK,设置移动直播 Licence 必须用 TXLiveBase,设置短视频 Licence 必须用 TXUGCBase,如果弄混了会出现校验失败.
[TXLiveBase setLicenceURL:@"http://license.vod2.myqcloud.com/license/v1/df2203aa377aad6f1e48912abc264e4a1/TXLiveSDK.licence" key:@"61736d7c5fb27e24480d5a1af99871"];
[TXUGCBase setLicenceURL:@"http://license.vod2.myqcloud.com/license/v1/df2203aa377aad6f1e48912abc264e4a1/TXUgcSDK.licence" key:@"61736d7c5fb27e24480d5a1af99871"];
水印只能在观众端看到,在主播端看不到的。
水印的添加方式有两种:
注意 不推荐控制台上传水印,会额外引入播放延迟。
iOS端在 Controller 里面调用 UIApplication setIdleTimerDisabled:用于控制自动锁屏,SDK内部并无修改系统锁屏的逻辑
如果使用的精简版SDK,并且测试的机型为 iOS 8版本的系统,那么有可能遇到这个问题。
原因是ios 8版本的系统对硬编码支持的不是很好,因此我们SDK内部做了保护措施是当硬编码失败会切换成软编码,但是精简版为了减小体积所以不支持软编码的方式。解决方案是换成专业版SDK,使用软编码。
SDK 默认是不支持采集音频过程中切换 mic 的,如果需要切换 mic,可以使用自定义采集音视频数据,可以在业务层自行实现。
SDK 对于 32000Hz 的音频数据是支持降噪的,现在 SDK 都是 48000Hz 采样率的了,基于采集效果提升的考虑,将降噪接口去掉了。
噪音太大通常原因是采集端和播放端距离过近造成的声音循环采集,可以将两台设备离远一些(3m 以上),或是更换几个不同手机直播,不同手机在音频采集上的处理不同。
目前 iOS 端不支持,Android 端支持在编码中增加 B 帧。如需要开启,可以将 enableVideoHardEncoderMainProfile()
设置为 True。
// 设置硬件编码支持MainProfile(增加 B 帧)
mLivePushConfig.enableVideoHardEncoderMainProfile(True);
mLivePusher.setConfig(mLivePushConfig);
引入 B 帧的好处是让画质更佳,但也是增加延时。因为增加 B 帧会导致每个 GOP 中每帧画面的 PTS 和 DTS 不对齐,从而增加编码和解码耗时。
动态切换纯音频推流会出现主播端画面闪屏?播放端卡在最后一帧?动态切换纯音频和音视频,会出现短暂音画不同步问题?
目前iOS系统,硬编码器进入后台后会停止工作,导致编码失败。解决办法是采用硬编码的方式进入后台一定要调用后台推流接口pausePush或者换成软编码方式也不会有这个问题。
在有些预处理shader,以及编码器需要width height为16的倍数,否则会出现绿边的现象。
参考:https://cloud.tencent.com/developer/article/1399314
低延时拉流播放需要满足以下条件:
1、购买了低延时播放套餐,或者appid在后付费名单中;
2、防盗链鉴权参数必须正确;
3、UDP协议没有被封锁,尤其是UDP的443和8080端口;
4、需要用 TXLiteAVSDK 推拉流才支持。
可以按以下步骤进行检查:
setMute(true)
对比一下Demo的播放效果
如果demo和客户工程都没画面,打开手机gpu渲染再试,并联系腾讯技术支持。
如果demo正常而客户工程没画面,检查客户工程的回调事件能否打印出2003 PLAY_EVT_RCV_FIRST_I_FRAME 渲染首个视频数据包(IDR)。如果渲染首个I帧一直失败,请检查代码层是否关闭了 GPU 渲染功能。
注意 SDK默认是需要GPU渲染的。Android 4.3之前的几个版本,手机gpu性能还不怎么好,要求app开发者在代码层指定gpu渲染功能的开或关,4.3 之后的版本都是默认打开的,也就不需要再指定gpu的开关了,但是一些比较老的工程迭代过来,会保留有关闭gpu的代码,开发者找到它们,注释掉即可。
参考 API 文档镜像接口setMirror
播放时可以使用setAudioRoute
接口实现听筒与扬声器切换。
精简版sdk不支持缓存,其它版本支持缓存功能;
移动直播sdk、即liteAVSDK,最基本的能力是:推流、拉流。
推流:是指将音视频数据采集编码之后,推送到您指定的视频云平台上。组件是LivePusher。
拉流:是从云服务器上面获取到音视频数据,在本地渲染播放。组件是LivePlayer。
可见,移动直播sdk是没有提供房间管理的功能的,这部分由客户自己完成。腾讯云研发团队提供了房间管理的开源代码,即后台roomservice、终端liveRoom/rtcRoom。
RoomService中引入了云通信SDK的群组、消息功能。
房间与群组的关系:终端createRoom请求到后台,后台创建roomid(只是一个字符串)、同时调用云通信restAPI创建im群组,roomid字符串与groupid字符串相同,这就是我们说的真正的房间。
所有人进入直播间,都要加入群组:调用joinGroup加入groupid。大小主播要开始推流了,要加入到roomid:调用addPusher加入roomid。
所以:房间可以理解成直播间,包括roomid和groupid,groupid里面的是直播间里的所有人,roomid里面的都是推流者。
doCreateRoom
调用成功,但是查询房间接口getRoomList
查询不到房间的信息参考 Demo 按顺序调用doCreateRoom()
->addPusher()
->startHeartbeat()
时才会激活房间,只调用doCreateRoom()
的话房间并未激活,因此会查询不到。
注意roomService 后台逻辑: 客户端调用
doCreateRoom()
接口请求到后台,后台调用 restAPI 创建 IM 群组,把 IM 群 ID 返回给客户端;当客户端调用addPusher()
加入 IM 群组时,激活房间。startHeartbeat()
用于进程检测机制。
doCreateRoom(roomID, roomInfo, new BaseRoom.CreateRoomCallback() {
@Override
public void onError(int errCode, String errInfo) {
callback.onError(errCode, errInfo);
}
@Override
public void onSuccess(final String newRoomID) {
//5.请求CGI:add_pusher,加入房间
addPusher(newRoomID, pushURL, new AddPusherCallback() {
@Override
public void onError(int errCode, String errInfo) {
callback.onError(errCode, errInfo);
}
@Override
public void onSuccess() {
mCurrRoomID = newRoomID;
//6.调用IM的joinGroup,加入群组
jionGroup(newRoomID, new JoinGroupCallback() {
@Override
public void onError(int errCode, String errInfo) {
callback.onError(errCode, errInfo);
}
@Override
public void onSuccess() {
mHeartBeatThread.startHeartbeat(); //启动心跳
callback.onSuccess(newRoomID);
}
});
}
});
}
});
房间关闭的条件:
destroyRoom
注意前两个条件,是roomservice后台的默认触发条件,客户如果没有开启心跳,20S后业务后台会关闭房间。所以要修改前两个条件,请修改后台代码。第三个条件是对外暴露的接口,因为有前两个条件的存在,覆盖了大部分场景,所以我们终端demo中没有调用
destroyRoom
。
不能直接使用 RoomService 提供的观众管理接口:addAudience
、delAudience
、getAudiences
。
原因:这几个接口设计之初只是为了 Demo 的界面观众展示,出于方便数据直接存放在内存里,最多存储 30 个人(可修改)。
开发者的直播 APP 在处理观众管理时通常会有一些业务实现,如头部观众优先显示,而且实际线上运行时存储量大,不推荐使用内存存储。
建议开发者自行搭建数据库存储观众信息,使用 roomid 与直播间进行关联,观众列表可以参考腾讯视频云自由开播后台服务进行实现。
可变。
主播端/连麦端的大小画面是在客户端本地进行渲染叠加的,UI 上的位置显示开发者可自行改变。
普通观众端看到的大小画面是云端混流后的画面,可以通过修改云端混流时的大小画面参数来进行配置,具体参数请参考文档云端混流进行配置。
可以开启回音消除。
setVideoQuality设置参数:大主播推流VIDEO_QUALITY_LINKMIC_MAIN_PUBLISHER、小主播推流VIDEO_QUALITY_LINKMIC_MAIN_PUBLISHER。内部自动实现回音消除。
enableAEC(true)是回音消除接口,如果连麦没有采用上面两种模式,就需要手动调用这个接口。
注意回音消除要配对使用,假如客户用了三方推流设备连麦,回音消除有可能无效。 注意建议连麦时,两台设备保持3米以上。开启了回音消除,会过滤掉手机喇叭播放出的声音。但是两台手机离的过近,两端的麦克风同时录入了两端的声音,这种回音会伴随有蜂鸣声,只能从使用场景上规避。
{
"timestamp":int(time.time()), # UNIX时间戳,即从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数
"eventId":int(time.time()), # 取随机数即可,标识一次网络请求
"interface":
{
"interfaceName":"Mix_StreamV2", # 固定取值"Mix_StreamV2"
"para":
{
"app_id": 9527, # 填写直播APPID
"interface": "mix_streamv2.start_mix_stream_advanced", # 固定取值
"mix_stream_session_id" : "5000_enson", # 填大主播的流ID
"output_stream_id": "5000_enson11", # 填大主播的流ID
"output_stream_type": 0, # 填输出流类型
"input_stream_list":
[
# 大主播:背景画面
{
"input_stream_id":"5000_enson11", # 流ID
"layout_params":
{
"image_layer": 1 # 图层标识号:大主播填 1 ;
"input_type": 4 # 标记混入纯音频
}
},
# 小主播按照顺序填写2、3、4、5、6
# 小主播1
{
"input_stream_id":"5000_enson22", # 流ID
"layout_params":
{
"image_layer": 2, # 图层标识号
"input_type": 4 # 标记混入纯音频
}
},
]
}
}
}
在 App 内调用录屏扩展来推流时,需要启用麦克风:RPScreenRecorder sharedRecorder.microphoneEnabled = YES;
有种场景是6.3版本之后TXLiteAVSDK需要校验licence成功才能推流。licenceURL默认是http的,如果iOS工程里面没有配置ATS,那么就无法下载到移动直播licence带着校验失败。
解决办法:
1、licenceURL使用https;
2、或者工程配置NSAllowsArbitraryLoads=YES。
指定房间录制是通过在推流地址后面带上推流参数:
纯音频:record_type=audio;视频:record_type=video;如果视频和纯音频都需要,可以先录成视频,后续再在点播里边转码成纯音频。
是的,实时视频录制任务时长支持最大为 30 分钟,如果传入任务结束时间与当前时间差大于 30 分钟,则按 30 分钟计算。录制时长建议控制在 5 分钟以内。需要多次调用满足长时间录制。
注意这个录制功能提供出来,是为了满足录制精彩片段的需求。如果有长时间录制、全程录制的需求,请使用全局录制或指定流id录制
如果主播使用纯音频推流,需要在推流的 Url 地址后面添加参数 record_type=audio ,这样才能保证有录制文件生成。<font color='red'>值得注意的是</font>:建议推流地址由服务端生成,然后下发给客户端。客户端只是在 Url 地址后面增加录制纯音频参数。
如果你想了解更多直播录制的信息,可以阅读 如何录制并回看
iOS自定义采集:
sendVideoSampleBuffer,硬编支持NV12和BGRA格式,软编只支持yuv420p格式。且必须在config里设置分辨率。
Android自定义采集:
sendCustomVideoData,只支持i420格式。
iOS端参考:https://cloud.tencent.com/developer/article/1403024
Android端参考:https://cloud.tencent.com/developer/article/1402828
Android端参考:https://cloud.tencent.com/developer/article/1470377
Android端参考:https://cloud.tencent.com/developer/article/1470373
1). 腾讯云直播提供统计 API,开发者可以通过调用 查询统计信息 接口来查询某条直播流的统计信息的观看人数。
2). 如果开发者项目工程中有使用到 云通信 组件,可以调用 IM 群人数统计接口。
目前方案 1) 和 2) 都统计出来的人数不是很准确,如果开发者对在线人数要求不高,可以直接上述方案。
如果开发者需要很准确的统计在线人数,最好自己服务器实现统计逻辑。
编译 roomservice_server_java 或者 webrtc_server_java 的 war 包。最好按照这种方式 本地 run 起来,顺便编译出 war 包 来编译包。这样就能确保 能正常编译出包
如果pod报下列错误,可能是本地仓库比较旧,可以尝试执行:
1). pod repo remove master
2). pod setup
3). pod install
flv没有类似mp4的索引表,不能精确网络请求数据,现在的做法是一直往下读,所以会比较慢。建议优先用mp4或m3u8做点播。
要在播放成功事件(PLAY_EVT_PLAY_BEGIN)之后调用TXVodPlayer.seek()才有效。播放器没有播放成功,无数据源信息,设置播放器进度是无效的。seek会重复触发播放事件的PLAY_EVT_PLAY_BEGIN事件,请注意不要反复seek。
注意 客户做点播,请使用TXVodPlayer,不要使用TXLivePlayer。SDK早期版本只有 TXLivePlayer 一个 Class 承载直播和点播功能,但是由于点播功能越做越多,我们最终在 SDK 3.5 版本开始,将点播功能单独分离出来,交由 TXVodPlayer 来负责。但是为了保证编译通过,您在 TXLivePlayer 中依然可以看到类似 seek 等点播才具备的功能。
在推流地址后拼参数 &procedure=QCVB_SimpleProcessFile(1, 1,10,10) 可以对视频文件截图,得到的截图会回调给点播控制台设置的回调地址。
其中 QCVB_SimpleProcessFile 有四个参数,分别是:转码、设置水印、使用截图设置视频封面、采样截图。
参数说明:
1、若填写1,说明按默认模板处理。
2、若填写0,则不进行处理。
3、若填写10,说明按照10模板号处理。
4、转码参数那里,可以选定具体格式转。
iOS精简版点播播放器用的系统AVPlayer,Android端精简版用的EXOPlayer。专业版基于ijkplayer。
移动直播的基础知识【直播、点播、协议】
视频卡顿怎么办【卡顿、延时】
画质差怎么办【曝光、美颜、滤镜、马赛克、FPS、耗电量】
直播看不了怎么办【播放、防火墙】
怎么实现秒开【GOP、延迟修正】
怎么获取URL【流id、频道、房间、直播间】
怎么开通各项云服务【appid、bizid、key、回调、点播、云通信、sdkappid、cos、服务器】
如何联系我们【工单、技术支持】
事件通知码【回调】
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。