【问题标题】:ExoPlayer: Custom AudioProcessor - EqualizerExoPlayer:自定义音频处理器 - 均衡器
【发布时间】:2020-03-10 11:19:33
【问题描述】:

我正在为 Android 开发基于 ExoPlayer 的媒体播放器,并且我正在尝试编写自己的均衡器。

我对 ExoPlayer 进行了相当深入的研究,并且我相信为了应用 Equalier 更改而操作样本的最佳位置是自定义 AudioProcessor

我以ChannelMappingAudioProcessor 为起点,并克隆了我认为的相关方面:

class EqualizerAudioProcessor : BaseAudioProcessor() {

        private lateinit var outputChannels: IntArray

        override fun configure(sampleRateHz: Int, channelCount: Int, encoding: Int): Boolean {
            outputChannels = IntArray(channelCount)
            for (i in 0 until channelCount) {
                outputChannels[i] = i
            }
            return true
        }

        override fun isActive(): Boolean {
            return true
        }

        override fun getOutputChannelCount(): Int {
            return outputChannels.size
        }

        override fun queueInput(inputBuffer: ByteBuffer) {
            var position = inputBuffer.position()
            val limit = inputBuffer.limit()
            val frameCount = (limit - position) / (2 * channelCount)
            val outputSize = frameCount * outputChannels.size * 2
            val buffer = replaceOutputBuffer(outputSize)
            while (position < limit) {
                for (element in outputChannels) {
                    var sample = inputBuffer.getShort(position + 2 * element)
                    // Todo: Manipulate sample
                    buffer.putShort(sample)
                }
                position += channelCount * 2
            }
            inputBuffer.position(limit)
            buffer.flip()
        }

        override fun onReset() {

        }
    }

似乎如果我enable 这个AudioProcessor,播放不会发生(它似乎停留在“暂停状态”,好像样本没有被传递,有趣的是,queueInput() 是没有调用。如果我禁用AudioProcessor,播放效果很好。

我希望有人能帮助我理解我是否在这里犯了错误,以及如何让它发挥作用。

作为参考,ExoPlayer 实例的初始化如下:

    private fun initPlayer(context: Context): ExoPlayer {

        val audioProcessor = EqualizerAudioProcessor()

        val renderersFactory = object : DefaultRenderersFactory(context) {
            override fun buildAudioProcessors(): Array<AudioProcessor> {
                return arrayOf(audioProcessor)
            }
        }

        val player: SimpleExoPlayer = ExoPlayerFactory.newSimpleInstance(
            context,
            renderersFactory,
            DefaultTrackSelector(),
            DefaultLoadControl()
        )

        player.addListener(object : Player.EventListener {
            override fun onPlayerStateChanged(playWhenReady: Boolean, playbackState: Int) {
                callback?.onPlayStateChanged(playWhenReady)
            }
        })

        return player
    }

提前致谢

【问题讨论】:

标签: android kotlin exoplayer2.x audio-processing


【解决方案1】:

问题是你必须在AudioProcessorconfigure()中调用setInputFormat(),否则queueInput()将不会被调用。

【讨论】:

    猜你喜欢
    • 2015-02-28
    • 2015-07-15
    • 1970-01-01
    • 2021-09-16
    • 2015-12-23
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多