Recherche avancée

Médias (91)

Autres articles (66)

  • Des sites réalisés avec MediaSPIP

    2 mai 2011, par

    Cette page présente quelques-uns des sites fonctionnant sous MediaSPIP.
    Vous pouvez bien entendu ajouter le votre grâce au formulaire en bas de page.

  • Gestion des droits de création et d’édition des objets

    8 février 2011, par

    Par défaut, beaucoup de fonctionnalités sont limitées aux administrateurs mais restent configurables indépendamment pour modifier leur statut minimal d’utilisation notamment : la rédaction de contenus sur le site modifiables dans la gestion des templates de formulaires ; l’ajout de notes aux articles ; l’ajout de légendes et d’annotations sur les images ;

  • Keeping control of your media in your hands

    13 avril 2011, par

    The vocabulary used on this site and around MediaSPIP in general, aims to avoid reference to Web 2.0 and the companies that profit from media-sharing.
    While using MediaSPIP, you are invited to avoid using words like "Brand", "Cloud" and "Market".
    MediaSPIP is designed to facilitate the sharing of creative media online, while allowing authors to retain complete control of their work.
    MediaSPIP aims to be accessible to as many people as possible and development is based on expanding the (...)

Sur d’autres sites (8512)

  • libav ffmpeg codec copy rtp_mpegts streaming with very bad quality

    27 décembre 2017, par Dinkan

    I am trying to do codec copy of a stream(testing with file now & later
    going to use live stream) with format rtp_mpegts over network & play
    using VLC player. Started my proof of concept code with slightly
    modified remuxing.c in the examples.

    I am essentially trying to do is to replicate
    ./ffmpeg -re -i TEST_VIDEO.ts -acodec copy -vcodec copy -f rtp_mpegts
    rtp ://239.245.0.2:5002

    Streaming is happening, but the quality is terrible.
    Looks like many frames are skipped plus streaming is happening really
    slow(buffer underflow reported by VLC player)

    File plays perfectly fine directly on VLC player.
    Please help.

    Stream details.
    Input #0, mpegts, from ' TEST_VIDEO.ts':
     Duration: 00:10:00.40, start: 41313.400811, bitrate: 2840 kb/s
     Program 1
       Stream #0:0[0x11]: Video: h264 (High) ([27][0][0][0] / 0x001B),
    yuv420p(tv, bt709, top first), 1440x1080 [SAR 4:3 DAR 16:9], 29.97
    fps, 59.94 tbr, 90k tbn, 59.94 tbc
       Stream #0:1[0x14]: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz,
    stereo, fltp, 448 kb/s
    Output #0, rtp_mpegts, to 'rtp://239.255.0.2:5004':
     Metadata:
       encoder         : Lavf57.83.100
       Stream #0:0: Video: h264 (High) ([27][0][0][0] / 0x001B),
    yuv420p(tv, bt709, top first), 1440x1080 [SAR 4:3 DAR 16:9], q=2-31,
    29.97 fps, 59.94 tbr, 90k tbn, 29.97 tbc
       Stream #0:1: Audio: ac3 (AC-3 / 0x332D4341), 48000 Hz, stereo,
    fltp, 448 kb/s
    Stream mapping:
     Stream #0:0 -> #0:0 (copy)
     Stream #0:1 -> #0:1 (copy)
    Press [q] to stop, [?] for help
    frame=  418 fps=5.2 q=-1.0 size=    3346kB time=00:00:08.50
    bitrate=3223.5kbits/s speed=0.106x

    My complete source code(This is almost same as remuxing.c)

    #include <libavutil></libavutil>timestamp.h>
    #include <libavformat></libavformat>avformat.h>

    static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket
    *pkt, const char *tag)
    {
       AVRational *time_base = &amp;fmt_ctx->streams[pkt->stream_index]->time_base;

       printf("%s: pts:%s pts_time:%s dts:%s dts_time:%s duration:%s
    duration_time:%s stream_index:%d\n",
              tag,
              av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, time_base),
              av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, time_base),
              av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, time_base),
              pkt->stream_index);
    }


    int main(int argc, char **argv)
    {
       AVOutputFormat *ofmt = NULL;
       AVFormatContext *ifmt_ctx = NULL, *ofmt_ctx = NULL;
       AVPacket pkt;
       const char *in_filename, *out_filename;
       int ret, i;
       int stream_index = 0;
       int *stream_mapping = NULL;
       int stream_mapping_size = 0;
       AVRational mux_timebase;
       int64_t start_time = 0; //(of->start_time == AV_NOPTS_VALUE) ? 0 :
    of->start_time;
       int64_t ost_tb_start_time = 0; //av_rescale_q(start_time,
    AV_TIME_BASE_Q, ost->mux_timebase);

       if (argc &lt; 3) {
           printf("usage: %s input output\n"
                  "API example program to remux a media file with
    libavformat and libavcodec.\n"
                  "The output format is guessed according to the file extension.\n"
                  "\n", argv[0]);
           return 1;
       }

       in_filename  = argv[1];
       out_filename = argv[2];

       av_register_all();
       avcodec_register_all();
       avformat_network_init();

       if ((ret = avformat_open_input(&amp;ifmt_ctx, in_filename, 0, 0)) &lt; 0) {
           fprintf(stderr, "Could not open input file '%s'", in_filename);
           goto end;
       }

       if ((ret = avformat_find_stream_info(ifmt_ctx, 0)) &lt; 0) {
           fprintf(stderr, "Failed to retrieve input stream information");
           goto end;
       }

       av_dump_format(ifmt_ctx, 0, in_filename, 0);

       avformat_alloc_output_context2(&amp;ofmt_ctx, NULL, "rtp_mpegts", out_filename);
       if (!ofmt_ctx) {
           fprintf(stderr, "Could not create output context\n");
           ret = AVERROR_UNKNOWN;
           goto end;
       }

       stream_mapping_size = ifmt_ctx->nb_streams;
       stream_mapping = av_mallocz_array(stream_mapping_size,
    sizeof(*stream_mapping));
       if (!stream_mapping) {
           ret = AVERROR(ENOMEM);
           goto end;
       }

       ofmt = ofmt_ctx->oformat;

       for (i = 0; i &lt; ifmt_ctx->nb_streams; i++)
       {
           AVStream *out_stream;
           AVStream *in_stream = ifmt_ctx->streams[i];
           AVCodecParameters *in_codecpar = in_stream->codecpar;

           if (in_codecpar->codec_type != AVMEDIA_TYPE_AUDIO &amp;&amp;
               in_codecpar->codec_type != AVMEDIA_TYPE_VIDEO &amp;&amp;
               in_codecpar->codec_type != AVMEDIA_TYPE_SUBTITLE) {
               stream_mapping[i] = -1;
               continue;
           }

           stream_mapping[i] = stream_index++;


           out_stream = avformat_new_stream(ofmt_ctx, NULL);
           if (!out_stream) {
               fprintf(stderr, "Failed allocating output stream\n");
               ret = AVERROR_UNKNOWN;
               goto end;
           }

           //out_stream->codecpar->codec_tag = 0;
           if (0 == out_stream->codecpar->codec_tag)
           {
               unsigned int codec_tag_tmp;

               if (!out_stream->codecpar->codec_tag ||
                   av_codec_get_id (ofmt->codec_tag,
    in_codecpar->codec_tag) == in_codecpar->codec_id ||
                   !av_codec_get_tag2(ofmt->codec_tag,
    in_codecpar->codec_id, &amp;codec_tag_tmp))
                   out_stream->codecpar->codec_tag  = in_codecpar->codec_tag;
           }
           //ret = avcodec_parameters_to_context(ost->enc_ctx, ist->st->codecpar);

           ret = avcodec_parameters_copy(out_stream->codecpar, in_codecpar);
           if (ret &lt; 0) {
               fprintf(stderr, "Failed to copy codec parameters\n");
               goto end;
           }
           //out_stream->codecpar->codec_tag = codec_tag;
           // copy timebase while removing common factors

           printf("bit_rate %lld sample_rate %d frame_size %d\n",
                  in_codecpar->bit_rate, in_codecpar->sample_rate,
    in_codecpar->frame_size);

           out_stream->avg_frame_rate = in_stream->avg_frame_rate;

           ret = avformat_transfer_internal_stream_timing_info(ofmt,

    out_stream, in_stream,
                                                               AVFMT_TBCF_AUTO);
           if (ret &lt; 0) {
               fprintf(stderr,
    "avformat_transfer_internal_stream_timing_info failed\n");
               goto end;
           }

           if (out_stream->time_base.num &lt;= 0 || out_stream->time_base.den &lt;= 0)
               out_stream->time_base =
    av_add_q(av_stream_get_codec_timebase(out_stream), (AVRational){0,
    1});

           // copy estimated duration as a hint to the muxer
           if (out_stream->duration &lt;= 0 &amp;&amp; in_stream->duration > 0)
               out_stream->duration = av_rescale_q(in_stream->duration,
    in_stream->time_base, out_stream->time_base);

           // copy disposition
           out_stream->disposition = in_stream->disposition;

           out_stream->sample_aspect_ratio = in_stream->sample_aspect_ratio;
           out_stream->avg_frame_rate = in_stream->avg_frame_rate;
           out_stream->r_frame_rate = in_stream->r_frame_rate;

           if ( in_codecpar->codec_type == AVMEDIA_TYPE_VIDEO)
           {

               mux_timebase = in_stream->time_base;
           }


           if (in_stream->nb_side_data) {
               for (i = 0; i &lt; in_stream->nb_side_data; i++) {
                   const AVPacketSideData *sd_src = &amp;in_stream->side_data[i];
                   uint8_t *dst_data;

                   dst_data = av_stream_new_side_data(out_stream,
    sd_src->type, sd_src->size);
                   if (!dst_data)
                       return AVERROR(ENOMEM);
                   memcpy(dst_data, sd_src->data, sd_src->size);
               }
           }
       }

       av_dump_format(ofmt_ctx, 0, out_filename, 1);

       start_time = ofmt_ctx->duration;
       ost_tb_start_time = av_rescale_q(ofmt_ctx->duration,
    AV_TIME_BASE_Q, mux_timebase);

       if (!(ofmt->flags &amp; AVFMT_NOFILE))
       {
           ret = avio_open(&amp;ofmt_ctx->pb, out_filename, AVIO_FLAG_WRITE);
           if (ret &lt; 0) {
               fprintf(stderr, "Could not open output file '%s'", out_filename);
               goto end;
           }
       }

       ret = avformat_write_header(ofmt_ctx, NULL);
       if (ret &lt; 0) {
           fprintf(stderr, "Error occurred when opening output file\n");
           goto end;
       }

       while (1)
       {
           AVStream *in_stream, *out_stream;

           ret = av_read_frame(ifmt_ctx, &amp;pkt);
           if (ret &lt; 0)
               break;

           in_stream  = ifmt_ctx->streams[pkt.stream_index];
           if (pkt.stream_index >= stream_mapping_size ||
               stream_mapping[pkt.stream_index] &lt; 0) {
               av_packet_unref(&amp;pkt);
               continue;
           }

           pkt.stream_index = stream_mapping[pkt.stream_index];
           out_stream = ofmt_ctx->streams[pkt.stream_index];

           //log_packet(ifmt_ctx, &amp;pkt, "in");


           //ofmt_ctx->bit_rate = ifmt_ctx->bit_rate;
           ofmt_ctx->duration = ifmt_ctx->duration;
           /* copy packet */
           //pkt.pts = av_rescale_q_rnd(pkt.pts, in_stream->time_base,
    out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);
           //pkt.dts = av_rescale_q_rnd(pkt.dts, in_stream->time_base,
    out_stream->time_base, AV_ROUND_NEAR_INF|AV_ROUND_PASS_MINMAX);

           if (pkt.pts != AV_NOPTS_VALUE)
               pkt.pts = av_rescale_q(pkt.pts,
    in_stream->time_base,mux_timebase) - ost_tb_start_time;
           else
               pkt.pts = AV_NOPTS_VALUE;

           if (pkt.dts == AV_NOPTS_VALUE)
               pkt.dts = av_rescale_q(pkt.dts, AV_TIME_BASE_Q, mux_timebase);
           else
               pkt.dts = av_rescale_q(pkt.dts, in_stream->time_base, mux_timebase);
           pkt.dts -= ost_tb_start_time;

           pkt.duration = av_rescale_q(pkt.duration,
    in_stream->time_base, mux_timebase);
           //pkt.duration = av_rescale_q(1,
    av_inv_q(out_stream->avg_frame_rate), mux_timebase);
           pkt.pos = -1;
           //log_packet(ofmt_ctx, &amp;pkt, "out");


           ret = av_interleaved_write_frame(ofmt_ctx, &amp;pkt);
           if (ret &lt; 0) {
               fprintf(stderr, "Error muxing packet\n");
               break;
           }
           av_packet_unref(&amp;pkt);
       }

       av_write_trailer(ofmt_ctx);
    end:

       avformat_close_input(&amp;ifmt_ctx);

       /* close output */
       if (ofmt_ctx &amp;&amp; !(ofmt->flags &amp; AVFMT_NOFILE))
           avio_closep(&amp;ofmt_ctx->pb);
       avformat_free_context(ofmt_ctx);

       av_freep(&amp;stream_mapping);

       if (ret &lt; 0 &amp;&amp; ret != AVERROR_EOF) {
           fprintf(stderr, "Error occurred: %s\n", av_err2str(ret));
           return 1;
       }

       return 0;
    }
  • How can I stream mjpeg file as rtsp

    24 août 2013, par Ilya Yevlampiev

    We have an mjpeg video, obtained from the webcam and stored into *.avi file, still encoded as mjpeg.

    We need to restream this file as rtsp (and stil preserve the mjpeg there, i.e. no decoding). The goal is to emulate the webcam this video was obtained from for the software that processes the video. The file can be open with vlc/ffplay with no problems. The ffmpeg behaves like it is streaming it, however, ffplay/vlc can't open this stream.

    We tried to stream if with gstreamer.

    1) we fount no free rtsp sink element for gstreamer pipeline. So, is there a free analogue for rtspsink to launch this pipeline with gst-launch ? we need and only cast, so we don't need so advanced element as rtspsink is.

    2) we also tried to build own simple rtsp server as described in http://weeklybuild.com/2013/01/creating-an-rtsp-stream-with-gstreamer/

    replacing videotestsrc with filesrc ; but what kind of elements we should use there ? usage of an only filesrc doesn't help ; we get the same problem as if we stream with ffmpeg. But what kind of lements we need there, if we dont' wan to decode/encode it, just to stream the file (to reproduce the thing what the webcam actually does).

    $ ffplay rtsp://127.0.0.1:8554/test -loglevel debug
    avplay version 0.8.5-6:0.8.5-1, Copyright (c) 2003-2012 the Libav developers
    built on Jan 13 2013 12:05:48 with gcc 4.7.2
    configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version=&#39;6:0.8.5-1&#39; --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    avutil      configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version=&#39;6:0.8.4-1&#39; --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    avcodec     configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version=&#39;6:0.8.4-1&#39; --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    avformat    configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version=&#39;6:0.8.4-1&#39; --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    swscale     configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version=&#39;6:0.8.4-1&#39; --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    postproc    configuration: --arch=amd64 --enable-pthreads --enable-runtime-cpudetect --extra-version=&#39;6:0.8.4-1&#39; --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libdirac --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-            postproc --enable-swscale --enable-libcdio --enable-x11grab --enable-libx264 --enable-libxvid --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static
    libavutil    51. 22. 1 / 51. 22. 1
    libavcodec   53. 35. 0 / 53. 35. 0
    libavformat  53. 21. 1 / 53. 21. 0
    libavdevice  53.  2. 0 / 53.  2. 0
    libavfilter   2. 15. 0 /  2. 15. 0
    libswscale    2.  1. 0 /  2.  1. 0
    libpostproc  52.  0. 0 / 52.  0. 0
    [rtsp @ 0x7f558c0008c0] method DESCRIBE failed: 503 Service Unavailable
    [rtsp @ 0x7f558c0008c0] CSeq: 2
    Server: GStreamer RTSP server
    Date: Thu, 22 Aug 2013 07:49:30 GMT

    rtsp://127.0.0.1:8554/test: Invalid data found when processing input

    And everything is okay when I try gstreamer server built as in example, i.e. using videotestsrc

  • Why does my discord bot not able to find the file that is there when I open the folder manually ?

    22 juin 2021, par Toma

    I made a discord bot that should play music using ffmpeg.

    &#xA;

    It's connecting and downloading the youtube webm file after which it should convert and rename it to song.mp3 but it doesn't manage to do so. I check the folder and the error message doesn't match what I see - the file is there and has been renamed.

    &#xA;

      &#xA;
    1. Am I using the replace command correctly to move the file ?
    2. &#xA;

    3. I'd note that I'm using windows10 and that the folders are all read only and that although I'm the admin I can't change that no matter what I do (I guess it's a win10 bug). Does that have anything to do with it ?
    4. &#xA;

    5. Is there another mistake in the code that'd prevent the file from being found by the bot ?
    6. &#xA;

    &#xA;

    My code :

    &#xA;

    import discord&#xA;from discord.ext import commands&#xA;import youtube_dl #for url music command&#xA;import os&#xA;&#xA;client = commands.Bot(command_prefix = &#x27;>&lt;&#x27;)&#xA;&#xA;#connect to voice channel&#xA;@client.command(aliases = [&#x27;c&#x27;])&#xA;async def connect(ctx, vcName):&#xA;    voice = discord.utils.get(client.voice_clients, guild=ctx.guild)&#xA;    voiceChannel = discord.utils.get(ctx.guild.channels, name=str(vcName))&#xA;    if voice == None: #if voice is not connected to any channel&#xA;        await voiceChannel.connect()&#xA;    else:&#xA;        if voice.channel == vcName: #if trying to connect to the same channel&#xA;            await ctx.send(&#x27;already connected to this channel&#x27;)&#xA;        else:&#xA;            await voice.move_to(vcName)&#xA;&#xA;@client.command(aliases = [&#x27;d&#x27;])&#xA;async def delFile(ctx):&#xA;    song_there = os.path.exists(os.getcwd()&#x2B;&#x27;/music/current/song.mp3&#x27;) #true when song.mp3 exists in &#x27;current&#x27; folder in &#x27;music&#x27; folder&#xA;    if song_there:&#xA;        await ctx.send(&#x27;song was detected&#x27;)&#xA;        os.remove(&#x27;song.mp3&#x27;)&#xA;        if song_there:&#xA;            await ctx.send(&#x27;song was not deleted&#x27;)&#xA;    else:&#xA;        await ctx.send(&#x27;File is not found. check the name again&#x27;)&#xA;&#xA;#play music from url&#xA;&#xA;@client.command(aliases = [&#x27;p&#x27;])&#xA;async def playMusic(ctx, vcName, url : str): #play music file&#xA;    song_there = os.path.exists(os.path.join(os.getcwd(),&#x27;/music/current/song.mp3&#x27;))&#xA;    try:&#xA;        if song_there:&#xA;            print(&#x27;previous song found&#x27;)&#xA;            os.remove(os.path.join(os.getcwd(),&#x27;/music/current/song.mp3&#x27;)) #removes the song in current to make room for a new song&#xA;            if song_there:&#xA;                print(&#x27;song was not deleted&#x27;)&#xA;            else:&#xA;                print(&#x27;song deleted&#x27;)&#xA;    except PermissionError:&#xA;        await ctx.send(&#x27;A song is currently playing&#x27;)&#xA;        return&#xA;    voiceChannel = discord.utils.get(ctx.guild.channels, name=str(vcName))&#xA;    ydl_opts = {&#xA;        &#x27;format&#x27;: &#x27;bestaudio/best&#x27;,&#xA;        &#x27;postprocessors&#x27;: [{&#xA;            &#x27;key&#x27;: &#x27;FFmpegExtractAudio&#x27;,&#xA;            &#x27;preferredcodec&#x27;: &#x27;mp3&#x27;,&#xA;            &#x27;preferredquality&#x27;: &#x27;192&#x27;,&#xA;        }]&#xA;    }&#xA;&#xA;&#xA;   for file in os.listdir(&#x27;./&#x27;):&#xA;        if file.endswith(&#x27;.mp3&#x27;):       #if song.mp3 already exists delete it to make room for a new download&#xA;            os.remove(&#x27;song.mp3&#x27;)&#xA;        else:                           #download the file from youtube&#xA;            with youtube_dl.YoutubeDL(ydl_opts) as ydl:&#xA;                ydl.download([url])&#xA;    for file in os.listdir(&#x27;./&#x27;):       #after downloading rename the file and move it to current folder&#xA;        if not file == (&#x27;song.mp3&#x27;) and file.endswith(&#x27;.mp3&#x27;):&#xA;            os.rename(file, &#x27;song.mp3&#x27;)&#xA;            print(os.path.join(os.getcwd(), &#x27;song.mp3&#x27;))&#xA;            print(os.path.join(os.getcwd(), &#x27;/music/current/song.mp3&#x27;))&#xA;            os.replace(os.path.join(os.getcwd(), &#x27;song.mp3&#x27;), os.path.join(os.getcwd(), &#x27;/music/current/song.mp3&#x27;))   #move file to current&#xA;&#xA;    voice = discord.utils.get(client.voice_clients, guild=ctx.guild)&#xA;    if not voice is None:               #if voice is already created&#xA;        if not voice.is_connected():    #and is not connected&#xA;            await voiceChannel.connect()&#xA;        voice.play(discord.FFmpegPCMAudio(&#x27;song.mp3&#x27;))&#xA;    else:&#xA;        await ctx.send(&#x27;Bot made an oopsy. Cast mending and heal bot.&#x27;)&#xA;client.run(&#x27;token&#x27;)&#xA;

    &#xA;

    Error :

    &#xA;

    [youtube] wkJ7oDMqz0A: Downloading webpage&#xA;[download] The Minor Bee-wkJ7oDMqz0A.webm has already been downloaded&#xA;[download] 100% of 5.13MiB&#xA;[ffmpeg] Destination: The Minor Bee-wkJ7oDMqz0A.mp3&#xA;Deleting original file The Minor Bee-wkJ7oDMqz0A.webm (pass -k to keep)&#xA;[youtube] wkJ7oDMqz0A: Downloading webpage&#xA;[download] Destination: The Minor Bee-wkJ7oDMqz0A.webm&#xA;[download] 100% of 5.13MiB in 00:00                   &#xA;[ffmpeg] Destination: The Minor Bee-wkJ7oDMqz0A.mp3&#xA;Deleting original file The Minor Bee-wkJ7oDMqz0A.webm (pass -k to keep)&#xA;[youtube] wkJ7oDMqz0A: Downloading webpage&#xA;[download] Destination: The Minor Bee-wkJ7oDMqz0A.webm&#xA;[download] 100% of 5.13MiB in 00:00                  &#xA;[ffmpeg] Destination: The Minor Bee-wkJ7oDMqz0A.mp3&#xA;Deleting original file The Minor Bee-wkJ7oDMqz0A.webm (pass -k to keep)&#xA;C:.....song.mp3 -> **C:/music/current/song.mp3**&#xA;Ignoring exception in command playMusic:&#xA;Traceback (most recent call last):&#xA;  File "C:\Program Files\Python38\lib\site-packages\discord\ext\commands\core.py", line 85, in wrapped&#xA;    ret = await coro(*args, **kwargs)&#xA;  File "C:...tut-bot.py", line 84, in playMusic&#xA;    os.replace(os.path.join(os.getcwd(), &#x27;song.mp3&#x27;), os.path.join(os.getcwd(), &#x27;/music/current/song.mp3&#x27;))   #move file to current&#xA;FileNotFoundError: [WinError 3] The system cannot find the path specified: &#x27;C:\....\\song.mp3&#x27; -> &#x27;C:/music/current/song.mp3&#x27;&#xA;&#xA;The above exception was the direct cause of the following exception:&#xA;&#xA;Traceback (most recent call last):&#xA;  File "C:\Program Files\Python38\lib\site-packages\discord\ext\commands\bot.py", line 939, in invoke&#xA;    await ctx.command.invoke(ctx)&#xA;  File "C:\Program Files\Python38\lib\site-packages\discord\ext\commands\core.py", line 863, in invoke&#xA;    await injected(*ctx.args, **ctx.kwargs)&#xA;  File "C:\Program Files\Python38\lib\site-packages\discord\ext\commands\core.py", line 94, in wrapped&#xA;    raise CommandInvokeError(exc) from exc&#xA;discord.ext.commands.errors.CommandInvokeError: Command raised an exception: FileNotFoundError: [WinError 3] The system cannot find the path specified: &#x27;C:\\...\\song.mp3&#x27; -> &#x27;C:/music/current/song.mp3&#x27;&#xA;

    &#xA;