全民K歌IOT开放平台
  1. KtvSDK3.0接入说明
全民K歌IOT开放平台
  • 厂商合作流程
  • 快速接入K歌开放平台流程
  • SDK bug提单规范
  • 如何在线调试接口
  • 常见问题FAQ
  • 开放平台API错误码说明
  • 开放平台接入指南
    • 登录鉴权方式介绍V2(推荐)
    • 如何申请接入
    • CDK权限申请流程
    • 暗账号绑定明账号对接文档
    • 获取应用级token
    • 获取登录二维码
    • 查询二维码的状态
    • 获取用户级token
    • 刷新用户级token
    • 暗账号解绑K歌uid
    • 获取暗账号绑定信息
  • KtvSDK3.0接入说明
    • 厂商合作流程
    • bug提单规范
    • KtvSDK-接入指南
    • KtvSDK-打分
    • KtvSDK-登录
    • KtvSDK-歌词
    • KtvSDK-播放
    • 多屏一起唱---歌词与打分适配
    • 3.0新打分样式及五维打分
    • KtvSDK-多屏渲染
    • KtvSDK-2.0升级到3.0版本迁移指南
    • KtvSDK-3.0版本新功能
    • KtvSDK-Android4.4设备G2证书兼容处理
    • KtvSDK-播放页实现示例
    • KtvSDK-常见问题FAQ
    • KtvSDK-低性能设备处理
    • KtvSDK-反馈
    • KtvSDK-缓存管理
    • KtvSDK-切换音频视频清晰度
    • KtvSDK-跳过前奏
    • Ktv支付-米大师支付
    • 播放失败错误码说明
    • 作品录音、合成与播放2.0版
  • 基础类
    • tagId对照表
    • 歌曲详情
    • 查询mv的播放地址
    • 搜索
    • 搜索联想
    • 查询歌手歌曲
    • 获取歌曲歌词文件
    • Q音歌曲mid映射K歌
    • 短剧播放链接
    • 查询应用限免配置
    • 转换Q音或酷狗歌曲ID
  • 运营类
    • 排行榜id说明
    • 获取城市id列表
    • 获取专题分类列表
    • 获取云端配置
    • 热门ugc
    • 热搜词
    • 排行榜
    • 获取专题下歌曲信息
    • 获取车联渠道映射
    • 热门推荐
    • (新)排行榜
    • 综合歌单列表查询
    • 设置缓存设备
    • TV版分类歌单列表
    • 获取用户协议
    • 综合歌单列表查询(海外)
    • 榜单列表查询(海外)
    • 自建歌单列表查询(海外)
    • 获取广告配置
    • 拉取短剧合集的列表
  • 用户类
    • 用户信息查询
    • 删除用户UGC作品
    • 获取推荐/翻唱作品
    • 获取同城作品
    • 用户作品列表
    • 获取好友作品
    • UGC作品详情
    • 更改作品访问权限
    • 用户个推歌单
  • 支付类
    • 支付接入流程
    • 订单发货使用简述
    • 开通设备会员限免简述
    • 订单发货中通用sign计算规则
    • 通用返回结构
    • 【CDK】CDK兑换
    • 【CDK】生成CDK
    • 【CDK】CDK召回
    • 【CDK】CDK状态查询
    • 【三方支付】订单发货
    • 【三方支付】手机号发货
    • 【三方支付】订单状态查询
    • 【米大师支付】获取会员商品列表
    • 【米大师支付】未登录-查询会员商品列表
    • 【米大师支付】支付下单
    • 【米大师支付】支付成功通知
    • 【米大师支付】查询用户支付成功订单记录
    • 查询设备以及用户是否有赠送资格
    • 查询设备限免剩余时长
    • 设备会员迁移
    • 查询会员赠送时长
    • 同步支付订单接口
    • 【三方支付】存量会员迁移领取查询
    • 【三方支付】存量会员迁移接口
    • 授权设备体验会员
    • 查询用户会员信息
    • 【三方支付】超会发货
    • 取消授权设备体验会员
  • 用户作品-文件类
    • callback_url说明
    • 上传音频源文件
    • (服务端)上传音频作品的链接
  • 通用类
    • 【厂商定制】匹配搜索
    • 获取kg的短链接
  1. KtvSDK3.0接入说明

KtvSDK-切换音频视频清晰度

****支持在播放过程中实时切换音频、视频的清晰度。
限制:播放中实时切换清晰度后,已录制的人声信息会被破坏,会影响作品合成功能。

音视频清晰度的值#

    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)

实时切换视频清晰度流程#

总体流程:记录当前播放位置,设置清晰度,重新preload和播放,然后seek到指定位置。
//切换清晰度前记录播放位置,**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))
            }
        }

播放代码示例:playSong#

播放详见"KtvSDK-接入指南"的3.4节。
    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 -> {}
                }
            }

    }
修改于 2025-09-01 07:13:43
上一页
KtvSDK-缓存管理
下一页
KtvSDK-跳过前奏
Built with