如何获取ExoPlayer中的音频流数据

770 阅读1分钟

需求: 如何获取 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()

即可处理音频数据。