Белый шум, когда Exoplayer транслирует музыку в бот DiscordAndroid

Форум для тех, кто программирует под Android
Ответить Пред. темаСлед. тема
Anonymous
 Белый шум, когда Exoplayer транслирует музыку в бот Discord

Сообщение Anonymous »

Я пытаюсь передать аудиобайты боту Discord, но вместо музыки — много шума. Причём бот подключается успешно, кодек работает. Первое, что приходит на ум, это то, что я либо беру данные не там, либо неправильно передаю их боту. Более того, сам бот работает корректно, правильно подключается к голосовому каналу и даже распознаёт звуки, но не те. Я использую Exoplayer для воспроизведения локального mp3-файла на самом устройстве и в Discord. На самом телефоне играет без проблем
Требования к Discord Bot
Для работы с дискорд-ботами я использую Kord. Его требования к передаваемым данным описаны в документации:

Кадр 20-миллисекундных стереоаудиоданных 48k, закодированных Opus.
< /blockquote>
Настройки кодека
Исходя из этого, я установил следующие настройки кодека, согласно требованию:
@OptIn(UnstableApi::class)
class BotAudioProcessor(
private val audioDataListener: AudioDataListener
): BaseAudioProcessor(){
val codec = Opus()
val SAMPLE_RATE = Constants.SampleRate._48000()
val CHANNELS = Constants.Channels.stereo()
val APPLICATION = Constants.Application.audio()
val FRAME_SIZE = Constants.FrameSize._960()
val COMPLEXITY = Constants.Complexity.instance(10)
val BITRATE = Constants.Bitrate.max()

init {
codec.encoderInit(SAMPLE_RATE, CHANNELS, APPLICATION)
codec.encoderSetComplexity(COMPLEXITY)
codec.encoderSetBitrate(BITRATE)
}

override fun onConfigure(inputFormat: AudioProcessor.AudioFormat): AudioProcessor.AudioFormat {
val outputFormat = AudioProcessor.AudioFormat(
SAMPLE_RATE.v,
CHANNELS.v,
C.ENCODING_PCM_16BIT
)
return outputFormat
}
//... queueInput()
}

Здесь я задал все параметры, как того требует документация. Все эти значения были заданы через кодек, единственное, что я потратил час на расчет размера кадра
frame size = SAMPLE_RATE * 0.02 (20ms) = 960
Получение потокового аудио
Если я правильно понимаю, несжатые потоки PCM можно получить с помощью AudioProcessor, для этого я наследуюсь от BaseAudioProcessor и переопределяю метод queueInput, в котором Я кодирую буфер в формате Opus, а затем передаю его прослушивателю, который отправит поток боту Discord.
override fun queueInput(inputBuffer: ByteBuffer) {
if (inputBuffer.remaining() < FRAME_SIZE.v / 2) {
Log.e("BotAudioProcessor", "Input buffer too small")
return
}
val frame = ShortArray( FRAME_SIZE.v / 2)
inputBuffer.asShortBuffer().get(frame)
val encoded = codec.encode(frame, FRAME_SIZE)

audioDataListener.onAudioData(encoded!!.toByteArray())
}

Передача данных боту
Далее полученный аудиопоток сохраняется в переменной, которая затем транслируется ботом.
@UnstableApi
class MusicBot(...) : AudioDataListener {
private var audioData: ByteArray? = null
//...

@OptIn(KordVoice::class)
suspend fun start() {
kord!!.on {
//...
voiceChannel.connect {
audioProvider {
println(audioBuffer?.joinToString(" "))
println(audioBuffer?.size)
audioBuffer?.let { AudioFrame(it) }
}
}
}
}

override fun onAudioData(data: ByteArray) {
audioBuffer = data
}
}

Ссылки и дополнительно Вот как я подключаю его к плееру< /p>
@OptIn(UnstableApi::class)
class DiscordRendersFactory
(
context: Context,
private val audioDataListener: AudioDataListener
) : DefaultRenderersFactory(context) {

override fun buildAudioSink(
context: Context,
enableFloatOutput: Boolean,
enableAudioTrackPlaybackParams: Boolean
): AudioSink {

val defaultAudioSink = DefaultAudioSink.Builder()
.setAudioProcessors(arrayOf(BotAudioProcessor(audioDataListener)))
.setEnableFloatOutput(true)
.setEnableAudioTrackPlaybackParams(enableAudioTrackPlaybackParams)
.build()
return defaultAudioSink
}
}


Подробнее здесь: https://stackoverflow.com/questions/791 ... iscord-bot
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Белый шум, когда Exoplayer транслирует музыку в бот Discord
    Anonymous » » в форуме Android
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Музыкальный бот Discord, когда я пропускаю трек, бот пропускает сразу 2 трека
    Anonymous » » в форуме Python
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Бот Discord.py отправляет файл на канал Discord
    Anonymous » » в форуме Python
    0 Ответы
    30 Просмотры
    Последнее сообщение Anonymous
  • Как переписать обычного бота Discord в самостоятельный бот Discord?
    Anonymous » » в форуме Python
    0 Ответы
    23 Просмотры
    Последнее сообщение Anonymous
  • Модуль ошибок Django «Белый шум» не найден
    Anonymous » » в форуме Python
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Android»