音楽プレーヤー

オーディオプレーヤーは、音声接続を越えて音声を再生するために使用することができます。 1台のオーディオプレーヤーで、複数の音声接続で同じ音声を再生することができます。

チートシート

クリエーション

オーディオプレーヤーの作成は簡単です。

const { createAudioPlayer } = require('@discordjs/voice');

const player = createAudioPlayer();
1
2
3

また、オーディオプレーヤーの動作をカスタマイズすることも可能です。 例えば、オーディオ・プレーヤーのアクティブな購読者がいない場合、デフォルトの動作は一時停止になります。 この動作は、一時停止、停止、または単にストリームの再生を継続するように設定することができます。

const { createAudioPlayer, NoSubscriberBehavior } = require('@discordjs/voice');

const player = createAudioPlayer({
    behaviors: {
        noSubscriber: NoSubscriberBehavior.Pause,
    },
});
1
2
3
4
5
6
7

削除

オーディオプレーヤーが不要になったら、stop()して、参照を削除し、ガベージコレクションされるようにすることができます。

player.stop();
1

オーディオの再生

オーディオリソースを作成し、オーディオプレーヤーで再生することができます。

const resource = createAudioResource('/home/user/voice/track.mp3');
player.play(resource);

// Play "track.mp3" across two voice connections
connection1.subscribe(player);
connection2.subscribe(player);
1
2
3
4
5
6

**オーディオプレーヤーは最大1つのオーディオリソースを再生することができます。**同じプレーヤーで既に1つのオーディオリソースが再生されているときに別のオーディオリソースを再生しようとすると、既存のものは破壊されて新しいものと入れ替わります。 :::

ポーズ/アンポーズ

pause()unpause()のメソッドを呼び出すことができます。 オーディオプレーヤーが一時停止している間は、音声は再生されません。 再開されると、中断したところから継続されます。

player.pause();

// Unpause after 5 seconds
setTimeout(() => player.unpause(), 5_000);
1
2
3
4

ライフサイクル

音声接続には独自のライフサイクルがあり、5つの状態に分かれています。 life cycles の項で説明した方法に従って、音声接続の変更を購読することができます。

  • Idle - オーディオプレーヤーの初期状態。 オーディオプレーヤーは、再生するオーディオリソースがない場合、この状態になる。

  • Buffering - オーディオプレーヤーがオーディオリソースを再生可能になるのを待っている間の状態です。 オーディオプレーヤーは、この状態からPlaying状態(成功)またはIdle状態(失敗)のいずれかに遷移することが可能である。

  • Playing - 音声接続がオーディオリソースをアクティブに再生しているときに入る状態です。 オーディオリソースが終了すると、オーディオプレーヤーはIdle状態に遷移する。

  • AutoPaused - 再生するアクティブな音声接続がないため、プレーヤーが一時停止したときに、音声接続が入る状態です。 これは、noSubscriberの動作がPauseに設定されている場合のみ可能です。 少なくとも1つの接続が再び可能になると、自動的に再生中に戻ります。

  • Paused - ユーザーによって一時停止されたときに音声接続が入る状態です。

const { AudioPlayerStatus } = require('@discordjs/voice');

player.on(AudioPlayerStatus.Playing, () => {
    console.log('The audio player has started playing!');
});
1
2
3
4
5

エラー処理

オーディオプレーヤーに再生するオーディオリソースが与えられると、オーディオリソースからエラーが伝搬されるので、それを処理する必要があります。

エラーハンドラでは、新しいオーディオリソースを再生するか、再生を停止するかを選択することができます。 何もしないとオーディオプレーヤーは勝手に停止してアイドル状態に戻ります。

さらに、エラーオブジェクトにはresourceプロパティが含まれ、どのオーディオリソースがエラーを発生させたかを把握するのに役立ちます。

エラーの処理方法について、2つの異なる例を以下に示します。

エラーハンドラ内でアクションを起こす

この例では、オーディオプレーヤーは、エラーが発生した場合のみ、次のオーディオリソースの再生に移行します。 再生が優雅に終了しても、何も起こりません。 この例では、Idle状態への遷移を回避しています。

const { createAudioResource } = require('@discordjs/voice');

const resource = createAudioResource('/home/user/voice/music.mp3', {
    metadata: {
        title: 'A good song!',
    },
});

player.play(resource);

player.on('error', error => {
    console.error(`Error: ${error.message} with resource ${error.resource.metadata.title}`);
    player.play(getNextResource());
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14

Idle 状態の中でアクションを起こすこと

この例では、エラーイベントはロギングにのみ使用されます。 オーディオプレーヤーは自然にアイドル状態に遷移し、別のリソースが再生される。 これは、優雅に終了するストリームと、エラーによって中断されるストリームを扱うことができるという利点があります。

const { createAudioResource } = require('@discordjs/voice');

const resource = createAudioResource('/home/user/voice/music.mp3', {
    metadata: {
        title: 'A good song!',
    },
});

player.play(resource);

player.on('error', error => {
    console.error(error);
});

player.on(AudioPlayerStatus.Idle, () => {
    player.play(getNextResource());
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Last Updated: 2022/7/3 8:16:39