实时音视频TRTC & 版权曲库AME在线KTV联合解决方案深度整合腾讯在音视频深度积累的技术能力以及音乐内容版权上的核心优势产生1+1大于2的化学反应,帮助开发者极速搭建在线KTV业务。
实时音视频TRTC提供全球端到端平均延时<300 ms实时连麦以及10万人< 1s的超低延时观看的技术方案。 同时面向在线KTV场景提供48kHz采样率,128kbps立体声音频、低延时耳返让线上拥有媲美线下的KTV体验;更有变声、气氛音效、混响等多种趣味玩法。
正版曲库直通车(Authorized Music Express,AME)聚合TME等多家版权方优质曲目资源,结合腾讯云存储、编解码、内容分发、边缘计算等能力,有效解决多场景音乐素材应用版权问题。您可在控制台选购单曲/曲库包,提供下载/API/SDK多种接入方式,灵活高效实现正版音乐素材在多端的顺畅播放与应用。
流程图:
sequenceDiagram
participant App客户端
participant App后台
participant TRTC SDK
participant TXCopyrightedMedia
participant 腾讯云后台
App客户端 ->> App后台:请求搜索音乐
App后台 ->> 腾讯云后台:请求搜索音乐 SearchKTVMusics
腾讯云后台 -->> App后台:返回音乐列表
App后台 -->> App客户端:返回音乐列表
App客户端 -->> App后台:请求音乐详情
App后台 ->> 腾讯云后台:请求音乐详情 DescribeKTVMusicDetail(带musicId)
腾讯云后台 -->> App后台:返回音乐详情
App后台 -->> App客户端:返回音乐详情
App客户端 ->> TXCopyrightedMedia:preloadMusic(传入musicId+playToken)
TXCopyrightedMedia ->> 腾讯云后台:请求Music数据
腾讯云后台 -->> TXCopyrightedMedia:返回Music数据
TXCopyrightedMedia -->> App客户端:回调preloadMusic进度和结果
App客户端 ->> TRTC SDK:startPlayMusic(传入genMusicURI返回值)
• 正版曲库直通车AME 服务开通:登录正版曲库直通车AME控制台后,您可在勾选同意腾讯云服务协议以及正版曲库直通车服务协议后单击【立即开通】,即可开通服务。
• 实时音视频TRTC 服务开通:登录实时音视频TRTC控制台开通并使用产品。
您可在左导航栏进入【应用管理】页面,单击“创建应用”按钮,根据弹窗填空提示,填写相应的信息。
- 应用名称:指接入APP应用名称。应用名称涉及版权授权,请准确填写,创建后无法再次修改。
- Android PackageName:指接入应用在安卓应用市场的PackageName。请准确填写,创建后无法再次修改。
- IOS BundleID:指接入应用在IOS应用市场的BundleID,请准确填写,创建后无法再次修改。
- 应用场景:请根据接入应用的具体使用场景如实选择(语聊房/直播/FM)。
- DAU:请基于接入应用实际情况准确填写。
因产品尚在内测,在正式接入之前,请联系对应商务经理为您添加白名单。
API名称 | 描述 | 使用说明 |
---|---|---|
SearchKTVMusics | 搜索KTV曲库 | 文档地址 |
DescribeKTVMusicDetail | 查询曲库歌曲详情 | 文档地址 |
a、首先调用 SearchKTVMusics 搜索目标歌曲,返回的列表包含歌曲的信息及Id
// 请求
POST / HTTP/1.1
Host: ame.tencentcloudapi.com
Content-Type: application/json
X-TC-Action: SearchKTVMusics
<公共请求参数>
{
"Limit": 10,
"KeyWord": "周杰伦",
"Offset": 0
}
// 响应
{
"Response": {
"TotalCount": 1,
"KTVMusicInfoSet": [
{
"ComposerSet": [
"方文山"
],
"MusicId": "ame-78dxxx",
"SingerSet": [
"周杰伦"
],
"Name": "七里香",
"LyricistSet": [
"周杰伦"
],
"TagSet": [
"华语",
"流行"
]
}
],
"RequestId": "xx"
}
}
b、根据上面接口返回的 Id 查询歌曲详情,包含 SDK 中所需要的 PlayToken
// 请求
POST / HTTP/1.1
Host: ame.tencentcloudapi.com
Content-Type: application/json
X-TC-Action: DescribeKTVMusicDetail
<公共请求参数>
{
"MusicId": "ame-78d2xxx"
}
// 响应
{
"Response": {
"PlayToken": "DUE3344xxxxxx",
"KTVMusicBaseInfo": {
"ComposerSet": [
"周杰伦"
],
"MusicId": "ame-78d2xxx",
"SingerSet": [
"周杰伦"
],
"Name": "七里香",
"LyricistSet": [
"方文山"
],
"TagSet": [
"华语",
"流行"
]
},
"RequestId": "xx"
}
}
a、拷贝TXCopyRightedMedia-Android-1.0.4.aar 到 libs目录,添加依赖项:implementation(name:'TXCopyRightedMedia-Android-1.0.4', ext:'aar') b、参考此处集成TRTC SDK implementation 'com.tencent.liteav:LiteAVSDK_TRTC:latest.release'
注意混淆
-keep class com.tencent.** { *; }
a、集成版权曲库SDK(拷贝TXCopyrightedMedia.framework)到项目工程中并集成
b、如果使用pod导入,则在podfile里面添加:
pod 'TXCopyrightedMedia', :podspec => 'https://mediacloud-76607.gzc.vod.tencent-cloud.com/Podspec/TXCopyrightedMedia/1.0.4/TXCopyrightedMedia.podspec'
说明
获取TXCopyrightedMedia单例
接口
TXCopyrightedMedia copyrightedMedia = TXCopyrightedMedia.instance();
说明
设置license
接口
copyrightedMedia.setLicense(Context context, String licenseUrl, String key);
参数说明
参数名 | 类型 | 描述 |
---|---|---|
context | Context | Context上下文 |
licenseUrl | String | 控制台生成的licenseUrl |
key | String | 控制台生成的key |
说明
初始化TXCopyrightedMedia。
接口
copyrightedMedia.init();
说明
当程序退出后调用销毁。
接口
copyrightedMedia.destroy();
说明
预加载Music数据,每次播放/重播前都需要调用该接口。
接口
copyrightedMedia.preloadMusic(String musicId, String bitrateDefinition, String playToken, ITXMusicPreloadCallback callback);
参数说明
参数名 | 类型 | 描述 |
---|---|---|
musicId | String | 歌曲Id |
bitrateDefinition | String | 码率描述,从服务器歌曲详情获取( audio/mi: 代表64kbps码率 audio/lo:代表128kbps码率 audio/hi: 代码320kbps码率) |
playToken | String | 播放Token |
callback | ITXMusicPreloadCallback | 回调函数 |
interface ITXMusicPreloadCallback {
void onPreloadStart(String musicId, String bitrateDefinition);
void onPreloadProgress(String musicId, String bitrateDefinition, float progress);
void onPreloadComplete(String musicId, String bitrateDefinition, int errCode, String errMsg);
}
errCode返回码定义如下
定义 | 数值 | 描述 |
---|---|---|
ERR_NONE | 0 | 无错误 |
ERR_INIT_FAIL | -1 | 初始化失败 |
ERR_CANCEL | -2 | 用户取消数据获取 |
ERR_TOKEN_FAIL | -3 | token过期 |
ERR_NET_FAIL | -4 | 网络错误 |
ERR_INNER | -5 | 内部错误 |
ERR_PARSE_FAIL | -6 | 解析错误 |
ERR_DECRYPT_FAIL | -7 | 解密错误 |
ERR_LICENCE_FAIL | -8 | License校验不通过 |
说明
取消预加载Music数据。
接口
copyrightedMedia.cancelPreloadMusic(String musicId, String bitrateDefinition);
参数说明
参数名 | 类型 | 描述 |
---|---|---|
musicId | String | 歌曲Id |
bitrateDefinition | String | 码率描述,从服务器歌曲详情获取( audio/mi: 代表64kbps码率 audio/lo:代表128kbps码率 audio/hi: 代码320kbps码率) |
说明
检测是否已预加载Music数据。
接口
boolean isPreloaded = copyrightedMedia.isMusicPreloaded(String musicId, String bitrateDefinition);
参数说明
参数名 | 类型 | 描述 |
---|---|---|
musicId | String | 音乐Id |
bitrateDefinition | String | 码率描述,从服务器歌曲详情获取( audio/mi: 代表64kbps码率 audio/lo:代表128kbps码率 audio/hi: 代码320kbps码率) |
说明
生成Music URI,App客户端在preloadMusic成功之后调用,原唱&伴奏传给TRTC进行播放。
接口
String MusicUri = TXCopyrightedMedia.genMusicURI(String musicId,int musicType, String bitrateDefinition);
参数说明
参数名 | 类型 | 描述 |
---|---|---|
musicId | String | 歌曲Id |
musicType | Int | 0:原唱,1:伴奏, 2:歌词 |
bitrateDefinition | String | 码率描述,从服务器歌曲详情获取( audio/mi: 代表64kbps码率 audio/lo:代表128kbps码率 audio/hi: 代码320kbps码率) |
返回说明
返回值 | 类型 | 描述 |
---|---|---|
musicUri | String | 原唱&伴奏:传给TRTC 播放的uri,格式 CopyRightMusic://audiotype=xxxx&musicid=xxxx&bitrate=xxxx;歌词:返回歌词的本地路径 |
说明
清理本地所有缓存歌曲数据
接口
copyrightedMedia.clearMusicCache();
说明
设置缓存歌曲最大数量
接口
copyrightedMedia.setMusicCacheMaxCount(int maxCount);
参数说明
参数名 | 类型 | 描述 |
---|---|---|
maxCount | Int | 歌曲最大缓存数量,默认50 |
application 创建时候调用:
TXCopyrightedMedia.instance().setLicense(context, licenseUrl, key);
进入主界面时候调用:
TXCopyrightedMedia.instance().init();
退出主界面时候调用:
TXCopyrightedMedia.instance().destroy();
进入K歌房间,点击K歌,下载Music:
TXCopyrightedMedia copyRightedMedia = TXCopyrightedMedia.instance();
if(copyRightedMedia.isMusicPreloaded(musicId, bitrateDefinition)){
startPlayMusic();
}else{
ITXMusicPreloadCallback callback = new ITXMusicPreloadCallback() {
@override
public void onPreloadStart(String musicId, String bitrateDefinition) {
// 界面提示 Music 开始加载
}
@override
public void onPreloadProgress(String musicId, String bitrateDefinition, float progress){
// 界面显示进度
}
@override
void onPreloadComplete(String musicId, String bitrateDefinition, int errorCode, String errMsg){
// 缓存完毕
if(errorCode == ErrorCode.Success) {
startPlayMusic();
} else {
// 提示失败,详情见ErrorCode
}
}
}
copyRightedMedia.preloadMusic(musicId, playToken, callback);
}
void startPlayMusic(){
String origintUri = TXCopyrightedMedia.genMusicURI(musicId, 0, "audio/lo");//获取原唱 uri
String accompUri = TXCopyrightedMedia.genMusicURI(musicId, 1, "audio/lo");//获取伴奏 uri
// 注意,上面的 musicId 是曲库后台接口返回的字符串,用来区分存储在后台的音乐资源
// 下面的 originMusicId 和 accompMusicId 是 int 型格式,您可以自己设置,
// 用于 TRTC 的 BGM 播放接口区分不同的音乐使用,保证原唱和伴奏的 id 不同即可
int originMusicId = 0;//原唱的 music id
int accompMusicId = 1;//伴唱的 music id
TXAudioEffectManager.AudioMusicParam originMusicParam =
new TXAudioEffectManager.AudioMusicParam(originMusicId, origintUri);
TXAudioEffectManager.AudioMusicParam accompMusicParam =
new TXAudioEffectManager.AudioMusicParam(accompMusicId, accompUri);
TXAudioEffectManager audioEffectManager =
TRTCCloud.sharedInstance(this).getAudioEffectManager();
// 播放原唱和伴奏
audioEffectManager.startPlayMusic(originMusicParam);
audioEffectManager.startPlayMusic(accompMusicParam);
//调用以下代码会播放并上行伴奏:
audioEffectManager.setMusicPlayoutVolume(originMusicId,0);
audioEffectManager.setMusicPlayoutVolume(accompMusicId,100);
audioEffectManager.setMusicPublishVolume(originMusicId,0);
audioEffectManager.setMusicPublishVolume(accompMusicId,100);
//调用以下代码会播放并上行原唱:
audioEffectManager.setMusicPlayoutVolume(originMusicId,100);
audioEffectManager.setMusicPlayoutVolume(accompMusicId,0);
audioEffectManager.setMusicPublishVolume(originMusicId,100);
audioEffectManager.setMusicPublishVolume(accompMusicId,0);
}