Recherche avancée

Médias (1)

Mot : - Tags -/ticket

Autres articles (55)

  • Dépôt de média et thèmes par FTP

    31 mai 2013, par

    L’outil MédiaSPIP traite aussi les média transférés par la voie FTP. Si vous préférez déposer par cette voie, récupérez les identifiants d’accès vers votre site MédiaSPIP et utilisez votre client FTP favori.
    Vous trouverez dès le départ les dossiers suivants dans votre espace FTP : config/ : dossier de configuration du site IMG/ : dossier des média déjà traités et en ligne sur le site local/ : répertoire cache du site web themes/ : les thèmes ou les feuilles de style personnalisées tmp/ : dossier de travail (...)

  • Personnaliser en ajoutant son logo, sa bannière ou son image de fond

    5 septembre 2013, par

    Certains thèmes prennent en compte trois éléments de personnalisation : l’ajout d’un logo ; l’ajout d’une bannière l’ajout d’une image de fond ;

  • Changer le statut par défaut des nouveaux inscrits

    26 décembre 2015, par

    Par défaut, lors de leur inscription, les nouveaux utilisateurs ont le statut de visiteur. Ils disposent de certains droits mais ne peuvent pas forcément publier leurs contenus eux-même etc...
    Il est possible de changer ce statut par défaut. en "rédacteur".
    Pour ce faire, un administrateur webmestre du site doit aller dans l’espace privé de SPIP en ajoutant ecrire/ à l’url de son site.
    Une fois dans l’espace privé, il lui faut suivre les menus configuration > Interactivité et activer (...)

