需求: 如何获取 ExoPlayer 中的音频流数据?
ExoPlayer 版本: 2.18.5
通过自定义 AudioSink 来实现对音频数据的获取:
class CustomRenderFactory(context: Context, listener: TeeAudioProcessor.AudioBufferSink) : DefaultRenderersFactory(context) {
private val teeAudioProcessor = TeeAudioProcessor(listener)
private val aMProcessors = arrayOf<AudioProcessor>(teeAudioProcessor)
override fun buildAudioSink(context: Context, enableFloatOutput: Boolean, enableAudioTrackPlaybackParams: Boolean, enableOffload: Boolean): AudioSink {
return DefaultAudioSink.Builder()
.setAudioCapabilities(AudioCapabilities.getCapabilities(context))
.setEnableFloatOutput(enableFloatOutput)
.setEnableAudioTrackPlaybackParams(enableAudioTrackPlaybackParams)
.setAudioProcessors(aMProcessors)
.setOffloadMode(
if (enableOffload) {
DefaultAudioSink.OFFLOAD_MODE_ENABLED_GAPLESS_REQUIRED
} else {
DefaultAudioSink.OFFLOAD_MODE_DISABLED
}
)
.build()
}
}
在 ExoPlayer 的构造中加入:
val exoplayer = ExoPlayer.Builder(
context, CustomRenderFactory(context, object : TeeAudioProcessor.AudioBufferSink {
override fun flush(sampleRateHz: Int, channelCount: Int, encoding: Int) {
// todo 获取到播放器中的 音频采样率 音频声道 每个样本的大小
}
override fun handleBuffer(buffer: ByteBuffer) {
// 这边获取到的数据是 PCM 数据
val length = buffer.remaining()
val musicByteData = ByteArray(length)
buffer.get(musicByteData)
}
})).build()
即可处理音频数据。