Recherche avancée

Médias (0)

Mot : - Tags -/configuration

Aucun média correspondant à vos critères n’est disponible sur le site.

Autres articles (40)

  • Les tâches Cron régulières de la ferme

    1er décembre 2010, par

    La gestion de la ferme passe par l’exécution à intervalle régulier de plusieurs tâches répétitives dites Cron.
    Le super Cron (gestion_mutu_super_cron)
    Cette tâche, planifiée chaque minute, a pour simple effet d’appeler le Cron de l’ensemble des instances de la mutualisation régulièrement. Couplée avec un Cron système sur le site central de la mutualisation, cela permet de simplement générer des visites régulières sur les différents sites et éviter que les tâches des sites peu visités soient trop (...)

  • Contribute to a better visual interface

    13 avril 2011

    MediaSPIP is based on a system of themes and templates. Templates define the placement of information on the page, and can be adapted to a wide range of uses. Themes define the overall graphic appearance of the site.
    Anyone can submit a new graphic theme or template and make it available to the MediaSPIP community.

  • Qu’est ce qu’un éditorial

    21 juin 2013, par

    Ecrivez votre de point de vue dans un article. Celui-ci sera rangé dans une rubrique prévue à cet effet.
    Un éditorial est un article de type texte uniquement. Il a pour objectif de ranger les points de vue dans une rubrique dédiée. Un seul éditorial est placé à la une en page d’accueil. Pour consulter les précédents, consultez la rubrique dédiée.
    Vous pouvez personnaliser le formulaire de création d’un éditorial.
    Formulaire de création d’un éditorial Dans le cas d’un document de type éditorial, les (...)

