es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cómo utilizar youtube_dl y FFMpegPCM audio para reproducir transmisiones en vivo de YouTube en Discord.py rewrite

He estado trabajando en un bot de música simple para Discord, y mis amigos solicitaron una función en la que puedas transmitir audio desde una transmisión en vivo de YouTube. Esto me ha dejado desconcertado, y no puedo encontrar ninguna fuente confiable para resolver esto. Aquí está el código importante:

from discord.ext import commands
from discord.ext import tasks
import discord
from itertools import cycle
import os
from dotenv import load_dotenv
import asyncio
from ytsearch import searchr
from discord.utils import get
from discord import FFmpegPCMAudio
from youtube_dl import YoutubeDL

list_to_play = []
paused = False

load_dotenv()
TOKEN = os.getenv("TOKEN")

bot = commands.Bot(command_prefix='-')
@bot.event
async def on_ready():
  for guild in bot.guilds:
    print(
    f'{bot.user} está conectado a los siguientes servidores:\n'
    f'{guild.name}(id: {guild.id})'
    )
  change_status.start()
  play_the_list.start()

status = cycle(['¡La música está aquí!', '¡Más características pronto!'])

@tasks.loop(seconds=10)
async def change_status():
  await bot.change_presence(activity=discord.Game(next(status)))

async def playa(ctx, url):
    YDL_OPTIONS = {'format': 'bestaudio', 'noplaylist': True}
    FFMPEG_OPTIONS = {'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}

    voice = get(bot.voice_clients, guild=ctx.guild)
    with YoutubeDL(YDL_OPTIONS) as ydl:
          info = ydl.extract_info(url, download=False)
          URL = info['url']
          voice.play(FFmpegPCMAudio(URL, **FFMPEG_OPTIONS))
          voice.is_playing()

@tasks.loop(seconds=3)
async def play_the_list():
  global list_to_play

  if paused == False:

    if len(list_to_play) != 0:
      ctx = list_to_play[0][1]

      voice = get(bot.voice_clients, guild=ctx.guild)
      if voice.is_playing() == False:

        if len(list_to_play) != 0:
          await playa(list_to_play[0][1], list_to_play[0][0])
          del list_to_play[0]

bot.run(TOKEN) 

Estoy buscando algo similar a playa() (o formas de editar playa() para que reproduzca videos en vivo).

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para reproducir audio de una transmisión en vivo de YouTube en la función playa(), puedes modificar el diccionario YDL_OPTIONS para incluir la opción 'livestream': True. Esto le indicará a YoutubeDL que trate el video como una transmisión en vivo.

    Aquí tienes un ejemplo de la función playa() modificada:

    async def playa(ctx,url):
        YDL_OPTIONS = {'format': 'bestaudio', 'noplaylist': True, 'livestream': True}
        FFMPEG_OPTIONS = {
              'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5', 'options': '-vn'}
    
        voice = get(bot.voice_clients, guild=ctx.guild)
        with YoutubeDL(YDL_OPTIONS) as ydl:
              info = ydl.extract_info(url, download=False)
              URL = info['url']
              voice.play(FFmpegPCMAudio(URL, **FFMPEG_OPTIONS))
              voice.is_playing()
    

    Ten en cuenta que esta solución asume que la transmisión en vivo de YouTube está transmitiendo solo audio, y no una transmisión de video completa. Si la transmisión en vivo incluye video, deberás modificar las FFMPEG_OPTIONS para incluir también opciones de video.

Comments are closed.