Interface for receiving audio from Discord voice channels
The AudioReceiveHandler interface is used to receive and process audio data from Discord voice channels.
Audio receiving requires Discord’s DAVE (Discord Audio Video Encryption) protocol. This feature requires special access and may have limited availability. See the Discord documentation for more information.
Called every 20 milliseconds when canReceiveEncoded() returns true
Provides raw Opus packets from individual users
Not combined audio - each user sends their own stream
Useful for lazy decoding or custom audio processing
Can be used with other receive modes simultaneously
Example:
@Overridepublic boolean canReceiveEncoded() { return true;}@Overridepublic void handleEncodedAudio(OpusPacket packet) { long userId = packet.getUserId(); int ssrc = packet.getSSRC(); byte[] opusAudio = packet.getOpusAudio(); // Store or process raw Opus data opusStorage.save(userId, opusAudio); // Or decode lazily when needed byte[] pcmAudio = packet.getAudioData(1.0);}
Here’s a complete example combining multiple receive modes:
public class MyAudioReceiveHandler implements AudioReceiveHandler { private final AudioRecorder recorder = new AudioRecorder(); private final Map<Long, UserAudioProcessor> userProcessors = new HashMap<>(); @Override public boolean canReceiveCombined() { return true; // Enable combined audio for recording } @Override public boolean canReceiveUser() { return true; // Enable user audio for individual processing } @Override public void handleCombinedAudio(CombinedAudio combinedAudio) { // Record all audio to a single file byte[] audioData = combinedAudio.getAudioData(1.0); recorder.write(audioData); } @Override public void handleUserAudio(UserAudio userAudio) { // Process each user's audio individually User user = userAudio.getUser(); byte[] audioData = userAudio.getAudioData(1.0); UserAudioProcessor processor = userProcessors.computeIfAbsent( user.getIdLong(), id -> new UserAudioProcessor(user) ); processor.processAudio(audioData); } @Override public boolean includeUserInCombinedAudio(User user) { // Exclude bots from combined recording return !user.isBot(); }}
// Create and register the handlerMyAudioReceiveHandler receiveHandler = new MyAudioReceiveHandler();AudioManager audioManager = guild.getAudioManager();audioManager.setReceivingHandler(receiveHandler);// Connect to a voice channelVoiceChannel channel = guild.getVoiceChannelById("123456789");audioManager.openAudioConnection(channel);// Audio will now be received via the handler methods