Sur d’autres sites (4730)

  • How to fix ffmpeg's offical tutorials03 bug that sound does't work well ?

    31 janvier 2019, par xiaodai

    I want to learn to make a player with ffmpeg and sdl. The tutorial I used is this.[http://dranger.com/ffmpeg/tutorial03.html] Though I have resampled the audio from decode stream, the sound still plays with loud noise.

    I have no ideas to fix it anymore.

    I used the following :

    • the latest ffmpeg and sdl1
    • Visual Studio 2010
    // tutorial03.c
    // A pedagogical video player that will stream through every video frame as fast as it can
    // and play audio (out of sync).
    //
    // This tutorial was written by Stephen Dranger (dranger@gmail.com).
    //
    // Code based on FFplay, Copyright (c) 2003 Fabrice Bellard,
    // and a tutorial by Martin Bohme (boehme@inb.uni-luebeckREMOVETHIS.de)
    // Tested on Gentoo, CVS version 5/01/07 compiled with GCC 4.1.1
    //
    // Use the Makefile to build all examples.
    //
    // Run using
    // tutorial03 myvideofile.mpg
    //
    // to play the stream on your screen.

    extern "C"{
    #include <libavcodec></libavcodec>avcodec.h>
    #include <libavformat></libavformat>avformat.h>
    #include <libswscale></libswscale>swscale.h>
    #include <libavutil></libavutil>channel_layout.h>
    #include <libavutil></libavutil>common.h>
    #include <libavutil></libavutil>frame.h>
    #include <libavutil></libavutil>samplefmt.h>
    #include "libswresample/swresample.h"

    #include <sdl></sdl>SDL.h>
    #include <sdl></sdl>SDL_thread.h>
    };
    #ifdef __WIN32__
    #undef main /* Prevents SDL from overriding main() */
    #endif

    #include

    #define SDL_AUDIO_BUFFER_SIZE 1024
    #define MAX_AUDIO_FRAME_SIZE 192000

    struct SwrContext *audio_swrCtx;
    FILE *pFile=fopen("output.pcm", "wb");
    FILE *pFile_stream=fopen("output_stream.pcm","wb");
    int audio_len;
    typedef struct PacketQueue {
       AVPacketList *first_pkt, *last_pkt;
       int nb_packets;
       int size;
       SDL_mutex *mutex;
       SDL_cond *cond;
    } PacketQueue;

    PacketQueue audioq;

    int quit = 0;

    void packet_queue_init(PacketQueue *q) {
       memset(q, 0, sizeof(PacketQueue));
       q->mutex = SDL_CreateMutex();
       q->cond = SDL_CreateCond();
    }

    int packet_queue_put(PacketQueue *q, AVPacket *pkt) {

       AVPacketList *pkt1;

       if(av_dup_packet(pkt) &lt; 0) {
           return -1;
       }

       pkt1 = (AVPacketList *)av_malloc(sizeof(AVPacketList));

       if(!pkt1) {
           return -1;
       }

       pkt1->pkt = *pkt;
       pkt1->next = NULL;


       SDL_LockMutex(q->mutex);

       if(!q->last_pkt) {
           q->first_pkt = pkt1;
       }

       else {
           q->last_pkt->next = pkt1;
       }

       q->last_pkt = pkt1;
       q->nb_packets++;
       q->size += pkt1->pkt.size;
       SDL_CondSignal(q->cond);

       SDL_UnlockMutex(q->mutex);
       return 0;
    }

    static int packet_queue_get(PacketQueue *q, AVPacket *pkt, int block) {
       AVPacketList *pkt1;
       int ret;

       SDL_LockMutex(q->mutex);

       for(;;) {

           if(quit) {
               ret = -1;
               break;
           }

           pkt1 = q->first_pkt;

           if(pkt1) {
               q->first_pkt = pkt1->next;

               if(!q->first_pkt) {
                   q->last_pkt = NULL;
               }

               q->nb_packets--;
               q->size -= pkt1->pkt.size;
               *pkt = pkt1->pkt;
               av_free(pkt1);
               ret = 1;
               break;

           } else if(!block) {
               ret = 0;
               break;

           } else {
               SDL_CondWait(q->cond, q->mutex);
           }
       }

       SDL_UnlockMutex(q->mutex);
       return ret;
    }

    int audio_decode_frame(AVCodecContext *aCodecCtx, uint8_t *audio_buf, int buf_size) {


        static AVPacket pkt;
        static uint8_t *audio_pkt_data = NULL;
        static int audio_pkt_size = 0;
        static AVFrame frame;

        int len1, data_size = 0;

        for(;;) {
            while(audio_pkt_size > 0) {
                int got_frame = 0;
                len1 = avcodec_decode_audio4(aCodecCtx, &amp;frame, &amp;got_frame, &amp;pkt);

                if(len1 &lt; 0) {
                    /* if error, skip frame */
                    audio_pkt_size = 0;
                    break;
                }
                audio_pkt_data += len1;
                audio_pkt_size -= len1;
                data_size = 0;
                /*

                au_convert_ctx = swr_alloc();
                au_convert_ctx=swr_alloc_set_opts(au_convert_ctx,out_channel_layout, out_sample_fmt, out_sample_rate,
                in_channel_layout,pCodecCtx->sample_fmt , pCodecCtx->sample_rate,0, NULL);
                swr_init(au_convert_ctx);

                swr_convert(au_convert_ctx,&amp;out_buffer, MAX_AUDIO_FRAME_SIZE,(const uint8_t **)pFrame->data , pFrame->nb_samples);


                */
                if( got_frame ) {
                    audio_swrCtx=swr_alloc();
                    audio_swrCtx=swr_alloc_set_opts(audio_swrCtx,  // we're allocating a new context
                        AV_CH_LAYOUT_STEREO,//AV_CH_LAYOUT_STEREO,     // out_ch_layout
                        AV_SAMPLE_FMT_S16,         // out_sample_fmt
                        44100, // out_sample_rate
                        aCodecCtx->channel_layout, // in_ch_layout
                        aCodecCtx->sample_fmt,     // in_sample_fmt
                        aCodecCtx->sample_rate,    // in_sample_rate
                        0,                         // log_offset
                        NULL);                     // log_ctx
                    int ret=swr_init(audio_swrCtx);
                    int out_samples = av_rescale_rnd(swr_get_delay(audio_swrCtx, aCodecCtx->sample_rate) + 1024, 44100, aCodecCtx->sample_rate, AV_ROUND_UP);
                    ret=swr_convert(audio_swrCtx,&amp;audio_buf, MAX_AUDIO_FRAME_SIZE,(const uint8_t **)frame.data ,frame.nb_samples);
                    data_size =
                        av_samples_get_buffer_size
                        (
                        &amp;data_size,
                        av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO),
                        ret,
                        AV_SAMPLE_FMT_S16,
                        1
                        );
                     fwrite(audio_buf, 1, data_size, pFile);
                    //memcpy(audio_buf, frame.data[0], data_size);
                    swr_free(&amp;audio_swrCtx);
                }

                if(data_size &lt;= 0) {
                    /* No data yet, get more frames */
                    continue;
                }

                /* We have data, return it and come back for more later */
                return data_size;
            }

            if(pkt.data) {
                av_free_packet(&amp;pkt);
            }

            if(quit) {
                return -1;
            }

            if(packet_queue_get(&amp;audioq, &amp;pkt, 1) &lt; 0) {
                return -1;
            }

            audio_pkt_data = pkt.data;
            audio_pkt_size = pkt.size;
        }
    }



    void audio_callback(void *userdata, Uint8 *stream, int len) {

       AVCodecContext *aCodecCtx = (AVCodecContext *)userdata;
       int /*audio_len,*/ audio_size;

       static uint8_t audio_buf[(MAX_AUDIO_FRAME_SIZE * 3) / 2];
       static unsigned int audio_buf_size = 0;
       static unsigned int audio_buf_index = 0;

       //SDL_memset(stream, 0, len);
       while(len > 0) {

           if(audio_buf_index >= audio_buf_size) {
               /* We have already sent all our data; get more */
               audio_size = audio_decode_frame(aCodecCtx, audio_buf, audio_buf_size);

               if(audio_size &lt; 0) {
                   /* If error, output silence */
                   audio_buf_size = 1024; // arbitrary?
                   memset(audio_buf, 0, audio_buf_size);

               } else {
                   audio_buf_size = audio_size;
               }

               audio_buf_index = 0;
           }

           audio_len = audio_buf_size - audio_buf_index;

           if(audio_len > len) {
               audio_len = len;
           }

           memcpy(stream, (uint8_t *)audio_buf , audio_len);
           //SDL_MixAudio(stream,(uint8_t*)audio_buf,audio_len,SDL_MIX_MAXVOLUME);
           fwrite(audio_buf, 1, audio_len, pFile_stream);
           len -= audio_len;
           stream += audio_len;
           audio_buf_index += audio_len;
           audio_len=len;
       }
    }

    int main(int argc, char *argv[]) {
       AVFormatContext *pFormatCtx = NULL;
       int             i, videoStream, audioStream;
       AVCodecContext  *pCodecCtx = NULL;
       AVCodec         *pCodec = NULL;
       AVFrame         *pFrame = NULL;
       AVPacket        packet;
       int             frameFinished;

       //float           aspect_ratio;

       AVCodecContext  *aCodecCtx = NULL;
       AVCodec         *aCodec = NULL;

       SDL_Overlay     *bmp = NULL;
       SDL_Surface     *screen = NULL;
       SDL_Rect        rect;
       SDL_Event       event;
       SDL_AudioSpec   wanted_spec, spec;

       struct SwsContext   *sws_ctx            = NULL;
       AVDictionary        *videoOptionsDict   = NULL;
       AVDictionary        *audioOptionsDict   = NULL;

       if(argc &lt; 2) {
               fprintf(stderr, "Usage: test <file>\n");
               exit(1);
           }

           // Register all formats and codecs
       av_register_all();

       if(SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) {
           fprintf(stderr, "Could not initialize SDL - %s\n", SDL_GetError());
           exit(1);
       }

       // Open video file
       if(avformat_open_input(&amp;pFormatCtx, argv[1]/*"file.mov"*/, NULL, NULL) != 0) {
           return -1;    // Couldn't open file
       }

       // Retrieve stream information
       if(avformat_find_stream_info(pFormatCtx, NULL) &lt; 0) {
           return -1;    // Couldn't find stream information
       }

       // Dump information about file onto standard error
       av_dump_format(pFormatCtx, 0, argv[1], 0);

       // Find the first video stream
       videoStream = -1;
       audioStream = -1;

       for(i = 0; i &lt; pFormatCtx->nb_streams; i++) {
           if(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO &amp;&amp;
               videoStream &lt; 0) {
                   videoStream = i;
           }

           if(pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO &amp;&amp;
               audioStream &lt; 0) {
                   audioStream = i;
           }
       }

       if(videoStream == -1) {
           return -1;    // Didn't find a video stream
       }

       if(audioStream == -1) {
           return -1;
       }

       aCodecCtx = pFormatCtx->streams[audioStream]->codec;
       // Set audio settings from codec info
       wanted_spec.freq = 44100;
       wanted_spec.format = AUDIO_S16SYS;
       wanted_spec.channels = av_get_channel_layout_nb_channels(AV_CH_LAYOUT_STEREO);;
       wanted_spec.silence = 0;
       wanted_spec.samples = 1024;
       wanted_spec.callback = audio_callback;
       wanted_spec.userdata = aCodecCtx;

       if(SDL_OpenAudio(&amp;wanted_spec, &amp;spec) &lt; 0) {
           fprintf(stderr, "SDL_OpenAudio: %s\n", SDL_GetError());
           return -1;
       }


       aCodec = avcodec_find_decoder(aCodecCtx->codec_id);

       if(!aCodec) {
           fprintf(stderr, "Unsupported codec!\n");
           return -1;
       }

       avcodec_open2(aCodecCtx, aCodec, &amp;audioOptionsDict);

       // audio_st = pFormatCtx->streams[index]
       packet_queue_init(&amp;audioq);
       SDL_PauseAudio(0);

       // Get a pointer to the codec context for the video stream
       pCodecCtx = pFormatCtx->streams[videoStream]->codec;

       // Find the decoder for the video stream
       pCodec = avcodec_find_decoder(pCodecCtx->codec_id);

       if(pCodec == NULL) {
           fprintf(stderr, "Unsupported codec!\n");
           return -1; // Codec not found
       }

       // Open codec
       if(avcodec_open2(pCodecCtx, pCodec, &amp;videoOptionsDict) &lt; 0) {
           return -1;    // Could not open codec
       }

       // Allocate video frame
       pFrame = av_frame_alloc();

       // Make a screen to put our video

    #ifndef __DARWIN__
       screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 0, 0);
    #else
       screen = SDL_SetVideoMode(pCodecCtx->width, pCodecCtx->height, 24, 0);
    #endif

       if(!screen) {
           fprintf(stderr, "SDL: could not set video mode - exiting\n");
           exit(1);
       }

       // Allocate a place to put our YUV image on that screen
       bmp = SDL_CreateYUVOverlay(pCodecCtx->width,
           pCodecCtx->height,
           SDL_YV12_OVERLAY,
           screen);
       sws_ctx =
           sws_getContext
           (
           pCodecCtx->width,
           pCodecCtx->height,
           pCodecCtx->pix_fmt,
           pCodecCtx->width,
           pCodecCtx->height,
           PIX_FMT_YUV420P,
           SWS_BILINEAR,
           NULL,
           NULL,
           NULL
           );


       // Read frames and save first five frames to disk
       i = 0;

       while(av_read_frame(pFormatCtx, &amp;packet) >= 0) {
           // Is this a packet from the video stream?
           if(packet.stream_index == videoStream) {
               // Decode video frame
               avcodec_decode_video2(pCodecCtx, pFrame, &amp;frameFinished,
                   &amp;packet);

               // Did we get a video frame?
               if(frameFinished) {
                   SDL_LockYUVOverlay(bmp);

                   AVPicture pict;
                   pict.data[0] = bmp->pixels[0];
                   pict.data[1] = bmp->pixels[2];
                   pict.data[2] = bmp->pixels[1];

                   pict.linesize[0] = bmp->pitches[0];
                   pict.linesize[1] = bmp->pitches[2];
                   pict.linesize[2] = bmp->pitches[1];

                   // Convert the image into YUV format that SDL uses
                   sws_scale
                       (
                       sws_ctx,
                       (uint8_t const * const *)pFrame->data,
                       pFrame->linesize,
                       0,
                       pCodecCtx->height,
                       pict.data,
                       pict.linesize
                       );

                   SDL_UnlockYUVOverlay(bmp);

                   rect.x = 0;
                   rect.y = 0;
                   rect.w = pCodecCtx->width;
                   rect.h = pCodecCtx->height;
                   SDL_DisplayYUVOverlay(bmp, &amp;rect);
                   SDL_Delay(40);
                   av_free_packet(&amp;packet);
               }

           } else if(packet.stream_index == audioStream) {
               packet_queue_put(&amp;audioq, &amp;packet);

           } else {
               av_free_packet(&amp;packet);
           }

           // Free the packet that was allocated by av_read_frame
           SDL_PollEvent(&amp;event);

           switch(event.type) {
           case SDL_QUIT:
               quit = 1;
               SDL_Quit();
               exit(0);
               break;

           default:
               break;
           }

       }

       // Free the YUV frame
       av_free(pFrame);
       /*swr_free(&amp;audio_swrCtx);*/
       // Close the codec
       avcodec_close(pCodecCtx);
       fclose(pFile);
       fclose(pFile_stream);
       // Close the video file
       avformat_close_input(&amp;pFormatCtx);

       return 0;
    }
    </file>

    I hope to play normally.

  • nginx RTMP to HLS : FFMPG error when trying multiple bitrate output [closed]

    28 mai 2014, par user3685074

    I’m currently trying to convert my RTMP Livestream into a HLS with 3 quality-settings.

    I followed this guide

    I’ve compiled my own FFMPEG and it’s working if I just convert 1 file.
    It seems libx264 isn’t able to do multiple encodings at the same time ?

    I’m using these command :

           exec /usr/local/bin/ffmpeg -i rtmp://localhost/src/$name
           -c:a libfdk_aac -b:a 32k   -c:v libx264 -b:v 128K -f flv rtmp://localhost/hls/$name_low
           -c:a libfdk_aac -b:a 64k   -c:v libx264 -b:v 256K -f flv rtmp://localhost/hls/$name_mid
           -c:a libfdk_aac -b:a 128k  -c:v libx264 -b:v 512K -f flv rtmp://localhost/hls/$name_hi  2>>/tmp/ffmpeg.log;

    this is the output :

       ffmpeg version N-63519-g61917a1 Copyright (c) 2000-2014 the FFmpeg developers
         built on May 28 2014 18:06:42 with gcc 4.4.3 (Ubuntu 4.4.3-4ubuntu5.1)
         configuration: --enable-gpl --enable-version3 --enable-nonfree --enable-postproc --enable-libfaac --enable-libopencore-amrnb --enable-libopencore-amrwb --enable-libtheora --enable-libvorbis --enable-libx264 --enable-x11grab --enable-libvpx --enable-libmp3lame --enable-librtmp --enable-libspeex --enable-libfdk_aac
         libavutil      52. 87.100 / 52. 87.100
         libavcodec     55. 65.100 / 55. 65.100
         libavformat    55. 41.100 / 55. 41.100
         libavdevice    55. 13.101 / 55. 13.101
         libavfilter     4.  5.100 /  4.  5.100
         libswscale      2.  6.100 /  2.  6.100
         libswresample   0. 19.100 /  0. 19.100
         libpostproc    52.  3.100 / 52.  3.100
       Metadata:
         Server                NGINX RTMP (github.com/arut/nginx-rtmp-module)
         width                 1280.00
         height                720.00
         displayWidth          1280.00
         displayHeight         720.00
         duration              0.00
         framerate             25.00
         fps                   25.00
         videodatarate         390.00
         videocodecid          0.00
         audiodatarate         27.00
         audiocodecid          11.00
       Input #0, flv, from 'rtmp://localhost/src/test':
         Metadata:
           Server          : NGINX RTMP (github.com/arut/nginx-rtmp-module)
           displayWidth    : 1280
           displayHeight   : 720
           fps             : 25
           profile         :
           level           :
         Duration: 00:00:00.00, start: 0.080000, bitrate: N/A
           Stream #0:0: Video: h264 (High), yuv420p, 1280x720, 399 kb/s, 25 fps, 25 tbr, 1k tbn, 50 tbc
           Stream #0:1: Audio: speex, 16000 Hz, mono, s16, 27 kb/s
       [libx264 @ 0x5260380] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
       [libx264 @ 0x5260380] profile High, level 3.1
       [libx264 @ 0x5260380] 264 - core 142 r2431 f23da7c - H.264/MPEG-4 AVC codec - Copyleft 2003-2014 - http://www.videolan.org/x264.html - options: cabac=1 ref=3 deblock=1:0:0 analyse=0x3:0x113 me=hex subme=7 psy=1 psy_rd=1.00:0.00 mixed_ref=1 me_range=16 chroma_me=1 trellis=1 8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chroma_qp_offset=-2 threads=24 lookahead_threads=4 sliced_threads=0 nr=0 decimate=1 interlaced=0 bluray_compat=0 constrained_intra=0 bframes=3 b_pyramid=2 b_adapt=1 b_bias=0 direct=1 weightb=1 open_gop=0 weightp=2 keyint=250 keyint_min=25 scenecut=40 intra_refresh=0 rc_lookahead=40 rc=abr mbtree=1 bitrate=128 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4 ip_ratio=1.40 aq=1:1.00
       [libx264 @ 0x525a920] using cpu capabilities: MMX2 SSE2Fast SSSE3 SSE4.2
       Output #0, flv, to 'rtmp://localhost/hls/test_low':
         Metadata:
           Server          : NGINX RTMP (github.com/arut/nginx-rtmp-module)
           displayWidth    : 1280
           displayHeight   : 720
           fps             : 25
           profile         :
           level           :
           Stream #0:0: Video: h264 (libx264), yuv420p, 1280x720, q=-1--1, 128 kb/s, 25 fps, 90k tbn, 25 tbc
           Metadata:
             encoder         : Lavc55.65.100 libx264
           Stream #0:1: Audio: aac (libfdk_aac), 16000 Hz, mono, s16, 32 kb/s
           Metadata:
             encoder         : Lavc55.65.100 libfdk_aac
       Output #1, flv, to 'rtmp://localhost/hls/test_mid':
         Metadata:
           Server          : NGINX RTMP (github.com/arut/nginx-rtmp-module)
           displayWidth    : 1280
           displayHeight   : 720
           fps             : 25
           profile         :
           level           :
           Stream #1:0: Video: h264, yuv420p, 1280x720, q=-1--1, 256 kb/s, 25 fps, 90k tbn, 25 tbc
           Metadata:
             encoder         : Lavc55.65.100 libx264
           Stream #1:1: Audio: aac, 16000 Hz, mono, s16
           Metadata:
             encoder         : Lavc55.65.100 libfdk_aac
       Output #2, flv, to 'rtmp://localhost/hls/test_hi':
         Metadata:
           Server          : NGINX RTMP (github.com/arut/nginx-rtmp-module)
           displayWidth    : 1280
           displayHeight   : 720
           fps             : 25
           profile         :
           level           :
           Stream #2:0: Video: h264, yuv420p, 1280x720, q=-1--1, 25 fps, 90k tbn, 25 tbc
           Metadata:
             encoder         : Lavc55.65.100 libx264
           Stream #2:1: Audio: aac, 16000 Hz, mono, s16
           Metadata:
             encoder         : Lavc55.65.100 libfdk_aac
       Stream mapping:
         Stream #0:0 -> #0:0 (h264 -> libx264)
         Stream #0:1 -> #0:1 (libspeex -> libfdk_aac)
         Stream #0:0 -> #1:0 (h264 -> libx264)
         Stream #0:1 -> #1:1 (libspeex -> libfdk_aac)
         Stream #0:0 -> #2:0 (h264 -> libx264)
         Stream #0:1 -> #2:1 (libspeex -> libfdk_aac)
       Error while opening encoder for output stream #1:0 - maybe incorrect parameters such as bit_rate, rate, width or height

    I hope you can help me and sorry for my bad english.

    Greetz
    Kevin

  • How to mux video and audio without using FFMPEG ?

    20 janvier 2019, par Yekta Sarıoğlu

    I need to mux video(mp4) and audio(wav) into a single MP4 file on the Android platform. I don’t want to use FFMPEG due to its legal issues. I tried to do with MediaMuxer. And I used this solution as an example Muxer Example but I could not succeed and got an error failed to instantiate extractor where you set data source as a string path. I looked up for more answers but wherever I search on the Internet, all I found was FFMPEG based on solutions. I could not find any reliable answers. I hope you guys can help with it. Thanks in advance.