首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >没有在不和谐的声音频道播放的音乐

没有在不和谐的声音频道播放的音乐
EN

Stack Overflow用户
提问于 2022-02-10 17:13:00
回答 1查看 347关注 0票数 0

我正试图把播放音乐的功能添加到我的自定义不和谐机器人中。我正在用Java11、Spring、Discord4j和LavaPlayer库编写它。

我有命令!加入,这会使不和谐的机器人加入输入命令的人的声音通道。这是可行的,但一旦机器人加入,我就将LavaPlayerAudioProvider分配给VoiceState。所以这个错误可能会发生在这里(我不知道)。这是用于!join命令的类:

代码语言:javascript
复制
@RequiredArgsConstructor
public class JoinCommandHandler implements CommandStrategy {
    private final LavaPlayerAudioProvider provider;

    /**
     * {@inheritDoc}
     * <p>
     * Makes the bot join the voice channel of the user.
     */
    @Override
    public Mono<Void> execute(Message message) {
        return Mono.just(message)
                .flatMap(Message::getAuthorAsMember)
                .flatMap(m -> m.getVoiceState()
                        .flatMap(VoiceState::getChannel))
                .flatMap(c -> c.join(spec -> spec.setProvider(provider)))
                .then();
    }

    @Override
    public String getCommandName() {
        return "!join";
    }

    @Override
    public String getDescription() {
        return "**Under Development** Make this bot join your channel.";
    }
}

老实说,我不认为这个错误会出现在!join命令中,但是更多地理解这个问题可能是有用的。

我在AudioConfig类中设置了如下所示的音频配置:

代码语言:javascript
复制
@Configuration
public class AudioConfig {
    @Bean
    public AudioPlayerManager audioPlayerManager() {
        final AudioPlayerManager playerManager = new DefaultAudioPlayerManager();
        playerManager.getConfiguration().setFrameBufferFactory(NonAllocatingAudioFrameBuffer::new);
        AudioSourceManagers.registerLocalSource(playerManager);
        return playerManager;
    }

    @Bean
    public AudioPlayer audioPlayer() {
        return audioPlayerManager().createPlayer();
    }

    @Bean
    public AudioProvider audioProvider() {
        return new LavaPlayerAudioProvider(audioPlayer());
    }
}

我写了一个!play youtube url命令来播放音乐,一旦机器人加入了一个语音频道。

代码语言:javascript
复制
@Service("!play")
@RequiredArgsConstructor
public class PlayCommand implements CommandStrategy {
    private final AudioPlayerManager manager;
    private final TrackScheduler trackScheduler;

    /**
     * {@inheritDoc}
     * <p>
     * Makes the bot queue a song and play in the channel.
     */
    @Override
    public Mono<Void> execute(Message message) {
        return Mono.just(message.getContent())
                .map(content -> Arrays.asList(content.split(" ")))
                .doOnNext(command -> manager.loadItem(command.get(1), trackScheduler)).then();
    }
}

在这里,LavaPlayerAudioProviver提供音乐:

代码语言:javascript
复制
@Component
public final class LavaPlayerAudioProvider extends AudioProvider {
    private final AudioPlayer audioPlayer;
    private final MutableAudioFrame frame = new MutableAudioFrame();

    public LavaPlayerAudioProvider(AudioPlayer audioPlayer) {
        super(ByteBuffer.allocate(StandardAudioDataFormats.DISCORD_OPUS.maximumChunkSize()));
        this.frame.setBuffer(getBuffer());
        this.audioPlayer = audioPlayer;
    }

    @Override
    public boolean provide() {
        final boolean didProvide = audioPlayer.provide(frame);
        if (didProvide) {
            getBuffer().flip();
        }
        return didProvide;
    }
}

现在来了一个棘手的部分。我对代码进行了调试,以便在输入了!play url命令之后,逐步了解代码是如何执行的。

当代码到达TrackScheduler类时,它不会执行trackLoaded()方法来播放歌曲,而是执行noMatches()方法,这基本上意味着无法找到URL,因此无法播放音乐。您可以在这里找到TrackScheduler类:

代码语言:javascript
复制
@Component
@RequiredArgsConstructor
public class TrackScheduler implements AudioLoadResultHandler {
    private final AudioPlayer player;

    @Override
    public void trackLoaded(final AudioTrack track) {
        // LavaPlayer found an audio source for us to play
        player.playTrack(track);
    }

    @Override
    public void playlistLoaded(final AudioPlaylist playlist) {
        // LavaPlayer found multiple AudioTracks from some playlist
    }

    @Override
    public void noMatches() {
        // LavaPlayer did not find any audio to extract
    }

    @Override
    public void loadFailed(final FriendlyException exception) {
        // LavaPlayer could not parse an audio source for some reason
    }
}

我尝试了不同的URL,但它们最终都进入了noMatch()方法.我遵循了Discord4J指南(https://docs.discord4j.com/music-bot-tutorial),但是他们没有使用Spring,所以这是一个小小的谜团。

如果你需要更多的信息,我很乐意给你。谢谢,伙计们!

EN

回答 1

Stack Overflow用户

发布于 2022-07-09 16:07:35

好吧,我知道有点晚了,但给你。

您的问题是,您只注册本地源的音频播放器。这意味着,lavaplayer不知道Facebook、Youtube或Vimeo这样的网站是什么,也不知道如何处理它们。

应该将AudioSourceManagers.registerRemoteSources(audioPlayerManager);添加到配置类中。

因此,最终的配置类将如下所示:

代码语言:javascript
复制
@Configuration
public class AudioConfig {
    @Bean
    public AudioPlayerManager audioPlayerManager() {
        final AudioPlayerManager playerManager = new DefaultAudioPlayerManager();
        playerManager.getConfiguration().setFrameBufferFactory(NonAllocatingAudioFrameBuffer::new);
        AudioSourceManagers.registerLocalSource(playerManager);
        AudioSourceManagers.registerRemoteSources(audioPlayerManager);
        return playerManager;
    }

    @Bean
    public AudioPlayer audioPlayer() {
        return audioPlayerManager().createPlayer();
    }

    @Bean
    public AudioProvider audioProvider() {
        return new LavaPlayerAudioProvider(audioPlayer());
    }
}

除此之外,你的代码对我来说也很好。我建议完全删除AudioSourceManagers.registerLocalSource(playerManager);,我看不出有什么理由以这种方式公开服务器端文件。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71069426

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档