Recherche avancée

Médias (0)

Mot : - Tags -/logo

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

Autres articles (51)

  • Personnaliser les catégories

    21 juin 2013, par

    Formulaire de création d’une catégorie
    Pour ceux qui connaissent bien SPIP, une catégorie peut être assimilée à une rubrique.
    Dans le cas d’un document de type catégorie, les champs proposés par défaut sont : Texte
    On peut modifier ce formulaire dans la partie :
    Administration > Configuration des masques de formulaire.
    Dans le cas d’un document de type média, les champs non affichés par défaut sont : Descriptif rapide
    Par ailleurs, c’est dans cette partie configuration qu’on peut indiquer le (...)

  • Ajouter notes et légendes aux images

    7 février 2011, par

    Pour pouvoir ajouter notes et légendes aux images, la première étape est d’installer le plugin "Légendes".
    Une fois le plugin activé, vous pouvez le configurer dans l’espace de configuration afin de modifier les droits de création / modification et de suppression des notes. Par défaut seuls les administrateurs du site peuvent ajouter des notes aux images.
    Modification lors de l’ajout d’un média
    Lors de l’ajout d’un média de type "image" un nouveau bouton apparait au dessus de la prévisualisation (...)

  • Contribute to translation

    13 avril 2011

    You can help us to improve the language used in the software interface to make MediaSPIP more accessible and user-friendly. You can also translate the interface into any language that allows it to spread to new linguistic communities.
    To do this, we use the translation interface of SPIP where the all the language modules of MediaSPIP are available. Just subscribe to the mailing list and request further informantion on translation.
    MediaSPIP is currently available in French and English (...)

