日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

android歌词同步源码,Android KTV歌房歌词同步实现流程

發(fā)布時間:2023/12/29 Android 49 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android歌词同步源码,Android KTV歌房歌词同步实现流程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

歌詞同步實現(xiàn)流程

1 功能實現(xiàn)流程圖

目前運用最廣的歌詞文件LRC文件內(nèi)容如下。

[00:02.37] 即構(gòu)KTV

[00:03.12]

[00:03.80] 作詞:即構(gòu)

[00:04.55] 作曲:即構(gòu)

[00:05.18] 演唱:即構(gòu)

[00:06.43] 出品:深圳即構(gòu)科技

這種格式文件小,容易解析,歌詞的精度控制到一行。

當觀眾、合唱、主唱都存在此歌詞文件時,此時只需要知道當前音樂進度時間戳,就能達到歌詞同步。

即構(gòu) SDK 支持將非媒體信息注入媒體流中。歌詞信息和音視頻信息是在同一個媒體通道傳輸?shù)?#xff0c;這樣可以保障歌詞和音視頻同步。歌詞進度由主唱端發(fā)送,觀眾跟合唱端接收到時間戳后,再根據(jù)時間戳把關鍵歌詞行高亮。達到歌詞同步展示的效果。

具體實現(xiàn)流程圖請參考:

內(nèi)部約定主唱端與觀眾、合唱的歌詞同步信息通信格式即可。

2 接收歌詞時間戳數(shù)據(jù)

即構(gòu) SDK 拉流解碼提取出媒體次要信息,會將其通過 onRecvMediaSideInfo 回調(diào)給應用開發(fā)者。合唱者、觀眾需要關注這個回調(diào)接口。

2.1 設置回調(diào),接收媒體次要信息

ZEGO SDK 提供了相關接口,用于設置回調(diào),接收媒體次要信息。

/**

* 設置回調(diào),接收媒體次要信息

*/

mZegoLiveRoom.setZegoMediaSideCallback(new IZegoMediaSideCallback() {

@Override

public void onRecvMediaSideInfo(String streamID, ByteBuffer byteBuffer, int dataLen) {

}

});

其中,當用戶端收到媒體次要信息時,SDK 會調(diào)用之。

2.2 實現(xiàn)回調(diào)函數(shù),處理媒體次要信息

媒體次要信息會作為 onRecvMediaSideInfo 的入?yún)鬟f進去,開發(fā)者需要在該函數(shù)內(nèi),根據(jù)業(yè)務要求,處理媒體次要信息。

主唱向觀眾、合唱端發(fā)送的數(shù)據(jù)格式為時間戳。KTV App 中處理媒體次要信息的示例代碼如下:

/**

* 設置回調(diào),接收媒體次要信息

*/

mZegoLiveRoom.setZegoMediaSideCallback(new IZegoMediaSideCallback() {

@Override

public void onRecvMediaSideInfo(String streamID, ByteBuffer byteBuffer, int dataLen) {

if (dataLen == 0) {

return;

}

int offset = 4;

// 偏移offset字節(jié)轉(zhuǎn)換成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);

// 此處拿到時間戳數(shù)據(jù) timeStamp

// 拿到timeStamp后根據(jù)時間戳的值展示歌詞信息

}

});

當拿到timeStamp后,解析歌詞展示timeStamp時間段的歌詞數(shù)據(jù)就OK了。

3 主唱端發(fā)送歌詞信息

3.1 發(fā)送媒體次要信息

即構(gòu) SDK 提供了相關接口,用于發(fā)送媒體次要信息。在 KTV 場景中,歌詞信息就作為媒體次要信息注入媒體流中,連同音視頻數(shù)據(jù)一同發(fā)送到拉流端。觀眾、合唱者等拉流端接受到媒體次要信息后,得到應用進度時間戳。

如果要發(fā)送媒體次要信息,首先需要開啟媒體次要信息開關。接口如下所示:

ZegoLiveRoom

/**

發(fā)送媒體次要信息開關

@param start 開啟媒體次要信息傳輸,true 開啟媒體次要信息傳輸, false 關閉媒體次要信息傳輸。start 為 true 時,onlyAudioPublish 開關才有效

@param onlyAudioPublish 是否純音頻直播,true 純音頻直播,不傳輸視頻數(shù)據(jù),false 音視頻直播,傳輸視頻數(shù)據(jù)。默認為 false。如果本次只有音頻直播,必須將 onlyAudioPublish 置為 true,此時將會由音頻來驅(qū)動次要信息的傳輸,同時忽略視頻流傳輸

@discussion 初始化 SDK 后,開始推流前調(diào)用。

*/

(ZegoLiveRoom)setMediaSideFlags(boolean start , boolean onlyAudioPublish);

開啟媒體次要信息開關后,才能使用以下接口進行發(fā)送媒體次要信息。

ZegoLiveRoom

/**

發(fā)送媒體次要信息

@param inData 需要傳輸?shù)囊粢曨l次要信息數(shù)據(jù),外部輸入

@param dataLen 傳入的 inData 總長度,不能大于 1000 Bytes

@param packet 是否外部已經(jīng)打包好包頭,true 已打包, false 未打包。如果沒有特殊情況,建議用戶使用內(nèi)部打包

@discussion 主播端開啟媒體次要信息開關,開始推流后調(diào)用。調(diào)用此 API 發(fā)送媒體次要信息后,觀眾端在

(ZegoLiveRoom)setZegoMediaSideCallback() 設置的回調(diào)中獲取媒體次要信息。不需要發(fā)送媒體次要信息時,可調(diào)用 (ZegoLiveRoom)setMediaSideFlags(false,false) 關閉通道

*/

(void)sendMediaSideInfo(ByteBuffer inData, int dataLen, boolean packet);

3.2 使用發(fā)送媒體次要信息接口,如何進行媒體次要信息發(fā)送

媒體次要信息會作為 inData 的參傳入到SDK,開發(fā)者調(diào)用該函數(shù),根據(jù)業(yè)務要求,傳入媒體次要信息。

演示 Demo 中發(fā)送媒體次要信息的示例代碼如下:

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播放器的函數(shù),去獲取該伴奏播放的進度時間戳。

關于媒體次要信息功能的詳細說明,可參考文檔:媒體次要信息

3.3 使用MediaPlayer播放器拿到當前播放的時間戳數(shù)據(jù)

知道怎么發(fā)送媒體次要信息了,接下來使用ZEGO SDK MediaPlayer提供的函數(shù)拿到時間戳

示例代碼如下:

ZegoMediaPlayer player = new ZegoMediaPlayer();

player.init(ZegoMediaPlayer.PlayerTypeAux);

// 通過該函數(shù)獲取到播放伴奏進度時間戳

int timeStamp = player.getCurrentDuration();

拿到timeStamp 后,主唱端需要做一個定時器循環(huán)去取這個時間戳使用SDK媒體次要信息接口發(fā)送出去。

每秒循環(huán)取一次,直到該首歌播放完畢, 讓觀眾、合唱歌詞展示達到同步狀態(tài)。

總結(jié)

以上是生活随笔為你收集整理的android歌词同步源码,Android KTV歌房歌词同步实现流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。