Sur d’autres sites (5888)

  • ffmpeg concat doesn't sync to manual frame by frame concatenation

    5 juillet 2022, par memo

    I have hundreds of short (10-120seconds) videos (H264 mp4) with audio (aac). (let's call these 'clips'). All identical video and audio codecs, resolution, framerate, crf, pixel format, sample rate etc.

    


    concat_demux :

    


    If I concat these with ffmpeg concat (demuxer), I get a single nice H264 mp4 with audio perfectly synced to the video (as expected).

    


    cmd_args = ['ffmpeg',
            '-f concat',
            '-safe 0',
            f'-i "{output_filelist_path}"',
            '-c copy',
            '-y',
            '-r 30', # trying this out of desperation
            f'"{output_concat_demux}"'
            ]

cmd = ' '.join(cmd_args)
r = subprocess.call(cmd, shell=True, cwd=args.output_dir)


    


    frame_by_frame :

    


    However, if I manually iterate every frame of every clip video and write the frames to an mp4 using skvideo.io, this video drifts out of sync with the concat_demux version.

    


    input_dict = { '-r':str(fps) } 
output_dict = { '-r':str(fps), '-pix_fmt':'yuv420p', '-vcodec':'libx264', '-crf':'18' }
video_writer = skvideo.io.FFmpegWriter(output_path, inputdict=input_dict, outputdict=output_dict) 

for video_path in video_paths:
   video = skvideo.io.vread(video_path) # read all frames into np.array
   for frame in video:
      video_writer.writeFrame(frame)
video_writer.close()


    


    When I compare these two files in a video editor (e.g. AfterEffects) and step through frame by frame, I can see that with every new clip, the frame_by_frame version slips 1 or 2 frames ahead of the ffmpeg concat_demux version. What is going on ? How can I fix - or at least debug - this ?

    


    On a side note, I do need to concatenate manually frame by frame, as I'm also doing a ton of other stuff (triggering events on clip change, overlaying additional elements etc). And I need to be able to sync a concatenated audio. I was hoping to concatenate the video manually frame by frame and do my post-processing, and then mux with the audio from the ffmpeg concat_demux version. But alas they drift out of sync.

    



    


    (I've found quite a few posts on SO where the problem is using ffmpeg concat results in videos which are out of sync with the audio. However, this is not my problem. My video created with ffmpeg concat is perfectly in sync with the audio, but it's out of sync with a manually frame-by-frame concatenated video.)

    



    


    Update - concat_protocol

    


    I've tried using the concat protocol. Now the output of this gives a file where the video is frame synced to the frame_by_frame version, BUT the audio is synced to the audio of the concat_demux version. So its audio is out of sync with the video.

    


    intermediate_paths = []
for p in clip_file_list:
    intermediate_path = os.path.join(args.output_dir, 'intermediate', os.path.basename(p) + '.ts')
    intermediate_paths.append(intermediate_path)
    cmd_args = ['ffmpeg',
        f'-i "{p}"',
        '-c copy -bsf:v h264_mp4toannexb -f mpegts -y',
        f'"{intermediate_path}"'
        ]

    cmd = ' '.join(cmd_args)
    r = subprocess.call(cmd, shell=True, cwd=args.output_dir)


intermediate_paths = '|'.join(intermediate_paths)
cmd_args = ['ffmpeg',
            f'-i "concat:{intermediate_paths}"',
            '-c copy -bsf:a aac_adtstoasc',
            f'"{output_concat_path}"'
            ]

cmd = ' '.join(cmd_args)
r = subprocess.call(cmd, shell=True, cwd=args.output_dir)


    


    I am getting loads of errors like below

    


        corrupt input packet in stream 0
[mp4 @ 0x137e043d0] Non-monotonous DTS in output stream 0:1; previous: 83027966, current: 83027198; changing to 83027967. This may result in incorrect timestamps in the output file.


    



    


    here's the info on the two output files. Input #0 is the ffmpeg concat_demux. Input #1 is the manual frame-by-frame. Note the concat.mp4 has a framerate of 29.94 fps. I'm not sure if this is the problem. I couldn't figure out how to make this 30 (see '-r 30' in the ffmpeg concat command above)

    


    ffmpeg version 5.0.1 Copyright (c) 2000-2022 the FFmpeg developers
  built with Apple clang version 13.1.6 (clang-1316.0.21.2.5)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.0.1_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'clips_concat.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf59.16.100
  Duration: 00:01:43.22, start: 0.000000, bitrate: 5412 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1080 [SAR 1:1 DAR 1:1], 5276 kb/s, 29.94 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'clips_frames.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf59.16.100
  Duration: 00:01:43.00, start: 0.000000, bitrate: 4917 kb/s
  Stream #1:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1080, 4914 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]


    



    


    here's info on first few clips (the manual concat is already 2 frames out of sync with the ffmpeg concat version by the second clip !)

    


    ffmpeg version 5.0.1 Copyright (c) 2000-2022 the FFmpeg developers
  built with Apple clang version 13.1.6 (clang-1316.0.21.2.5)
  configuration: --prefix=/opt/homebrew/Cellar/ffmpeg/5.0.1_2 --enable-shared --enable-pthreads --enable-version3 --cc=clang --host-cflags= --host-ldflags= --enable-ffplay --enable-gnutls --enable-gpl --enable-libaom --enable-libbluray --enable-libdav1d --enable-libmp3lame --enable-libopus --enable-librav1e --enable-librist --enable-librubberband --enable-libsnappy --enable-libsrt --enable-libtesseract --enable-libtheora --enable-libvidstab --enable-libvmaf --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx264 --enable-libx265 --enable-libxml2 --enable-libxvid --enable-lzma --enable-libfontconfig --enable-libfreetype --enable-frei0r --enable-libass --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libopenjpeg --enable-libspeex --enable-libsoxr --enable-libzmq --enable-libzimg --disable-libjack --disable-indev=jack --enable-videotoolbox --enable-neon
  libavutil      57. 17.100 / 57. 17.100
  libavcodec     59. 18.100 / 59. 18.100
  libavformat    59. 16.100 / 59. 16.100
  libavdevice    59.  4.100 / 59.  4.100
  libavfilter     8. 24.100 /  8. 24.100
  libswscale      6.  4.100 /  6.  4.100
  libswresample   4.  3.100 /  4.  3.100
  libpostproc    56.  3.100 / 56.  3.100
Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'clip_1080px_0.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:05.02, start: 0.000000, bitrate: 3944 kb/s
  Stream #0:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1080 [SAR 1:1 DAR 1:1], 3818 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #0:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 131 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Input #1, mov,mp4,m4a,3gp,3g2,mj2, from 'clip_1080px_1.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:05.02, start: 0.000000, bitrate: 4557 kb/s
  Stream #1:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1080 [SAR 1:1 DAR 1:1], 4438 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #1:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Input #2, mov,mp4,m4a,3gp,3g2,mj2, from 'clip_1080px_2.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:11.02, start: 0.000000, bitrate: 5447 kb/s
  Stream #2:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1080 [SAR 1:1 DAR 1:1], 5320 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #2:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Input #3, mov,mp4,m4a,3gp,3g2,mj2, from 'clip_1080px_3.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:11.02, start: 0.000000, bitrate: 5978 kb/s
  Stream #3:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1080 [SAR 1:1 DAR 1:1], 5851 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #3:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Input #4, mov,mp4,m4a,3gp,3g2,mj2, from 'clip_1080px_4.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:16.02, start: 0.000000, bitrate: 6570 kb/s
  Stream #4:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1080 [SAR 1:1 DAR 1:1], 6441 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #4:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Input #5, mov,mp4,m4a,3gp,3g2,mj2, from 'clip_1080px_5.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:13.02, start: 0.000000, bitrate: 5069 kb/s
  Stream #5:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1080 [SAR 1:1 DAR 1:1], 4940 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #5:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Input #6, mov,mp4,m4a,3gp,3g2,mj2, from 'clip_1080px_6.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:22.02, start: 0.000000, bitrate: 4775 kb/s
  Stream #6:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1080 [SAR 1:1 DAR 1:1], 4642 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #6:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]
Input #7, mov,mp4,m4a,3gp,3g2,mj2, from 'clip_1080px_7.mp4':
  Metadata:
    major_brand     : isom
    minor_version   : 512
    compatible_brands: isomiso2avc1mp41
    encoder         : Lavf58.29.100
  Duration: 00:00:22.02, start: 0.000000, bitrate: 5402 kb/s
  Stream #7:0[0x1](und): Video: h264 (High) (avc1 / 0x31637661), yuv420p(progressive), 1080x1080 [SAR 1:1 DAR 1:1], 5269 kb/s, 30 fps, 30 tbr, 15360 tbn (default)
    Metadata:
      handler_name    : VideoHandler
      vendor_id       : [0][0][0][0]
  Stream #7:1[0x2](und): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, stereo, fltp, 128 kb/s (default)
    Metadata:
      handler_name    : SoundHandler
      vendor_id       : [0][0][0][0]


    


  • Discord FFMPEG audio wont play from yt-dlp

    19 mars 2023, par user21236822

    My question is this : Why isn't my bot playing audio ?

    


    I want the bot to join, play audio from queue, then disconnect without downloading an mp3 file.

    


    I tried using youtube-dl, but I switched to the yt-dlp library after getting errors I couldn't fix.
I am running on Windows 10 locally. All my libraries are up to date.

    


    Here are my ydl_opts and FFMPEG_OPTS :

    


    ydl_opts = {
    'format': 'bestaudio/best',
    'postprocessors': [{
        'key': 'FFmpegExtractAudio',
        'preferredcodec': 'mp3',
        'preferredquality': '192',
    }],
}

FFMPEG_OPTIONS = {
    'before_options': '-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5',
    'options': '-vn'
} 


    


    Here is where I believe the problem is.

    


    async def play():
    print("Play Called")
    musicPlay()
    # Get message object from initial request
    message = ytLinkQue.get()
    print(f"Message object recieved: {message}")
    voiceChannel = message.author.voice.channel
    vc = await voiceChannel.connect()
    songsPlayed = 0
    
    while not ytLinkQue.empty():
        # Get current song
        currentSong = ytLinkQue.get()[0]
        print(f"Current song: {currentSong}")

        # Get song from Youtube
        with yt_dlp.YoutubeDL(ydl_opts) as ydl:
            # song = ydl.download(currentSong)
            info = ydl.extract_info(currentSong, download=False)
            song = info['formats'][0]['url']

        # Play Song
        vc.play(discord.FFmpegPCMAudio(song, **FFMPEG_OPTIONS), after=lambda e: print('Song done'))

        # Wait until the song has finished playing
        while vc.is_playing():
            print("playing rn")
            await asyncio.sleep(1)
    
    await vc.disconnect()
    musicStop()


    


    When play() is called, here is the output in terminal with my annotations as **** text **** :

    


    >python main.py&#xA;2023-02-17 15:21:09 INFO     discord.client logging in using static token&#xA;2023-02-17 15:21:10 INFO     discord.gateway Shard ID None has connected to Gateway (Session ID: 60b9fce14faa5daa4aed9eb6db01a74d).&#xA;Max que: 50&#xA;Text Channel: 828698708123451434&#xA;Testing Bot#4591 is ready.&#xA;Passing message object&#xA;**** play() funciton is called ****&#xA;Play Called&#xA;Message object recieved: <message channel="<TextChannel" position="7" nsfw="False" news="False"> type= author=<member discriminator="&#x27;0199&#x27;" bot="False" nick="&#x27;Fragnk7?&#x27;" guild="<Guild" chunked="True">> flags=<messageflags value="0">>&#xA;2023-02-17 15:21:16 INFO     discord.voice_client Connecting to voice...&#xA;2023-02-17 15:21:16 INFO     discord.voice_client Starting voice handshake... (connection attempt 1)&#xA;2023-02-17 15:21:17 INFO     discord.voice_client Voice handshake complete. Endpoint found seattle2004.discord.media&#xA;Current song: https://www.youtube.com/watch?v=vcAp4nmTZCA&#xA;[youtube] Extracting URL: https://www.youtube.com/watch?v=vcAp4nmTZCA &#xA;[youtube] vcAp4nmTZCA: Downloading webpage &#xA;[youtube] vcAp4nmTZCA: Downloading android player API JSON &#xA;**** Does not play any audio ****&#xA;Playing rn&#xA;Song done&#xA;2023-02-17 15:21:18 INFO     discord.player ffmpeg process 20700 successfully terminated with return code of 1.&#xA;2023-02-17 15:21:19 INFO     discord.voice_client The voice handshake is being terminated for Channel ID 400178308467392513 (Guild ID 261601676941721602)&#xA;2023-02-17 15:21:19 INFO     discord.voice_client Disconnecting from voice normally, close code 1000.&#xA;</messageflags></member></message>

    &#xA;

    On Discord's end, the bot successfully connects then disconnects after 2 second.

    &#xA;

    Note : I've only included code I think is relevant. Please let me know if I should add anything else to the post, otherwise, here is the github for the project. Code is in main.py.&#xA;https://github.com/LukeLeimbach/wallMomentMusic

    &#xA;

    Thank you in advance !

    &#xA;

    I've applied the advice from these posts but it still will not play audio :

    &#xA;

    -https://stackoverflow.com/questions/45770016/how-do-i-make-my-discord-bot-play-audio-from-youtube

    &#xA;

    -https://stackoverflow.com/questions/66070749/how-to-fix-discord-music-bot-that-stops-playing-before-the-song-is-actually-over?newreg=c70dd786cf5844e490045494223c0381

    &#xA;

    -https://stackoverflow.com/questions/57688808/playing-music-with-a-bot-from-youtube-without-downloading-the-file

    &#xA;

  • Pycord Music Bot : AttributeError : 'FFmpegAudio' object has no attribute '_process'

    5 juin 2022, par Steven Mao

    I've made a discord Cog that should be able to queue up and play music, but I'm getting an error from FFmpeg when I actually try to play the URL. I have found an identical question on StackOverflow, but this user's problem was a random typo. The inputs should all be correct, so I am not sure if the problem is my code or my package.

    &#xA;

    What have I done wrong ?

    &#xA;

    class MusicClass(commands.Cog):&#xA;    #universal attributes&#xA;    YDL_OPTIONS = {&#x27;format&#x27;: &#x27;bestaudio&#x27;, &#x27;noplaylist&#x27;: &#x27;True&#x27;}&#xA;    FFMPEG_OPTIONS = {&#x27;before_options&#x27;: &#x27;-reconnect 1 -reconnect_streamed 1 -reconnect_delay_max 5&#x27;, &#x27;options&#x27;: &#x27;-vn&#x27;}&#xA;&#xA;    def __init__(self, bot):&#xA;        self.bot = bot&#xA;        self.is_playing = False&#xA;        self.music_queue = [[],&#x27;&#x27;] #[[music1, music2, music3...], channel_obj]&#xA;        self.vc = &#x27;&#x27;&#xA;&#xA;    @commands.command()&#xA;    async def join(self, ctx):&#xA;        if not ctx.message.author.voice:&#xA;            await ctx.send("{} is not connected to a voice channel".format(ctx.message.author.name))&#xA;            return&#xA;        else:&#xA;            channel = ctx.message.author.voice.channel&#xA;        await channel.connect()&#xA;&#xA;    @commands.command()&#xA;    async def leave(self, ctx):&#xA;        voice_client = ctx.message.guild.voice_client&#xA;        if voice_client.is_connected():&#xA;            await voice_client.disconnect()&#xA;        else:&#xA;            await ctx.send("The bot is not connected to a voice channel.")&#xA;    &#xA;    #rtype: list[dict{str:}]&#xA;    #params: search string/web URL, top number of results to show&#xA;    #returns list of top 5 queries and their information&#xA;    def search_yt(self, search_query, num_results = 3):&#xA;        with YoutubeDL(self.YDL_OPTIONS) as ydl:&#xA;            try:&#xA;                top_results = ydl.extract_info(f"ytsearch{num_results}:{search_query}", download=False)[&#x27;entries&#x27;][0:{num_results}]&#xA;                for i in range(len(top_results)):&#xA;                    top_results[i] = {&#xA;                        &#x27;title&#x27;: top_results[i][&#x27;title&#x27;],&#xA;                        &#x27;source&#x27;: top_results[i][&#x27;formats&#x27;][0][&#x27;url&#x27;],&#xA;                        &#x27;channel&#x27;: top_results[i][&#x27;channel&#x27;],&#xA;                        &#x27;duration&#x27;: top_results[i][&#x27;duration&#x27;],&#xA;                        &#x27;url&#x27;: top_results[i][&#x27;webpage_url&#x27;]&#xA;                    }&#xA;            except:&#xA;                print(f&#x27;SEARCH_YT ERROR\t search="{search_query}"&#x27;)&#xA;                return False&#xA;            return top_results&#xA;    &#xA;    #rtype: None&#xA;    #looks at queue, decides whether to play the next song in queue or stop&#xA;    def play_next(self):&#xA;        print(&#x27;called play_next&#x27;)&#xA;        if len(self.music_queue) > 0:&#xA;            self.is_playing = True&#xA;            #assigns url AND removes from queue&#xA;            music_url = self.music_queue[0][0][&#x27;source&#x27;]&#xA;            self.music_queue[0].pop(0)&#xA;            self.vc.play(discord.FFmpegAudio(music_url, **self.FFMPEG_OPTIONS), after = lambda e: self.play_next())&#xA;        else:&#xA;            self.is_playing = False&#xA;&#xA;    #rtype: None&#xA;    #similar to play_next but optimized for first-time playing&#xA;    #checks if a song in queue &#x2B; checks if bot&#x27;s connected, then begins to play&#xA;    async def play_now(self):&#xA;        print(&#x27;called play_now, queue:&#x27;, self.music_queue[0])&#xA;        if len(self.music_queue) > 0:&#xA;            self.is_playing = True&#xA;            music_url = self.music_queue[0][0][&#x27;source&#x27;]&#xA;            if self.vc == &#x27;&#x27; or not self.vc.is_connected():&#xA;                self.vc = await self.music_queue[1].connect()&#xA;            else:&#xA;                print(&#x27;moving to new channel&#x27;)&#xA;                self.vc = await self.bot.move_to(self.music_queue[1])&#xA;            self.music_queue[0].pop(0)&#xA;&#xA;            #######################################################################################################&#xA;            print(&#x27;ERROR HAPPENS RIGHT HERE&#x27;)&#xA;            self.vc.play(discord.FFmpegAudio(music_url, **self.FFMPEG_OPTIONS), after = lambda e: self.play_next())&#xA;            #######################################################################################################&#xA;            &#xA;        else:&#xA;            self.is_playing = False&#xA;&#xA;    @commands.command()&#xA;    #dynamically checks for URL link or search query, then attempts to play&#xA;    async def p(self, ctx, *args):&#xA;        voice_channel = ctx.author.voice.channel&#xA;&#xA;        if voice_channel == None: #not in a VC&#xA;            await ctx.send(&#x27;You have to be in a voice channel first&#x27;)&#xA;            return&#xA;        else: #set channel, search and play music&#xA;            if self.music_queue[1] != voice_channel:&#xA;                self.music_queue[1] = voice_channel&#xA;            if args[0].startswith(&#x27;https://www.youtube.com/watch&#x27;): #search URL&#xA;                #search web_url directly and send object to music queue&#xA;                with YoutubeDL(self.YDL_OPTIONS) as ydl:&#xA;                    try:&#xA;                        print(&#x27;attempting to extract URL:&#x27;, args[0])&#xA;                        music_obj = ydl.extract_info(args[0], download=False)&#xA;                        music_obj = {&#xA;                        &#x27;title&#x27;: music_obj[&#x27;title&#x27;],&#xA;                        &#x27;source&#x27;: music_obj[&#x27;formats&#x27;][0][&#x27;url&#x27;],&#xA;                        &#x27;channel&#x27;: music_obj[&#x27;channel&#x27;],&#xA;                        &#x27;duration&#x27;: music_obj[&#x27;duration&#x27;],&#xA;                        &#x27;url&#x27;: music_obj[&#x27;webpage_url&#x27;]&#xA;                        }&#xA;                        print(&#x27;music object:&#x27;, music_obj)&#xA;                        print(&#x27;appending URL song queue&#x27;)&#xA;                        self.music_queue[0].append(music_obj)&#xA;                    except:&#xA;                        print(&#x27;URL search failed. URL =&#x27;, args[0])&#xA;            else: #search query, display search results, ask for which one, then add to queue&#xA;                num_results = args[len(args)-1] if args[len(args)-1].isdigit() else 3&#xA;                song_list = self.search_yt(&#x27; &#x27;.join(args), num_results)&#xA;            &#xA;            if not self.is_playing:&#xA;                await self.play_now()&#xA;

    &#xA;

    Now my error message...

    &#xA;

    Exception ignored in: <function at="at" 0x7ff4b0a5b5e0="0x7ff4b0a5b5e0">&#xA;Traceback (most recent call last):&#xA;  File "/home/stevenmao/.local/lib/python3.8/site-packages/discord/player.py", line 127, in __del__&#xA;    self.cleanup()&#xA;  File "/home/stevenmao/.local/lib/python3.8/site-packages/discord/player.py", line 247, in cleanup&#xA;    self._kill_process()&#xA;  File "/home/stevenmao/.local/lib/python3.8/site-packages/discord/player.py", line 198, in _kill_process&#xA;    proc = self._process&#xA;AttributeError: &#x27;FFmpegAudio&#x27; object has no attribute &#x27;_process&#x27;&#xA;</function>

    &#xA;