Sur d’autres sites (11110)

  • Screen Recording with FFmpeg-Lib with c++

    27 janvier 2020, par Baschdel

    I’m trying to record the whole desktop stream with FFmpeg on Windows.
    I found a working example here. The Problem is that some og the functions depricated. So I tried to replace them with the updated ones.

    But there are some slight problems. The error "has triggered a breakpoint." occurse and also "not able to read the location."
    The bigger problem is that I don’t know if this is the right way to do this..

    My code looks like this :

    using namespace std;

    /* initialize the resources*/
    Recorder::Recorder()
    {

       av_register_all();
       avcodec_register_all();
       avdevice_register_all();
       cout<<"\nall required functions are registered successfully";
    }

    /* uninitialize the resources */
    Recorder::~Recorder()
    {

       avformat_close_input(&pAVFormatContext);
       if( !pAVFormatContext )
       {
           cout<<"\nfile closed sucessfully";
       }
       else
       {
           cout<<"\nunable to close the file";
           exit(1);
       }

       avformat_free_context(pAVFormatContext);
       if( !pAVFormatContext )
       {
           cout<<"\navformat free successfully";
       }
       else
       {
           cout<<"\nunable to free avformat context";
           exit(1);
       }

    }

    /* establishing the connection between camera or screen through its respective folder */
    int Recorder::openCamera()
    {

       value = 0;
       options = NULL;
       pAVFormatContext = NULL;

       pAVFormatContext = avformat_alloc_context();//Allocate an AVFormatContext.

       openScreen(pAVFormatContext);

       /* set frame per second */
       value = av_dict_set( &options,"framerate","30",0 );
       if(value < 0)
       {
         cout<<"\nerror in setting dictionary value";
          exit(1);
       }

       value = av_dict_set( &options, "preset", "medium", 0 );
       if(value < 0)
       {
         cout<<"\nerror in setting preset values";
         exit(1);
       }

    //  value = avformat_find_stream_info(pAVFormatContext,NULL);
       if(value < 0)
       {
         cout<<"\nunable to find the stream information";
         exit(1);
       }

       VideoStreamIndx = -1;

       /* find the first video stream index . Also there is an API available to do the below operations */
       for(int i = 0; i < pAVFormatContext->nb_streams; i++ ) // find video stream posistion/index.
       {
         if( pAVFormatContext->streams[i]->codecpar->codec_type == AVMEDIA_TYPE_VIDEO )
         {
            VideoStreamIndx = i;
            break;
         }

       }

       if( VideoStreamIndx == -1)
       {
         cout<<"\nunable to find the video stream index. (-1)";
         exit(1);
       }

       // assign pAVFormatContext to VideoStreamIndx
       pAVCodecContext = pAVFormatContext->streams[VideoStreamIndx]->codec;

       pAVCodec = avcodec_find_decoder(pAVCodecContext->codec_id);
       if( pAVCodec == NULL )
       {
         cout<<"\nunable to find the decoder";
         exit(1);
       }

       value = avcodec_open2(pAVCodecContext , pAVCodec , NULL);//Initialize the AVCodecContext to use the given AVCodec.
       if( value < 0 )
       {
         cout<<"\nunable to open the av codec";
         exit(1);
       }
    }

    /* initialize the video output file and its properties  */
    int Recorder::init_outputfile()
    {
       outAVFormatContext = NULL;
       value = 0;
       output_file = "output.mp4";

       avformat_alloc_output_context2(&outAVFormatContext, NULL, NULL, output_file);
       if (!outAVFormatContext)
       {
           cout<<"\nerror in allocating av format output context";
           exit(1);
       }

    /* Returns the output format in the list of registered output formats which best matches the provided parameters, or returns NULL if there is no match. */
       output_format = av_guess_format(NULL, output_file ,NULL);
       if( !output_format )
       {
        cout<<"\nerror in guessing the video format. try with correct format";
        exit(1);
       }

       video_st = avformat_new_stream(outAVFormatContext ,NULL);
       if( !video_st )
       {
           cout<<"\nerror in creating a av format new stream";
           exit(1);
       }

       if (codec_id == AV_CODEC_ID_H264)
       {
           av_opt_set(outAVCodecContext->priv_data, "preset", "slow", 0);
       }

       outAVCodec = avcodec_find_encoder(AV_CODEC_ID_MPEG4);
       if (!outAVCodec)
       {
           cout << "\nerror in finding the av codecs. try again with correct codec";
           exit(1);
       }

       outAVCodecContext = avcodec_alloc_context3(outAVCodec);
       if( !outAVCodecContext )
       {
           cout<<"\nerror in allocating the codec contexts";
           exit(1);
       }

       /* set property of the video file */
       outAVCodecContext = video_st->codec;
       outAVCodecContext->codec_id = AV_CODEC_ID_MPEG4;// AV_CODEC_ID_MPEG4; // AV_CODEC_ID_H264 // AV_CODEC_ID_MPEG1VIDEO
       outAVCodecContext->codec_type = AVMEDIA_TYPE_VIDEO;
       outAVCodecContext->pix_fmt  = AV_PIX_FMT_YUV420P;
       outAVCodecContext->bit_rate = 400000; // 2500000
       outAVCodecContext->width = 1920;
       outAVCodecContext->height = 1080;
       outAVCodecContext->gop_size = 3;
       outAVCodecContext->max_b_frames = 2;
       outAVCodecContext->time_base.num = 1;
       outAVCodecContext->time_base.den = 30; //15fps


       /* Some container formats (like MP4) require global headers to be present
          Mark the encoder so that it behaves accordingly. */

       if ( outAVFormatContext->oformat->flags & AVFMT_GLOBALHEADER)
       {
           outAVCodecContext->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
       }

       value = avcodec_open2(outAVCodecContext, outAVCodec, NULL);
       if( value < 0)
       {
           cout<<"\nerror in opening the avcodec";
           exit(1);
       }

       /* create empty video file */
       if ( !(outAVFormatContext->flags & AVFMT_NOFILE) )
       {
        if( avio_open2(&outAVFormatContext->pb , output_file , AVIO_FLAG_WRITE ,NULL, NULL) < 0 )
        {
         cout<<"\nerror in creating the video file";
         exit(1);
        }
       }

       if(!outAVFormatContext->nb_streams)
       {
           cout<<"\noutput file dose not contain any stream";
           exit(1);
       }

       /* imp: mp4 container or some advanced container file required header information*/
       value = avformat_write_header(outAVFormatContext , &options);
       if(value < 0)
       {
           cout<<"\nerror in writing the header context";
           exit(1);
       }

       /*
       // uncomment here to view the complete video file informations
       cout<<"\n\nOutput file information :\n\n";
       av_dump_format(outAVFormatContext , 0 ,output_file ,1);
       */
    }

    int Recorder::stop() {
       threading = false;

       demux->join();
       rescale->join();
       mux->join();

       return 0;
    }

    int Recorder::start() {
       initVideoThreads();
       return 0;
    }

    int Recorder::initVideoThreads() {
       demux = new thread(&Recorder::demuxVideoStream, this, pAVCodecContext, pAVFormatContext, VideoStreamIndx);

       rescale = new thread(&Recorder::rescaleVideoStream, this, pAVCodecContext, outAVCodecContext);

       demux = new thread(&Recorder::encodeVideoStream, this, outAVCodecContext);
       return 0;
    }

    void Recorder::demuxVideoStream(AVCodecContext* codecContext, AVFormatContext* formatContext, int streamIndex)
    {
       // init packet
       AVPacket* packet = (AVPacket*)av_malloc(sizeof(AVPacket));
       av_init_packet(packet);

       int ctr = 0;

       while (threading)
       {
           if (av_read_frame(formatContext, packet) < 0) {
               exit(1);
           }

           if (packet->stream_index == streamIndex)
           {
               int return_value; // = 0;
               ctr++;

               do
               {
                   return_value = avcodec_send_packet(codecContext, packet);
               } while (return_value == AVERROR(EAGAIN) && threading);

               //int i = avcodec_send_packet(codecContext, packet);
               if (return_value < 0 && threading) { // call Decoder
                   cout << "unable to decode video";
                   exit(1);
               }
           }
       }

       avcodec_send_packet(codecContext, NULL); // flush decoder

       // return 0;
    }

    void Recorder::rescaleVideoStream(AVCodecContext* inCodecContext, AVCodecContext* outCodecContext)
    {
       bool closing = false;
       AVFrame* inFrame = av_frame_alloc();
       if (!inFrame)
       {
           cout << "\nunable to release the avframe resources";
           exit(1);
       }

       int nbytes = av_image_get_buffer_size(outAVCodecContext->pix_fmt, outAVCodecContext->width, outAVCodecContext->height, 32);
       uint8_t* video_outbuf = (uint8_t*)av_malloc(nbytes);
       if (video_outbuf == NULL)
       {
           cout << "\nunable to allocate memory";
           exit(1);
       }

       AVFrame* outFrame = av_frame_alloc();//Allocate an AVFrame and set its fields to default values.
       if (!outFrame)
       {
           cout << "\nunable to release the avframe resources for outframe";
           exit(1);
       }

       // Setup the data pointers and linesizes based on the specified image parameters and the provided array.
       int value = av_image_fill_arrays(outFrame->data, outFrame->linesize, video_outbuf, AV_PIX_FMT_YUV420P, outAVCodecContext->width, outAVCodecContext->height, 1); // returns : the size in bytes required for src
       if (value < 0)
       {
           cout << "\nerror in filling image array";
       }
       int ctr = 0;

       while (threading || !closing) {
           int value = avcodec_receive_frame(inCodecContext, inFrame);
           if (value == 0) {
               ctr++;
               SwsContext* swsCtx_ = sws_getContext(inCodecContext->width,
                   inCodecContext->height,
                   inCodecContext->pix_fmt,
                   outAVCodecContext->width,
                   outAVCodecContext->height,
                   outAVCodecContext->pix_fmt,
                   SWS_BICUBIC, NULL, NULL, NULL);
               sws_scale(swsCtx_, inFrame->data, inFrame->linesize, 0, inCodecContext->height, outFrame->data, outFrame->linesize);


               int return_value;
               do
               {
                   return_value = avcodec_send_frame(outCodecContext, outFrame);
               } while (return_value == AVERROR(EAGAIN) && threading);
           }
           closing = (value == AVERROR_EOF);
       }
       avcodec_send_frame(outCodecContext, NULL);


       // av_free(video_outbuf);

       // return 0;
    }

    void Recorder::encodeVideoStream(AVCodecContext* codecContext)
    {
       bool closing = true;
       AVPacket* packet = (AVPacket*)av_malloc(sizeof(AVPacket));
       av_init_packet(packet);

       int ctr = 0;

       while (threading || !closing) {
           packet->data = NULL;    // packet data will be allocated by the encoder
           packet->size = 0;
           ctr++;
           int value = avcodec_receive_packet(codecContext, packet);
           if (value == 0) {
               if (packet->pts != AV_NOPTS_VALUE)
                   packet->pts = av_rescale_q(packet->pts, video_st->codec->time_base, video_st->time_base);
               if (packet->dts != AV_NOPTS_VALUE)
                   packet->dts = av_rescale_q(packet->dts, video_st->codec->time_base, video_st->time_base);

               //printf("Write frame %3d (size= %2d)\n", j++, packet->size / 1000);
               if (av_write_frame(outAVFormatContext, packet) != 0)
               {
                   cout << "\nerror in writing video frame";
               }
           }

           closing = (value == AVERROR_EOF);
       }

       value = av_write_trailer(outAVFormatContext);
       if (value < 0)
       {
           cout << "\nerror in writing av trailer";
           exit(1);
       }

       // av_free(packet);

       // return 0;
    }


    int Recorder::openScreen(AVFormatContext* pFormatCtx) {
       /*

       X11 video input device.
       To enable this input device during configuration you need libxcb installed on your system. It will be automatically detected during configuration.
       This device allows one to capture a region of an X11 display.
       refer : https://www.ffmpeg.org/ffmpeg-devices.html#x11grab
       */
       /* current below is for screen recording. to connect with camera use v4l2 as a input parameter for av_find_input_format */
       pAVInputFormat = av_find_input_format("gdigrab");
       //value = avformat_open_input(&pAVFormatContext, ":0.0+10,250", pAVInputFormat, NULL);

       value = avformat_open_input(&pAVFormatContext, "desktop", pAVInputFormat, NULL);
       if (value != 0)
       {
           cout << "\nerror in opening input device";
           exit(1);
       }
       return 0;
    }
  • Decoding pcm_s16le with FFMPEG ?

    31 juillet 2015, par Davide Caresia

    i have a problem decoding a wav file using ffmpeg. I’m new to it and i’m not quite used to it.

    In my application i have to input the audio file and get an array of samples to work on.
    I used ffmpeg to create a function that gets in input the path of the file, the position in time where to start to output the samples and the lenght of the chunk to decode in seconds.

    I have no reputation, so I had to make a gdrive directory where you can see the problem and the files on which I worked.

    Here it is : https://goo.gl/8KnjAj

    When I try to decode the file harp.wav everything runs fine, and I can plot the samples as in the image plot-harp.png

    The file is a WAV file encoded as : pcm_u8, 11025 Hz, 1 channels, u8, 88 kb/s

    The problems comes when i try to decode the file demo-unprocessed.wav.
    It outputs a series of samples that has no sense. It outputs a serie of samples plotted as the image graph1-demo.jpg shows.

    The file is a WAV file encoded as : pcm_s16le, 44100 Hz, 1 channels, s16, 705 kb/s

    IDK where the problem in my code is, I already checked the code before and after the decoding with FFMPEG, and it works absolutely fine.

    Here is the code for the dataReader.cpp :

    /* Start by including the necessary */
    #include "dataReader.h"
    #include <cstdlib>
    #include <iostream>
    #include <fstream>

    #ifdef __cplusplus
    extern "C" {
    #endif
       #include <libavcodec></libavcodec>avcodec.h>
       #include <libavformat></libavformat>avformat.h>
       #include <libavutil></libavutil>avutil.h>
    #ifdef __cplusplus
    }
    #endif

    using namespace std;

    /* initialization function for audioChunk */
    audioChunk::audioChunk(){
       data=NULL;
       size=0;
       bitrate=0;
    }

    /* function to get back chunk lenght in seconds */
    int audioChunk::getTimeLenght(){
       return size/bitrate;
    }

    /* initialization function for audioChunk_dNorm */
    audioChunk_dNorm::audioChunk_dNorm(){
       data=NULL;
       size=0;
       bitrate=0;
    }

    /* function to get back chunk lenght in seconds */
    int audioChunk_dNorm::getTimeLenght(){
       return size/bitrate;
    }

    /* function to normalize audioChunk into audioChunk_dNorm */
    void audioChunk_dNorm::fillAudioChunk(audioChunk* cnk){

       size=cnk->size;
       bitrate=cnk->bitrate;

       double min=cnk->data[0];
       double max=cnk->data[0];

       for(int i=0;isize;i++){
           if(*(cnk->data+i)>max) max=*(cnk->data+i);
           else if(*(cnk->data+i)data+i);
       }

       data=new double[size];

       for(int i=0;i/data[i]=cnk->data[i]+256*data[i+1];
           if(data[i]!=255) data[i]=2*((cnk->data[i])-(max-min)/2)/(max-min);
           else data[i]=0;
       }
       cout&lt;&lt;"bitrate "&lt;* inizialize audioChunk */
       audioChunk output;

       /* Check input times */
       if((start_time&lt;0)||(lenght&lt;0)) {
           cout&lt;&lt;"Input times should be positive";
           return output;
       }

       /* Start FFmpeg */
       av_register_all();

       /* Initialize the frame to read the data and verify memory allocation */
       AVFrame* frame = av_frame_alloc();
       if (!frame)
       {
           cout &lt;&lt; "Error allocating the frame" &lt;&lt; endl;
           return output;
       }

       /* Initialization of the Context, to open the file */
       AVFormatContext* formatContext = NULL;
       /* Opening the file, and check if it has opened */
       if (avformat_open_input(&amp;formatContext, path_name, NULL, NULL) != 0)
       {
           av_frame_free(&amp;frame);
           cout &lt;&lt; "Error opening the file" &lt;&lt; endl;
           return output;
       }

       /* Find the stream info, if not found, exit */
       if (avformat_find_stream_info(formatContext, NULL) &lt; 0)
       {
           av_frame_free(&amp;frame);
           avformat_close_input(&amp;formatContext);
           cout &lt;&lt; "Error finding the stream info" &lt;&lt; endl;
           return output;
       }

       /* Check inputs to verify time input */
       if(start_time>(formatContext->duration/1000000)){
           cout&lt;&lt; "Error, start_time is over file duration"&lt;* Chunk = number of samples to output */
       long long int chunk = ((formatContext->bit_rate)*lenght/8);
       /* Start = address of sample where start to read */
       long long int start = ((formatContext->bit_rate)*start_time/8);
       /* Tot_sampl = number of the samples in the file */
       long long int tot_sampl = (formatContext->bit_rate)*(formatContext->duration)/8000000;

       /* Set the lenght of chunk to avoid segfault and to read all the file */
       if (start+chunk>tot_sampl) {chunk = tot_sampl-start;}
       if (lenght==0) {start = 0; chunk = tot_sampl;}

       /* initialize the array to output */
       output.data = new unsigned char[chunk];
       output.bitrate = formatContext->bit_rate;
       output.size=chunk;

       av_dump_format(formatContext,0,NULL,0);
       cout&lt;* Find the audio Stream, if no audio stream are found, clean and exit */
       AVCodec* cdc = NULL;
       int streamIndex = av_find_best_stream(formatContext, AVMEDIA_TYPE_AUDIO, -1, -1, &amp;cdc, 0);
       if (streamIndex &lt; 0)
       {
           av_frame_free(&amp;frame);
           avformat_close_input(&amp;formatContext);
           cout &lt;&lt; "Could not find any audio stream in the file" &lt;&lt; endl;
           return output;
       }

       /* Open the audio stream to read data  in audioStream */
       AVStream* audioStream = formatContext->streams[streamIndex];

       /* Initialize the codec context */
       AVCodecContext* codecContext = audioStream->codec;
       codecContext->codec = cdc;
       /* Open the codec, and verify if it has opened */
       if (avcodec_open2(codecContext, codecContext->codec, NULL) != 0)
       {
           av_frame_free(&amp;frame);
           avformat_close_input(&amp;formatContext);
           cout &lt;&lt; "Couldn't open the context with the decoder" &lt;&lt; endl;
           return output;
       }

       /* Initialize buffer to store compressed packets */
       AVPacket readingPacket;
       av_init_packet(&amp;readingPacket);


       int j=0;
       int count = 0;

       while(av_read_frame(formatContext, &amp;readingPacket)==0){
           if((count+readingPacket.size)>start){
               if(readingPacket.stream_index == audioStream->index){

                   AVPacket decodingPacket = readingPacket;

                   // Audio packets can have multiple audio frames in a single packet
                   while (decodingPacket.size > 0){
                       // Try to decode the packet into a frame
                       // Some frames rely on multiple packets, so we have to make sure the frame is finished before
                       // we can use it
                       int gotFrame = 0;
                       int result = avcodec_decode_audio4(codecContext, frame, &amp;gotFrame, &amp;decodingPacket);

                       count += result;

                       if (result >= 0 &amp;&amp; gotFrame)
                       {
                           decodingPacket.size -= result;
                           decodingPacket.data += result;
                           int a;

                           for(int i=0;idata[0][i];

                               j++;
                               if(j>=chunk) break;
                           }

                           // We now have a fully decoded audio frame
                       }
                       else
                       {
                           decodingPacket.size = 0;
                           decodingPacket.data = NULL;
                       }
                       if(j>=chunk) break;
                   }
               }              
           }else count+=readingPacket.size;

           // To prevent memory leak, must free packet.
           av_free_packet(&amp;readingPacket);
           if(j>=chunk) break;
       }

       // Some codecs will cause frames to be buffered up in the decoding process. If the CODEC_CAP_DELAY flag
       // is set, there can be buffered up frames that need to be flushed, so we'll do that
       if (codecContext->codec->capabilities &amp; CODEC_CAP_DELAY)
       {
           av_init_packet(&amp;readingPacket);
           // Decode all the remaining frames in the buffer, until the end is reached
           int gotFrame = 0;
           int a;
           int result=avcodec_decode_audio4(codecContext, frame, &amp;gotFrame, &amp;readingPacket);
           while (result >= 0 &amp;&amp; gotFrame)
           {
               // We now have a fully decoded audio frame
               for(int i=0;idata[0][i];

                   j++;
                   if(j>=chunk) break;
               }
               if(j>=chunk) break;
           }
       }

       // Clean up!
       av_free(frame);
       avcodec_close(codecContext);
       avformat_close_input(&amp;formatContext);

       cout&lt;&lt;"Ended Reading, "&lt;code></fstream></iostream></cstdlib>

    Here is the dataReader.h

    /*
    * File:   dataReader.h
    * Author: davide
    *
    * Created on 27 luglio 2015, 11.11
    */

    #ifndef DATAREADER_H
    #define DATAREADER_H

    /* function that reads a file and outputs an array of samples
    * @ path_name = the path of the file to read
    * @ start_time = the position where to start the data reading, 0 = start
    *                the time is in seconds, it can hold to 10e-6 seconds
    * @ lenght = the lenght of the frame to extract the data,
    *            0 = read all the file (do not use with big files)
    *            if lenght > of file duration, it reads through the end of file.
    *            the time is in seconds, it can hold to 10e-6 seconds  
    */

    #include

    class audioChunk{
    public:
       uint8_t *data;
       unsigned int size;
       int bitrate;
       int getTimeLenght();
       audioChunk();
    };

    class audioChunk_dNorm{
    public:
       double* data;
       unsigned int size;
       int bitrate;
       int getTimeLenght();
       void fillAudioChunk(audioChunk* cnk);
       audioChunk_dNorm();
    };

    audioChunk readData(const char* path_name, const double start_time, const double lenght);

    #endif  /* DATAREADER_H */

    And finally there is the main.cpp of the application.

    /*
    * File:   main.cpp
    * Author: davide
    *
    * Created on 28 luglio 2015, 17.04
    */

    #include <cstdlib>
    #include "dataReader.h"
    #include "transforms.h"
    #include "tognuplot.h"
    #include <fstream>
    #include <iostream>

    using namespace std;

    /*
    *
    */
    int main(int argc, char** argv) {

       audioChunk *chunk1=new audioChunk;

       audioChunk_dNorm *normChunk1=new audioChunk_dNorm;

       *chunk1=readData("./audio/demo-unprocessed.wav",0,1);

       normChunk1->fillAudioChunk(chunk1);

       ofstream file1;
       file1.open("./file/2wave.txt", std::ofstream::trunc);
       if(file1.is_open()) {
           for(int i=0;isize;i++) {
               int a=chunk1->data[i];
               file1&lt;code></iostream></fstream></cstdlib>

    I can’t understand why the outputs goes like this. Is it possible that the decoder can’t convert the samples (pcm_16le, 16bits) into FFMPEG AVFrame.data, that stores the samples ad uint8_t ? And if it is it is there some way to make FFMPEG work for audio files that stores samples at more than 8 bits ?

    The file graph1-demo_good.jpg is how the samples should be, extracted with a working LIBSNDFILE application that I made.

    EDIT : Seems like the program can’t convert the decoded data, couples of little endian bytes stored in a couple of uint8_t unsigned char, into the destination format (that i set as unsigned char[]), because it stores the bits as little-endian 16 bytes. So the data into audioChunk.data is right, but I have to read it not as an unsigned char, but as a couple of little-endian bytes.

  • To concatenate more than two video using FFMPEG

    21 décembre 2018, par Alok Kumar Verma

    I’ve been working on FFMPEG, this is indeed not an easy task since I’ve succeeded in doing some work. I’m done with concatenating two videos using ffmpeg but somehow when it comes to more than two it does not work. So I’m finding out some command to do my task.

    The thing I did is to merge two videos are :

    String complexCommand[] = {"-y", "-i", "/mnt/m_external_sd/Videos/VID-20161221-WA0000.mp4", "-i", "/mnt/m_external_sd/Videos/Brodha V - Aathma Raama [Music Video]_HD.mp4", "-strict", "experimental", "-filter_complex",
                "[0:v]scale=1920x1080,setsar=1:1[v0];[1:v] scale=iw*min(1920/iw\\,1080/ih):ih*min(1920/iw\\,1080/ih), pad=1920:1080:(1920-iw*min(1920/iw\\,1080/ih))/2:(1080-ih*min(1920/iw\\,1080/ih))/2,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=2:v=1:a=1",
                "-ab", "48000", "-ac", "2", "-ar", "22050", "-s", "1920x1080", "-vcodec", "libx264","-crf","27","-q","4","-preset", "ultrafast", savingPath};

    The above is working fine for two videos. I’ve tried altering my code for three videos but it does not work.

    What I’ve done in the above code is :

    • Added one more input after the second one
    • Changed the concat=3:v=1:a=1

    But it does not merge and gave me this error in my LogCat :

    FAILED with output : ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
                                                          built with gcc 4.8 (GCC)
                                                          configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/vagrant/SourceCode/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/vagrant/SourceCode/ffmpeg-android/build/armeabi-v7a --extra-cflags='-I/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all' --extra-ldflags='-L/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
                                                          libavutil      55. 17.103 / 55. 17.103
                                                          libavcodec     57. 24.102 / 57. 24.102
                                                          libavformat    57. 25.100 / 57. 25.100
                                                          libavdevice    57.  0.101 / 57.  0.101
                                                          libavfilter     6. 31.100 /  6. 31.100
                                                          libswscale      4.  0.100 /  4.  0.100
                                                          libswresample   2.  0.101 /  2.  0.101
                                                          libpostproc    54.  0.100 / 54.  0.100
                                                        Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/mnt/m_external_sd/Videos/VID-20161221-WA0000.mp4':
                                                          Metadata:
                                                            major_brand     : isom
                                                            minor_version   : 512
                                                            compatible_brands: isomiso2avc1mp41
                                                            encoder         : Lavf57.25.100
                                                          Duration: 00:02:47.09, start: 0.000000, bitrate: 245 kb/s
                                                            Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 854x480 [SAR 1:1 DAR 427:240], 112 kb/s, 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc (default)
                                                            Metadata:
                                                              handler_name    : VideoHandler
                                                            Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
                                                            Metadata:
                                                              handler_name    : SoundHandler
                                                        Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/mnt/m_external_sd/Videos/Brodha V - Aathma Raama [Music Video]_HD.mp4':
                                                          Metadata:
                                                            major_brand     : mp42
                                                            minor_version   : 0
                                                            compatible_brands: isommp42
                                                            creation_time   : 2013-12-15 13:11:41
                                                          Duration: 00:03:51.08, start: 0.000000, bitrate: 1693 kb/s
                                                            Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1498 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc (default)
                                                            Metadata:
                                                              handler_name    : VideoHandler
                                                            Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default)
                                                            Metadata:
                                                              creation_time   : 2013-12-15 13:11:41
                                                              handler_name    : IsoMedia File Produced by Google, 5-11-2011
                                                        Input #2, mov,mp4,m4a,3gp,3g2,mj2, from '/mnt/m_external_sd/DCIM/Sinha's POP/20150530_073113.mp4':
                                                          Metadata:
                                                            major_brand     : isom
                                                            minor_version   : 0
                                                            compatible_brands: isom3gp4
                                                            creation_time   : 2015-05-30 02:06:06
                                                          Duration: 00:04:48.48, start: 0.000000, bitrate: 3608 kb/s
                                                            Stream #2:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 720x480, 3478 kb/s, 30.28 fps, 30 tbr, 90k tbn, 180k tbc (default)
                                                            Metadata:
                                                              creation_time   : 2015-05-30 02:06:06
                                                              handler_name    : VideoHandle
                                                              encoder         :                                
                                                            Stream #2:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 125 kb/s (default)
                                                            Metadata:
                                                              creation_time   : 2015-05-30 02:06:06
                                                              handler_name    : SoundHandle
                                                        [Parsed_setsar_1 @ 0xa9ea9220] num:den syntax is deprecated, please use num/den or named options instead
                                                        [Parsed_setsar_4 @ 0xa9ea9310] num:den syntax is deprecated, please use num/den or named options instead
                                                        [Parsed_setsar_1 @ 0xa9ea92c0] num:den syntax is deprecated, please use num/den or named options instead
                                                        [Parsed_setsar_4 @ 0xa9ea93b0] num:den syntax is deprecated, please us

    I’ve tried one more command which works fine for concatenating two videos but still it does not work for more than two videos :

    String complexCommand[] = {"-y", "-i", "/mnt/m_external_sd/Videos/VID-20161221-WA0000.mp4", "-i", "/mnt/m_external_sd/Videos/Brodha V - Aathma Raama [Music Video]_HD.mp4", "-i", "/mnt/m_external_sd/DCIM/Sinha's POP/20150530_073113.mp4", "-strict", "experimental", "-filter_complex",
               "[0:v]scale=480x640,setsar=1:1[v0];[1:v]scale=480x640,setsar=1:1[v1];[v0][0:a][v1][1:a] concat=n=3:v=1:a=1",
               "-ab", "48000", "-ac", "2", "-ar", "22050", "-s", "480x640", "-vcodec", "libx264","-crf","27","-q","4","-preset", "ultrafast", savingPath};

    You can clearly see in the above code that I’ve tried using this for the three videos but still no luck. Will appreciate your help. Thanks.

    EDITS

    After following the LordNeckbeard’s suggestion from the comment section, I’ve used his suggestion in my code but after doing that still no luck however the console’s output got changed and here is the command which I used :

    String complexCommand[] = {"-y", "-i", "/mnt/m_external_sd/Videos/VID-20161221-WA0000.mp4", "-i", "/mnt/m_external_sd/Videos/Brodha V - Aathma Raama [Music Video]_HD.mp4", "-i", "/mnt/m_external_sd/DCIM/Sinha's POP/20150530_073113.mp4", "-strict", "experimental", "-filter_complex",
               "[0:v]scale=480x640,setsar=1[v0];[1:v]scale=480x640,setsar=1[v1];[v0][0:a][v1][1:a] concat=n=3:v=1:a=1",
               "-ab", "48000", "-ac", "2", "-ar", "22050", "-s", "480x640", "-vcodec", "libx264","-crf","27","-preset", "ultrafast", savingPath};

    Here you can clearly see that I’ve used setsar=1 and used -crf only.

    And the logs are :

    FAILED with output : ffmpeg version n3.0.1 Copyright (c) 2000-2016 the FFmpeg developers
                                                            built with gcc 4.8 (GCC)
                                                            configuration: --target-os=linux --cross-prefix=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/bin/arm-linux-androideabi- --arch=arm --cpu=cortex-a8 --enable-runtime-cpudetect --sysroot=/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/sysroot --enable-pic --enable-libx264 --enable-libass --enable-libfreetype --enable-libfribidi --enable-libmp3lame --enable-fontconfig --enable-pthreads --disable-debug --disable-ffserver --enable-version3 --enable-hardcoded-tables --disable-ffplay --disable-ffprobe --enable-gpl --enable-yasm --disable-doc --disable-shared --enable-static --pkg-config=/home/vagrant/SourceCode/ffmpeg-android/ffmpeg-pkg-config --prefix=/home/vagrant/SourceCode/ffmpeg-android/build/armeabi-v7a --extra-cflags='-I/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/include -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fno-strict-overflow -fstack-protector-all' --extra-ldflags='-L/home/vagrant/SourceCode/ffmpeg-android/toolchain-android/lib -Wl,-z,relro -Wl,-z,now -pie' --extra-libs='-lpng -lexpat -lm' --extra-cxxflags=
                                                            libavutil      55. 17.103 / 55. 17.103
                                                            libavcodec     57. 24.102 / 57. 24.102
                                                            libavformat    57. 25.100 / 57. 25.100
                                                            libavdevice    57.  0.101 / 57.  0.101
                                                            libavfilter     6. 31.100 /  6. 31.100
                                                            libswscale      4.  0.100 /  4.  0.100
                                                            libswresample   2.  0.101 /  2.  0.101
                                                            libpostproc    54.  0.100 / 54.  0.100
                                                          Input #0, mov,mp4,m4a,3gp,3g2,mj2, from '/mnt/m_external_sd/Videos/VID-20161221-WA0000.mp4':
                                                            Metadata:
                                                              major_brand     : isom
                                                              minor_version   : 512
                                                              compatible_brands: isomiso2avc1mp41
                                                              encoder         : Lavf57.25.100
                                                            Duration: 00:02:47.09, start: 0.000000, bitrate: 245 kb/s
                                                              Stream #0:0(und): Video: h264 (Main) (avc1 / 0x31637661), yuv420p, 854x480 [SAR 1:1 DAR 427:240], 112 kb/s, 23.98 fps, 23.98 tbr, 90k tbn, 47.95 tbc (default)
                                                              Metadata:
                                                                handler_name    : VideoHandler
                                                              Stream #0:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 125 kb/s (default)
                                                              Metadata:
                                                                handler_name    : SoundHandler
                                                          Input #1, mov,mp4,m4a,3gp,3g2,mj2, from '/mnt/m_external_sd/Videos/Brodha V - Aathma Raama [Music Video]_HD.mp4':
                                                            Metadata:
                                                              major_brand     : mp42
                                                              minor_version   : 0
                                                              compatible_brands: isommp42
                                                              creation_time   : 2013-12-15 13:11:41
                                                            Duration: 00:03:51.08, start: 0.000000, bitrate: 1693 kb/s
                                                              Stream #1:0(und): Video: h264 (High) (avc1 / 0x31637661), yuv420p, 1280x720, 1498 kb/s, 25 fps, 25 tbr, 50 tbn, 50 tbc (default)
                                                              Metadata:
                                                                handler_name    : VideoHandler
                                                              Stream #1:1(und): Audio: aac (LC) (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 191 kb/s (default)
                                                              Metadata:
                                                                creation_time   : 2013-12-15 13:11:41
                                                                handler_name    : IsoMedia File Produced by Google, 5-11-2011
                                                          Input #2, mov,mp4,m4a,3gp,3g2,mj2, from '/mnt/m_external_sd/DCIM/Sinha's POP/20150530_073113.mp4':
                                                            Metadata:
                                                              major_brand     : isom
                                                              minor_version   : 0
                                                              compatible_brands: isom3gp4
                                                              creation_time   : 2015-05-30 02:06:06
                                                            Duration: 00:04:48.48, start: 0.000000, bitrate: 3608 kb/s
                                                              Stream #2:0(eng): Video: h264 (Baseline) (avc1 / 0x31637661), yuv420p, 720x480, 3478 kb/s, 30.28 fps, 30 tbr, 90k tbn, 180k tbc (default)
                                                              Metadata:
                                                                creation_time   : 2015-05-30 02:06:06
                                                                handler_name    : VideoHandle
                                                                encoder         :                                
                                                              Stream #2:1(eng): Audio: aac (LC) (mp4a / 0x6134706D), 48000 Hz, mono, fltp, 125 kb/s (default)
                                                              Metadata:
                                                                creation_time   : 2015-05-30 02:06:06
                                                                handler_name    : SoundHandle
                                                          [Parsed_concat_4 @ 0xa7ea91d0] Input link in2:v0 parameters (size 720x480, SAR 0:1) do not match the corresponding output link in0:v0 parameters (480x640, SAR 1:1)
                                                          [Parsed_concat_4 @ 0xa7ea91d0] Failed to configure output pad on Parsed_concat_4
                                                          Error configuring complex filters.
                                                          Invalid argument

    NOTE : I have tried using setsar=1/1 but still got the same result.