int AUDIO_QUALITY_NORMAL = 1; //标准音质,默认
int AUDIO_QUALITY_HQ = 3; //HQ音质,需要是会员
int MV_480P = 480; //480P视频
int MV_720P = 720; //720P视频,默认
int MV_1080P = 1080; //1080P视频,需要是会员
ksong.support.player.KtvPlayerConfig#setAudioQuality(SongInfoModel.AUDIO_QUALITY_HQ)
ksong.support.player.KtvPlayerConfig#setVideoQuality(SongInfoModel.MV_720P)
//切换清晰度前记录播放位置,**PlayConsole类的功能需自行实现,不要直接用PlayConsole**。
PlayConsole.get().changeQualityPlayPosition.postValue(position)
//调用播放
playSong(playPosition)
//播放开始后,根据之前记录的播放位置,调用当前播放器的seek.
currPlayer()?.seek(PlayConsole.get().changeQualityPlayPosition.value)
//通知界面清晰度已变化
PlayConsole.get().changeQualityPlayPosition.postValue(0)
//监听视频清晰度变化
PlayConsole.get().mv720Info.observe(viewLifecycleOwner) {
if (it?.isSelected == true && KtvPlayerConfig.getInstance().videoQuality != SongInfoModel.MV_720P) {
KtvPlayerConfig.getInstance().videoQuality = SongInfoModel.MV_720P
log("mv720Info changed, replay 720")
PlayConsole.get().changeQualityPlayPosition.postValue(
ChangeQualityInfo(
playInfoVM.currPlayer()?.timeLineTime ?: 0, 1
)
)
loadSong()
KGToast.show(getString(R.string.ktv_control_720P))
}
}
//...
/**
* 调用{@link KaraokePlayer#play} 方法后回调
*/
override fun onPrePlay(request: KaraokePlayRequest) {
playInfoVM.currSongInfo().value = request.songInfoObject
playInfoVM.getShouldShowPicUrl().value = ""
}
override fun onPlayPrepare(request: KaraokePlayRequest) {
super.onPlayPrepare(request)
Logger.d(TAG, "onPlayPrepare $request")
//将音视频资源情况记录下来,PlayConsole不是sdk的API,其中类的功能需自行实现,不要直接用PlayConsole
if (!request.songInfoObject.oriUrl.isNullOrBlank()) {
PlayConsole.get().setAudioCount(MediaMetaInfo.AUDIO_ALL) //有原唱、伴奏
} else {
PlayConsole.get().setAudioCount(MediaMetaInfo.AUDIO_ONLY_ACC) //无原唱,仅有伴奏
}
//有无对应分辨率的视频资源
PlayConsole.get().setShow480P(request.songInfoObject.mv480Size > 0)
PlayConsole.get().setShow720P(request.songInfoObject.mv720Size > 0)
PlayConsole.get().setShow1080P(request.songInfoObject.mv1080Size > 0)
//音频有无HQ资源
PlayConsole.get().setIsShowHqAudio(request.songInfoObject.hasHq())
}
override fun onPlayStart(request: KaraokePlayRequest) {
Logger.d(TAG, "onPlayStart currentMid ${request.mid}")
//同步暂停状态
PlayConsole.get().pause.postValue(Pause(isPause = false, isFromPlayer = true))
updateQualityPlayPosition()
}
////播放开始后,根据记录的播放位置,调用播放器的seek.
private fun updateQualityPlayPosition() {
PlayConsole.get().changeQualityPlayPosition.value?.let {
Logger.d(TAG, "changeQualityPlayPosition $it")
if (it <= 0) {
return
}
playInfoVM.currPlayer()?.seek(it)
mHandler.postDelayed({
Logger.d(TAG, "changeQualityPlayPosition set it 0")
PlayConsole.get().changeQualityPlayPosition.postValue(0)
var content = ""
if (KtvPlayerConfig.getInstance().videoQuality == SongInfoModel.MV_1080P) {
content = "已切换为1080P"
}
if (KtvPlayerConfig.getInstance().videoQuality == SongInfoModel.MV_720P) {
content = "已切换为720P"
}
if (KtvPlayerConfig.getInstance().videoQuality == SongInfoModel.MV_480P) {
content = "已切换为480P"
}
KGToast.show(content)
}, 300)
}
}
//判断音频有无HQ资源
PlayConsole.get().setIsShowHqAudio(request.songInfoObject.hasHq())
//触发HQ切换
hqAudioButton.setOnClickListener {
PlayConsole.switchHqAudio()
}
//监听音质切换
PlayConsole.get().hqAudio.observe(viewLifecycleOwner) {
if (it.isSelected && KtvPlayerConfig.getInstance().audioQuality != SongInfoModel.AUDIO_QUALITY_HQ) {
KtvPlayerConfig.getInstance().audioQuality = SongInfoModel.AUDIO_QUALITY_HQ
playSong(playInfoVM.currPlayer()?.timeLineTime ?: 0)
KGToast.show(getString(R.string.ktv_control_hq_open))
} else if (!it.isSelected && KtvPlayerConfig.getInstance().audioQuality != SongInfoModel.AUDIO_QUALITY_NORMAL) {
KtvPlayerConfig.getInstance().audioQuality = SongInfoModel.AUDIO_QUALITY_NORMAL
playSong(playInfoVM.currPlayer()?.timeLineTime ?: 0)
KGToast.show(getString(R.string.ktv_control_hq_close))
}
}
private fun playSong(position: Long = 0) {
val builder = SongInfoObject.Builder()
builder.setMid(currentMid)
//设置歌曲类型,从SongType类取值
builder.setSongType(songType)
val songInfoObject = builder.build()
PlayConsole.get().changeQualityPlayPosition.postValue(position)
Logger.d(TAG, "set changeQualityPlayPosition position $position")
playInfoVM.waitQuerySongInfo().value = songInfoObject
PlayerManager.createPreLoader(playType)
.preload(songInfoObject) { event: PlayPreLoaderEvent ->
if (!isAdded) {
Logger.d(TAG, "playFragment invisible, not play")
return@preload
}
when (event) {
//预加载完成
is PlayPreLoaderEvent.Success -> {
//进行播放
playSong(it)
playInfoVM.preloadProgress().value = 100
}
}
is PlayPreLoaderEvent.Trace -> {
Logger.i(TAG, event.tracePrint())
}
is PlayPreLoaderEvent.Progress -> {
Logger.i(TAG, "preload $event")
playInfoVM.preloadProgress().value = event.progress
}
is PlayPreLoaderEvent.Failed -> {
Logger.i(TAG, "preload $event")
showErrorDialog(event.exception)
}
else -> {}
}
}
}