android歌词同步源码,Android KTV歌房歌词同步实现流程
歌词同步实现流程
1 功能实现流程图
目前运用最广的歌词文件LRC文件内容如下。
[00:02.37] 即构KTV
[00:03.12]
[00:03.80] 作词:即构
[00:04.55] 作曲:即构
[00:05.18] 演唱:即构
[00:06.43] 出品:深圳即构科技
这种格式文件小,容易解析,歌词的精度控制到一行。
当观众、合唱、主唱都存在此歌词文件时,此时只需要知道当前音乐进度时间戳,就能达到歌词同步。
即构 SDK 支持将非媒体信息注入媒体流中。歌词信息和音视频信息是在同一个媒体通道传输的,这样可以保障歌词和音视频同步。歌词进度由主唱端发送,观众跟合唱端接收到时间戳后,再根据时间戳把关键歌词行高亮。达到歌词同步展示的效果。
具体实现流程图请参考:
内部约定主唱端与观众、合唱的歌词同步信息通信格式即可。
2 接收歌词时间戳数据
即构 SDK 拉流解码提取出媒体次要信息,会将其通过 onRecvMediaSideInfo 回调给应用开发者。合唱者、观众需要关注这个回调接口。
2.1 设置回调,接收媒体次要信息
ZEGO SDK 提供了相关接口,用于设置回调,接收媒体次要信息。
/**
* 设置回调,接收媒体次要信息
*/
mZegoLiveRoom.setZegoMediaSideCallback(new IZegoMediaSideCallback() {
@Override
public void onRecvMediaSideInfo(String streamID, ByteBuffer byteBuffer, int dataLen) {
}
});
其中,当用户端收到媒体次要信息时,SDK 会调用之。
2.2 实现回调函数,处理媒体次要信息
媒体次要信息会作为 onRecvMediaSideInfo 的入参传递进去,开发者需要在该函数内,根据业务要求,处理媒体次要信息。
主唱向观众、合唱端发送的数据格式为时间戳。KTV App 中处理媒体次要信息的示例代码如下:
/**
* 设置回调,接收媒体次要信息
*/
mZegoLiveRoom.setZegoMediaSideCallback(new IZegoMediaSideCallback() {
@Override
public void onRecvMediaSideInfo(String streamID, ByteBuffer byteBuffer, int dataLen) {
if (dataLen == 0) {
return;
}
int offset = 4;
// 偏移offset字节转换成int
int timeStamp = ((byteBuffer.get(offset) & 0xff) | ((byteBuffer.get(offset + 1) & 0xff) << 8) |
((byteBuffer.get(offset + 2) & 0xff) << 16) | (byteBuffer.get(offset + 3) & 0xff) << 24);
// 此处拿到时间戳数据 timeStamp
// 拿到timeStamp后根据时间戳的值展示歌词信息
}
});
当拿到timeStamp后,解析歌词展示timeStamp时间段的歌词数据就OK了。
3 主唱端发送歌词信息
3.1 发送媒体次要信息
即构 SDK 提供了相关接口,用于发送媒体次要信息。在 KTV 场景中,歌词信息就作为媒体次要信息注入媒体流中,连同音视频数据一同发送到拉流端。观众、合唱者等拉流端接受到媒体次要信息后,得到应用进度时间戳。
如果要发送媒体次要信息,首先需要开启媒体次要信息开关。接口如下所示:
ZegoLiveRoom
/**
发送媒体次要信息开关
@param start 开启媒体次要信息传输,true 开启媒体次要信息传输, false 关闭媒体次要信息传输。start 为 true 时,onlyAudioPublish 开关才有效
@param onlyAudioPublish 是否纯音频直播,true 纯音频直播,不传输视频数据,false 音视频直播,传输视频数据。默认为 false。如果本次只有音频直播,必须将 onlyAudioPublish 置为 true,此时将会由音频来驱动次要信息的传输,同时忽略视频流传输
@discussion 初始化 SDK 后,开始推流前调用。
*/
(ZegoLiveRoom)setMediaSideFlags(boolean start , boolean onlyAudioPublish);
开启媒体次要信息开关后,才能使用以下接口进行发送媒体次要信息。
ZegoLiveRoom
/**
发送媒体次要信息
@param inData 需要传输的音视频次要信息数据,外部输入
@param dataLen 传入的 inData 总长度,不能大于 1000 Bytes
@param packet 是否外部已经打包好包头,true 已打包, false 未打包。如果没有特殊情况,建议用户使用内部打包
@discussion 主播端开启媒体次要信息开关,开始推流后调用。调用此 API 发送媒体次要信息后,观众端在
(ZegoLiveRoom)setZegoMediaSideCallback() 设置的回调中获取媒体次要信息。不需要发送媒体次要信息时,可调用 (ZegoLiveRoom)setMediaSideFlags(false,false) 关闭通道
*/
(void)sendMediaSideInfo(ByteBuffer inData, int dataLen, boolean packet);
3.2 使用发送媒体次要信息接口,如何进行媒体次要信息发送
媒体次要信息会作为 inData 的参传入到SDK,开发者调用该函数,根据业务要求,传入媒体次要信息。
演示 Demo 中发送媒体次要信息的示例代码如下:
int timeStamp = // 获取播放进度时间戳
byte[] mediaSide = new byte[4];
mediaSide[0] = (byte) (timeStamp & 0xff); // 低位(右边)的8个bit位
mediaSide[1] = (byte) ((timeStamp >> 8) & 0xff); //第二个8 bit位
mediaSide[2] = (byte) ((timeStamp >> 16) & 0xff); //第三个 8 bit位
mediaSide[3] = (byte) ((timeStamp >> 24) & 0xff); //第4个 8 bit位
ByteBuffer inData = ByteBuffer.allocateDirect(mediaSide.length);
inData.mediaSideInfoBuf.put(mediaSide, 0, mediaSide.length);
inData.mediaSideInfoBuf.flip();
mZegoLiveRoom.sendMediaSideInfo(inData, mediaSide.length, false);
timeStamp,是当前播放的进度时间戳,需要通过播放器SDK MediaPlayer播放器的函数,去获取该伴奏播放的进度时间戳。
关于媒体次要信息功能的详细说明,可参考文档:媒体次要信息
3.3 使用MediaPlayer播放器拿到当前播放的时间戳数据
知道怎么发送媒体次要信息了,接下来使用ZEGO SDK MediaPlayer提供的函数拿到时间戳
示例代码如下:
ZegoMediaPlayer player = new ZegoMediaPlayer();
player.init(ZegoMediaPlayer.PlayerTypeAux);
// 通过该函数获取到播放伴奏进度时间戳
int timeStamp = player.getCurrentDuration();
拿到timeStamp 后,主唱端需要做一个定时器循环去取这个时间戳使用SDK媒体次要信息接口发送出去。
每秒循环取一次,直到该首歌播放完毕, 让观众、合唱歌词展示达到同步状态。
android歌词同步源码,Android KTV歌房歌词同步实现流程相关推荐
- android 滑动接听源码,android仿摩拜单车APP、炫酷RecyclerView、卡片滑动、仿饿了么点餐、自定义索引等源码...
Android精选源码 Android优质博客 前言permissions4m 最初的设计是仅仅做成一个编译器注解框架,在1.0.0版本时,它纯粹地实现了原生 Android 请求流程,关于它的设计思 ...
- android studio im源码,Android Studio 导入 AOSP 源码
有了 AOSP 源码,接下来就是如何看了,可以直接文本看,可以用 Source Insight,我当然选择 Android Studio,Android Studio 是我熟悉且十分强大的工具.问题来 ...
- Java播放歌词同步源码,Android 实现歌词同步
歌词同步的原理其实很简单: 歌词显示是一个线程, 音乐播放时一个线程,通过播放时间将歌词显示进度与播放进度同步起来. 网络标准的歌词格式是LRC. 我们看下一个LRC文档,其格式就一目了然了. [ti ...
- android唱吧源码,Android版唱吧K歌王
唱吧的社交性还是很强大的,提供有自动混响效果和演唱时的实时打分,用户建立个人主页并上传你的作品,网友可以用送花.评论.回复等多种方式与歌友互动.对于手机党而言,什么时候推出了一款新的好玩的软件,肯定都 ...
- android仿疯狂猜图源码,Android开发实现高仿优酷的客户端图片左右滑动切换功能实例【附源码下载】...
本文实例讲述了Android开发实现高仿优酷的客户端图片左右滑动切换功能.分享给大家供大家参考,具体如下: 本例是用ViewPager去做的实现,支持自动滑动和手动滑动,不仅优酷网,实际上有很多商城和 ...
- android 自定义相机源码,Android 自定义相机及分析源码
Android 自定义相机及分析源码 使用Android 系统相机的方法: 要想让应用有相机的action,咱们就必须在清单文件中做一些声明,好让系统知道,如下 action的作用就是声明action ...
- android 图片查看源码,Android 简单的图片查看器源码
public class MainActivity extends Activity { private EditText et_path; private ImageView iv; //创建han ...
- android 手机壁纸源码,Android设置手机壁纸-源码(WallPaper)
Android设置手机壁纸-源码(WallPaper) /** * Andorid设置手机屏幕的壁纸 * * @description: * @author ldm * @date 2016-5-4 ...
- android 夜间模式源码,Android Support Library 之 夜间模式
前言 夜间模式实现方式:1.通过切换theme来实现夜间模式.优点:可以匹配多套主题,并不局限于黑白模式缺点:需要大量定义主题详见博客:http://wuxiaolong.me/2015/08/19/ ...
- android简单记账源码,Android+个人记账程序源码.rar(入门级)
[实例简介]Android 个人记账程序源码,入门级源码,适合新手... [实例截图] [核心代码] package com.cola.ui; import java.util.Calendar; i ...
最新文章
- [trustzone]-ARMV8的aarch64和aarch32环境下ELx级别的理解
- python3 实现 A+B Problem(百练OJ:1000)
- osqa java_从LSM-Tree、COLA-Tree谈到StackOverflow、OSQA(召唤前端)
- CompletableFuture详解~anyOf
- Daily scrum 11.22
- ubuntu下谷歌开源的TensorFlow Object Detection API的安装教程
- spring-retry重试与熔断详解—《亿级流量》内容补充
- 专业邮件群发软件,助您轻松邮件营销
- Gnome 个人目录下中文路径转英文路径
- 2017年的博客之路开始---下一个十年
- 程序员,你何时离开北京
- 亚马逊服务器EC2无法ping通的问题
- 苹果ios9.2 html白屏,苹果游戏中心白屏怎么办 苹果游戏中心白屏解决方法【详解】...
- MongoDB3.2 - 4.2 新特性解读
- Android实现返回主页,禁止返回上一层等功能
- 数据库分类及常用数据库
- 服务器ibmc无法加载js文件,weUI应用之JS常用信息提示弹层的封装
- tio-websocket-server 源码浅析
- JavaCV常用工具
- Android8.0,允许安装未知来源