ExoPlayer:自定义AudioProcessor-均衡器

问题描述 投票:1回答:1

我正在为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() {

        }
    }

[似乎,如果我enableAudioProcessor,则不会发生播放(它似乎停留在“暂停状态”,就像没有传递样本一样,有趣的是,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个回答
0
投票

问题是您必须在setInputFormat()configure()中调用AudioProcessor,否则将不会调用queueInput()

© www.soinside.com 2019 - 2024. All rights reserved.