我需要使用ExoPlayer实现音频通道映射,以便可以同时从两个耳机收听一个通道。
为此,我使用的是ChannelMappingAudioProcessor,它可以工作,除非我需要能够动态更改映射。
问题是,您可以在创建ExoPlayer的实例时定义处理器(我使用Dagger进行定义,并将其注入到ViewModel中),但是一旦创建了实例,就无法从实例中获取处理器/渲染器并对其进行修改。
播放器创建:
@Provides
@Singleton
fun provideMediaPlayer(application: Application): SimpleExoPlayer {
return ExoPlayerFactory.newSimpleInstance(
application,
object : DefaultRenderersFactory(application) {
override fun buildAudioProcessors(): Array<AudioProcessor> {
return arrayOf(ChannelMappingAudioProcessor().apply {
//left channel only
setChannelMap(intArrayOf(0, 0))
configure(DEVICE_AUDIO_SAMPLE_RATE, 2, C.ENCODING_PCM_16BIT)
})
}
},
DefaultTrackSelector(),
DefaultLoadControl.Builder()
.setBufferDurationsMs(10, 10, 4, 10)
.createDefaultLoadControl()
)
}播放器使用情况:
//stream audio from remote raspberry PI device
player.playStream(url)
//playStream()
fun SimpleExoPlayer.playStream(address: String) {
val mediaUri = Uri.parse(address)
val mediaSource = ProgressiveMediaSource.Factory(
DefaultHttpDataSourceFactory(
"${BuildConfig.APP_NAME}/${BuildConfig.VERSION_NAME} (Linux;Android ${Build.VERSION.RELEASE}) ${ExoPlayerLibraryInfo.VERSION_SLASHY}"
)
).createMediaSource(mediaUri)
this.prepare(mediaSource)
this.playWhenReady = true
}我希望能够动态地访问ChannelMappingAudioProcessor并重新配置它,这样我就可以在运行时更改通道映射。从this guy所写的来看,这应该是可能的。
发布于 2019-08-28 22:26:13
那么,如果您的处理器实现读取一个变量,那么它实际上是否应该处理某些东西或绕过处理器,这是可能的。AFAIK你不能改变处理器链和运行时,但是你可以通过配置绕过任何处理器。
把这个伪装的kotlin作为参考--我希望你能理解:
https://gist.github.com/l0rn/1c4808f260161d7a486277bdf50d008d
https://stackoverflow.com/questions/57688372
复制相似问题