支持SILK格式的ExoPlayer2拓展,另外也支持微信、QQ语音slk文件播放(本身就是SILK格式,多了个STX的字符)。
库里实现了Silk的Extractor和Render,用于解码播放。 创建Player时,传入自定义的 ExtractorsFactory 和 RenderFactory, 和其他音频一样使用播放即可。
添加JitPack仓库
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
添加依赖
dependencies {
implementation 'com.github.classops:exosilk:1.0'
}
class MyExtractorsFactory : ExtractorsFactory {
private val extractorsFactory = DefaultExtractorsFactory()
override fun createExtractors(): Array<Extractor> {
val list = arrayListOf<Extractor>(
SilkExtractor()
)
list.addAll(extractorsFactory.createExtractors())
return list.toTypedArray()
}
}class MyRendersFactory(context: Context) : DefaultRenderersFactory(context) {
init {
setExtensionRendererMode(EXTENSION_RENDERER_MODE_PREFER)
setMediaCodecSelector(object : MediaCodecSelector {
override fun getDecoderInfos(
mimeType: String,
requiresSecureDecoder: Boolean,
requiresTunnelingDecoder: Boolean
): MutableList<MediaCodecInfo> {
return MediaCodecSelector.DEFAULT.getDecoderInfos(
mimeType,
requiresSecureDecoder,
requiresTunnelingDecoder
)
}
})
}
override fun buildAudioRenderers(
context: Context,
extensionRendererMode: Int,
mediaCodecSelector: MediaCodecSelector,
enableDecoderFallback: Boolean,
audioSink: AudioSink,
eventHandler: Handler,
eventListener: AudioRendererEventListener,
out: ArrayList<Renderer>
) {
super.buildAudioRenderers(
context,
extensionRendererMode,
mediaCodecSelector,
enableDecoderFallback,
audioSink,
eventHandler,
eventListener,
out
)
out.add(
0,
SilkAudioRender(eventHandler, eventListener, audioSink)
)
}
}val player = ExoPlayer.Builder(
this,
MyRendersFactory(this),
DefaultMediaSourceFactory(this, MyExtractorsFactory())
).setTrackSelector(
DefaultTrackSelector(
this,
AdaptiveTrackSelection.Factory()
)
).build()其他,播放只需添加silk源,即可完成播放。具体可参考Demo。
- 注册 Extractor 完成原始帧的提取
- 添加 JNI SILK 库,注册 Decoder 实现 silk 的帧解码
- 添加 Render 完成 Decoder 的使用,并注册生效
本库来自个人的APP 我的语音包,功能是 QQ、微信语音替换变声,可以下载体验: