Потоковая передача ffmpeg напрямую диспетчеру - PullRequest
0 голосов
/ 24 июня 2019

Я пытаюсь воспроизводить музыку с помощью своего диска-диска и хочу использовать ffmpeg, чтобы указать начало музыки, которая прекрасно работает, но я могу только загрузить музыку с помощью ffmpeg и затем воспроизвести ее.Я хочу, чтобы ffmpeg обработал его, а затем передал его для воспроизведения музыки.

Вот код, который я использую для загрузки, а затем воспроизведения музыки:

message.member.voiceChannel.join().then((con, err) => {
    ytPlay.search_video(op, (id) => {
        let stream = ytdl("https://www.youtube.com/watch?v=" + id, {
            filter: "audioonly"
        });
        let audio = fs.createWriteStream('opStream.divx');

        proc = new ffmpeg({
            source: stream
        })
        proc.withAudioCodec('libmp3lame')
            .toFormat('mp3')
            .seekInput(35)
            .output(audio)
            .run();
        proc.on('end', function() {
            let input = fs.createReadStream('opStream.divx');
            console.log('finished');
            guild.queue.push(id);
            guild.isPlaying = true;
            guild.dispatcher = con.playStream(input);
        });
    });
})

Возможно ли это сделатьчто я хочу и если да, то как?

1 Ответ

0 голосов
/ 25 июня 2019

Да, это возможно, я сделал это в своем боте. Прежде всего вам необходимо установить ytdl-core

Затем создайте файл play.js, в котором будет находиться функция потока. Этот код будет: брать URL-адрес YouTube и транслировать его без загрузки песни, добавлять песню в очередь, заставлять бота уходить по окончании песни

Отредактируйте код для того, что вам нужно.

exports.run = async (client, message, args, ops) => {
    if (!message.member.voiceChannel) return message.channel.send('You are not connected to a voice channel!');


    if (!args[0]) return message.channel.send('Insert a URL!');
    let validate = await ytdl.validateURL(args[0]);

    let info = await  ytdl.getInfo(args[0]);

   let data = ops.active.get(message.guild.id) || {};
    if (!data.connection) data.connection = await message.member.voiceChannel.join();
    if(!data.queue) data.queue = [];
    data.guildID = message.guild.id;

    data.queue.push({
        songTitle: info.title,
        requester: message.author.tag,
        url: args[0],
        announceChannel: message.channel.id

    });

    if (!data.dispatcher) play(client, ops, data);
    else {
        message.channel.send(`Added to queue: ${info.title} | requested by: ${message.author.tag}`)
    }
    ops.active.set(message.guild.id, data);


}
async function play(client, ops, data) {
    client.channels.get(data.queue[0].announceChannel).send(`Now Playing: ${data.queue[0].songTitle} | Requested by: ${data.queue[0].requester}`);
    client.user.setActivity(`${data.queue[0].songTitle}`, {type: "LISTENING"});

    data.dispatcher = await data.connection.playStream(ytdl(data.queue[0].url, {filter: 'audioonly'}));
    data.dispatcher.guildID = data.guildID;

    data.dispatcher.once('end', function() {
        end(client, ops, this);

    });

}
function end(client, ops, dispatcher){

    let fetched = ops.active.get(dispatcher.guildID);

    fetched.queue.shift();

    if (fetched.queue.length > 0) {
        ops.active.set(dispatcher.guildID, fetched);
        play(client, ops, fetched);
    } else {
        ops.active.delete(dispatcher.guildID);

        let vc = client.guilds.get(dispatcher.guildID).me.voiceChannel;

        if (vc) vc.leave();


    }
  }
  module.exports.help = {
    name:"play"
  }``` 
...