Recherche avancée

Médias (0)

Mot : - Tags -/auteurs

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

Autres articles (31)

  • ANNEXE : Les plugins utilisés spécifiquement pour la ferme

    5 mars 2010, par

    Le site central/maître de la ferme a besoin d’utiliser plusieurs plugins supplémentaires vis à vis des canaux pour son bon fonctionnement. le plugin Gestion de la mutualisation ; le plugin inscription3 pour gérer les inscriptions et les demandes de création d’instance de mutualisation dès l’inscription des utilisateurs ; le plugin verifier qui fournit une API de vérification des champs (utilisé par inscription3) ; le plugin champs extras v2 nécessité par inscription3 (...)

  • Encoding and processing into web-friendly formats

    13 avril 2011, par

    MediaSPIP automatically converts uploaded files to internet-compatible formats.
    Video files are encoded in MP4, Ogv and WebM (supported by HTML5) and MP4 (supported by Flash).
    Audio files are encoded in MP3 and Ogg (supported by HTML5) and MP3 (supported by Flash).
    Where possible, text is analyzed in order to retrieve the data needed for search engine detection, and then exported as a series of image files.
    All uploaded files are stored online in their original format, so you can (...)

  • L’utiliser, en parler, le critiquer

    10 avril 2011

    La première attitude à adopter est d’en parler, soit directement avec les personnes impliquées dans son développement, soit autour de vous pour convaincre de nouvelles personnes à l’utiliser.
    Plus la communauté sera nombreuse et plus les évolutions seront rapides ...
    Une liste de discussion est disponible pour tout échange entre utilisateurs.

Sur d’autres sites (5624)

  • Duplicate a signal with FFmpeg library [on hold]

    22 septembre 2016, par Meugiwara

    I’m using the FFmpeg library to develop a program in C/C++. At this time, my aim is to duplicate the signal when I open an audio file. My scheme is the next : read an audio file, transform the stereo signal in mono signal and duplicate this mono signal to get two mono signal exactly the same.

    I watched in the Doxygen documentation on the official website, but I don’t find something interesting. Do someone know a good way to do this ?

    Here’s what I have so far :

    #include
    #include
    #include

    #define __STDC_CONSTANT_MACROS

    #ifdef _WIN32

    extern "C" /* Windows */
    {
       #include "libswresample/swresample.h"
       #include "libavformat/avformat.h"
       #include "libavcodec/avcodec.h"
       #include "SDL2/SDL.h"
    };

    #else

    #ifdef __cplusplus

    extern "C" /* Linux */
    {
       #endif /* __cplusplus */
       #include <libswresample></libswresample>swresample.h>
       #include <libavformat></libavformat>avformat.h>
       #include <libavcodec></libavcodec>avcodec.h>
       #include <sdl2></sdl2>SDL.H>
       #ifdef __cplusplus
    };

    #endif /* __cplusplus */

    #endif /* _WIN32 */

    #define MAX_AUDIO_FRAME_SIZE 192000 /* 1 second of 48 kHz 32 bits audio*/
    #define OUTPUT_PCM 1 /* Output PCM */
    #define USE_SDL 1 /* Use SDL */

    /* Les incrémentations */
    static Uint32 audio_len;
    static Uint8 *audio_chunk;
    static Uint8 *audio_pos;

    void    fill_audio(void *udata, Uint8 *stream, int len)
    {
       SDL_memset(stream, 0, len); /* SDL 2.0 */
       if (audio_len == 0)
           return;
       len = (len > audio_len ? audio_len : len);
       SDL_MixAudio(stream, audio_pos, len, SDL_MIX_MAXVOLUME);
       audio_pos = audio_pos + len;
       audio_len = audio_len - len;
    }

    int     reading_sound(char *str)
    {
       SDL_AudioSpec       wanted_spec;
       AVFormatContext     *pFormatCtx;
       AVCodecContext      *pCodecCtx;
       AVSampleFormat      out_sample_fmt;
       AVPacket            *packet;
       AVFrame             *pFrame;
       AVCodec             *pCodec;
       uint64_t            out_channel_layout;
       uint8_t             *out_buffer;
       int64_t             in_channel_layout;
       struct SwrContext   *au_convert_ctx;
       int                 out_sample_rate;
       int                 out_buffer_size;
       int                 out_nb_samples;
       int                 out_channels;
       int                 audioStream;
       int                 got_picture;
       int                 index = 0;
       int                 ret;
       int                 i;
       FILE                *pFile = NULL;
       /*
       //char              *sound = "WavinFlag.aac";
       */

       av_register_all();
       avformat_network_init();
       pFormatCtx = avformat_alloc_context();
       if (avformat_open_input(&amp;pFormatCtx, str, NULL, NULL) != 0) /* Ouverture du fichier */
       {
           fprintf(stderr, "%s\n", "Couldn't open input stream");
           return (-1);
       }
       if (avformat_find_stream_info(pFormatCtx, NULL) &lt; 0) /* Récupérer les informations */
       {
           fprintf(stderr, "Couldn't find stream information\n");
           return (-1);
       }
       av_dump_format(pFormatCtx, 0, str, false); /* Envoyer les informations utiles sur la sortie d'erreur */
       audioStream = -1;
       for (i = 0; i &lt; pFormatCtx->nb_streams; i++) /* Trouver le début du son */
           if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_AUDIO)
           {
               audioStream = i;
               break;
           }
       if (audioStream == -1)
       {
           fprintf(stderr, "%s\n", "Didn't find an audio stream");
           return (-1);
       }
       pCodecCtx = pFormatCtx->streams[audioStream]->codec;
       pCodec = avcodec_find_decoder(pCodecCtx->codec_id); /* Trouver le décodeur du fichier (.aac, .mp3, ...) */
       if (pCodec == NULL)
       {
           fprintf(stderr, "%s\n", "Codec not found");
           return (-1);
       }
       if (avcodec_open2(pCodecCtx, pCodec, NULL) &lt; 0) /* Ouvrir le décodeur du fichier */
       {
           fprintf(stderr, "%s\n", "Couldn't open codec");
           return (-1);
       }

       #if OUTPUT_PCM

           pFile = fopen("output.pcm", "wb"); /* Créer et écrire tout ce qui se passe dans ce fichier */

       #endif /* OUTPUT_PCM */

       packet = (AVPacket *)av_malloc(sizeof(AVPacket)); /* Allouer taille */
       av_init_packet(packet);
       out_channel_layout = AV_CH_LAYOUT_MONO; /* Canaux de sortie */
       out_nb_samples = pCodecCtx->frame_size; /* L'échantillonnage - Le nombre de samples*/
       out_sample_fmt = AV_SAMPLE_FMT_S16; /* Format */
       out_sample_rate = 44100; /* Fréquence */
       out_channels = av_get_channel_layout_nb_channels(out_channel_layout); /* Récupérer le nombre de canaux */
       /*
       // printf("%d\n", out_channels);
       // system("PAUSE");
       */
       out_buffer_size = av_samples_get_buffer_size(NULL, out_channels, out_nb_samples, out_sample_fmt, 1); /* Taille du buffer */
       out_buffer = (uint8_t *)av_malloc(MAX_AUDIO_FRAME_SIZE * 2); /* Allouer taille */
       pFrame = av_frame_alloc(); /* Allouer taille */

       #if USE_SDL

           if (SDL_Init(SDL_INIT_VIDEO |SDL_INIT_AUDIO | SDL_INIT_TIMER)) /* Initialiser SDL */
           {
               fprintf(stderr, "%s - %s\n", "Couldn't initialize SDL", SDL_GetError());
               return (-1);
           }
           /*
           // Attribution des valeurs avec les variables au-dessus
           */
           wanted_spec.freq = out_sample_rate;
           wanted_spec.format = AUDIO_S16SYS;
           wanted_spec.channels = out_channels;
           wanted_spec.silence = 0;
           wanted_spec.samples = out_nb_samples;
           wanted_spec.callback = fill_audio;
           wanted_spec.userdata = pCodecCtx;
           if (SDL_OpenAudio(&amp;wanted_spec, NULL) &lt; 0)
           {
               fprintf(stderr, "%s\n", "Can't open audio");
               return (-1);
           }

       #endif /* USE_SDL */

       in_channel_layout = av_get_default_channel_layout(pCodecCtx->channels);
       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);
       while (av_read_frame(pFormatCtx, packet) >= 0) /* Lecture du fichier */
       {
           if (packet->stream_index == audioStream)
           {
               ret = avcodec_decode_audio4(pCodecCtx, pFrame, &amp;got_picture, packet); /* Décoder les packets */
               if (ret &lt; 0)
               {
                   fprintf(stderr, "%s\n", "Error in decoding audio frame");
                   return (-1);
               }
               if (got_picture > 0)
               {
                   swr_convert(au_convert_ctx, &amp;out_buffer, MAX_AUDIO_FRAME_SIZE, (const uint8_t **)pFrame->data, pFrame->nb_samples);

       #if 1

                   printf("Index : %5d\t Points : %lld\t Packet size : %d\n", index, packet->pts, packet->size); /* Affichage des informations sur la console */

       #endif /* 1 */

       #if OUTPUT_PCM

                   fwrite(out_buffer, 1, out_buffer_size, pFile); /* Faire l'écriture dans le fichier */

       #endif /* OUTPUT_PCM */

                   index = index + 1;
               }

       #if USE_SDL

               while (audio_len > 0)
                   SDL_Delay(1);
               audio_chunk = (Uint8 *)out_buffer;
               audio_len = out_buffer_size;
               audio_pos = audio_chunk;
               SDL_PauseAudio(0);

       #endif /* USE_SDL */

           }
           av_free_packet(packet); /* Libérer les packets */
       }
       swr_free(&amp;au_convert_ctx); /* Libérer la taille de conversion */

       #if USE_SDL

       SDL_CloseAudio(); /* Arrêter le son dans SDL */
       SDL_Quit(); /* Quitter SDL */

       #endif /* USE_SDL */

       #if OUTPUT_PCM

       fclose(pFile); /* Fermer le fichier d'écriture */

       #endif /* OUTPUT_PCM */

       av_free(out_buffer);
       avcodec_close(pCodecCtx); /* Fermer le décodeur */
       avformat_close_input(&amp;pFormatCtx); /* Fermer le fichier lu */
       return (0);
    }

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

       if (argc != 2)
       {
           fprintf(stderr, "%s\n", "Usage : ./BASELFI [File]");
           system("PAUSE");
           return (-1);
       }
       else
       {
           reading_sound(argv[1]);
           return (0);
       }
       return (0);
    }
  • Ffmpeg set output format C++

    7 septembre 2022, par Turgut

    I made a program that encodes a video and I want to specify the format as h264 but I can't figure out how to do it. It automatically sets the format to mpeg4 and I can't change it. I got my code from ffmpegs official examples muxing.c and slightly edited it to fit my code (I haven't changed much especially did not touch the parts where it sets the format)

    &#xA;

    Here is my code so for (I have trimmed down the code slightly, removing redundant parts)

    &#xA;

    video_encoder.cpp :

    &#xA;

    &#xA;video_encoder::video_encoder(int w, int h, float fps, unsigned int duration) &#xA; :width(w), height(h), STREAM_FRAME_RATE(fps), STREAM_DURATION(duration)&#xA;{&#xA;    std::string as_str = "./output/video.mp4";&#xA;&#xA;    char* filename = const_cast(as_str.c_str());&#xA;    enc_inf.video_st, enc_inf.audio_st = (struct OutputStream) { 0 };&#xA;    enc_inf.video_st.next_pts = 1; &#xA;    enc_inf.audio_st.next_pts = 1;&#xA;    enc_inf.encode_audio, enc_inf.encode_video = 0;&#xA;    int ret;&#xA;    int i;&#xA;&#xA;    /* allocate the output media context */&#xA;    avformat_alloc_output_context2(&amp;enc_inf.oc, NULL, NULL, filename);&#xA;&#xA;    if (!enc_inf.oc) {&#xA;        std::cout &lt;&lt; "FAILED" &lt;&lt; std::endl;&#xA;        avformat_alloc_output_context2(&amp;enc_inf.oc, NULL, "mpeg", filename);&#xA;    }&#xA;&#xA;    enc_inf.fmt = enc_inf.oc->oformat;&#xA;&#xA;    /* Add the audio and video streams using the default format codecs&#xA;     * and initialize the codecs. */&#xA;    if (enc_inf.fmt->video_codec != AV_CODEC_ID_NONE) {&#xA;        add_stream(&amp;enc_inf.video_st, enc_inf.oc, &amp;video_codec, enc_inf.fmt->video_codec);&#xA;        enc_inf.have_video = 1;&#xA;        enc_inf.encode_video = 1;&#xA;    }&#xA;    if (enc_inf.fmt->audio_codec != AV_CODEC_ID_NONE) {&#xA;        add_stream(&amp;enc_inf.audio_st, enc_inf.oc, &amp;audio_codec, enc_inf.fmt->audio_codec);&#xA;        enc_inf.have_audio = 1;&#xA;        enc_inf.encode_audio = 1;&#xA;    }&#xA;&#xA;    /* Now that all the parameters are set, we can open the audio and&#xA;     * video codecs and allocate the necessary encode buffers. */&#xA;    if (enc_inf.have_video)&#xA;        open_video(enc_inf.oc, video_codec, &amp;enc_inf.video_st, opt);&#xA;&#xA;    if (enc_inf.have_audio)&#xA;        open_audio(enc_inf.oc, audio_codec, &amp;enc_inf.audio_st, opt);&#xA;    av_dump_format(enc_inf.oc, 0, filename, 1);&#xA;&#xA;    /* open the output file, if needed */&#xA;    if (!(enc_inf.fmt->flags &amp; AVFMT_NOFILE)) {&#xA;        ret = avio_open(&amp;enc_inf.oc->pb, filename, AVIO_FLAG_WRITE);&#xA;        if (ret &lt; 0) {&#xA;            //VI_ERROR("Could not open &#x27;%s&#x27;: %s\n", filename, ret);&#xA;            //return 1;&#xA;        }&#xA;    }&#xA;&#xA;    /* Write the stream header, if any. */&#xA;    ret = avformat_write_header(enc_inf.oc, &amp;opt);&#xA;    if (ret &lt; 0) {&#xA;        VI_ERROR("Error occurred when opening output file:");&#xA;        //return 1;&#xA;    }&#xA;    &#xA;    //return 0;&#xA;}&#xA;&#xA;&#xA;/* Add an output stream. */&#xA;void video_encoder::add_stream(OutputStream *ost, AVFormatContext *oc,&#xA;                       const AVCodec **codec,&#xA;                       enum AVCodecID codec_id)&#xA;{&#xA;    AVCodecContext *c;&#xA;    int i;&#xA;&#xA;    /* find the encoder */&#xA;    *codec = avcodec_find_encoder(codec_id);&#xA;    &#xA;    if (!(*codec)) {&#xA;        fprintf(stderr, "Could not find encoder for &#x27;%s&#x27;\n",&#xA;                avcodec_get_name(codec_id));&#xA;        exit(1);&#xA;    }&#xA;&#xA;    ost->tmp_pkt = av_packet_alloc();&#xA;&#xA;    if (!ost->tmp_pkt) {&#xA;        fprintf(stderr, "Could not allocate AVPacket\n");&#xA;        exit(1);&#xA;    }&#xA;&#xA;    ost->st = avformat_new_stream(oc, NULL);&#xA;    if (!ost->st) {&#xA;        fprintf(stderr, "Could not allocate stream\n");&#xA;        exit(1);&#xA;    }&#xA;    ost->st->id = oc->nb_streams-1;&#xA;    c = avcodec_alloc_context3(*codec);&#xA;    if (!c) {&#xA;        fprintf(stderr, "Could not alloc an encoding context\n");&#xA;        exit(1);&#xA;    }&#xA;    ost->enc = c;&#xA;&#xA;&#xA;    switch ((*codec)->type) {&#xA;    case AVMEDIA_TYPE_AUDIO:&#xA;        ...&#xA;        break;&#xA;    case AVMEDIA_TYPE_VIDEO:&#xA;        c->codec_id = codec_id;&#xA;&#xA;        c->bit_rate = 10000;&#xA;        /* Resolution must be a multiple of two. */&#xA;        c->width    = width;&#xA;        c->height   = height;&#xA;        /* timebase: This is the fundamental unit of time (in seconds) in terms&#xA;         * of which frame timestamps are represented. For fixed-fps content,&#xA;         * timebase should be 1/framerate and timestamp increments should be&#xA;         * identical to 1. */&#xA;        ost->st->time_base = (AVRational){ 1, STREAM_FRAME_RATE }; // *frame_rate&#xA;        c->time_base       = ost->st->time_base;&#xA;&#xA;        c->gop_size      = 7; /* emit one intra frame every twelve frames at most */&#xA;        //c->codec_id      = AV_CODEC_ID_H264;&#xA;        c->pix_fmt       = STREAM_PIX_FMT;&#xA;        //if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) &#xA;        //    c->max_b_frames = 2;&#xA;        if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {&#xA;            /* Needed to avoid using macroblocks in which some coeffs overflow.&#xA;             * This does not happen with normal video, it just happens here as&#xA;             * the motion of the chroma plane does not match the luma plane. */&#xA;            c->mb_decision = 2;&#xA;        }&#xA;&#xA;        if ((*codec)->pix_fmts){&#xA;            //c->pix_fmt = (*codec)->pix_fmts[0];&#xA;            std::cout &lt;&lt; "NEW FORMAT : " &lt;&lt; c->pix_fmt &lt;&lt; std::endl;&#xA;        }&#xA;&#xA;        break;&#xA;    }&#xA;     &#xA;&#xA;    /* Some formats want stream headers to be separate. */&#xA;    if (oc->oformat->flags &amp; AVFMT_GLOBALHEADER)&#xA;        c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;&#xA;}&#xA;

    &#xA;

    video_encoder.h

    &#xA;

    &#xA;typedef struct OutputStream {&#xA;    AVStream *st;&#xA;    AVCodecContext *enc;&#xA;&#xA;    /* pts of the next frame that will be generated */&#xA;    int64_t next_pts;&#xA;    int samples_count;&#xA;&#xA;    AVFrame *frame;&#xA;    AVFrame *tmp_frame;&#xA;&#xA;    AVPacket *tmp_pkt;&#xA;&#xA;    float t, tincr, tincr2;&#xA;&#xA;    struct SwsContext *sws_ctx;&#xA;    struct SwrContext *swr_ctx;&#xA;} OutputStream;&#xA;&#xA;class video_encoder{&#xA;    private:&#xA;        typedef struct {&#xA;            OutputStream video_st, audio_st;&#xA;            const AVOutputFormat *fmt;&#xA;            AVFormatContext *oc;&#xA;            int have_video, have_audio, encode_video, encode_audio;&#xA;            std::string name;&#xA;        } encode_info;&#xA;    public:&#xA;        encode_info enc_inf;&#xA;        video_encoder(int w, int h, float fps, unsigned int duration);&#xA;        ~video_encoder();  &#xA;        ...&#xA;    private:&#xA;        ...&#xA;        void add_stream(OutputStream *ost, AVFormatContext *oc,&#xA;                       const AVCodec **codec,&#xA;                       enum AVCodecID codec_id);&#xA;

    &#xA;

    I'm thinking that the example sets the codec at avformat_alloc_output_context2(&amp;enc_inf.oc, NULL, NULL, filename) but I'm not quite sure how to set it to h264.

    &#xA;

    I've tried something like this avformat_alloc_output_context2(&amp;enc_inf.oc, enc_inf.fmt, "h264", filename)

    &#xA;

    But it just gives a seg fault. What am I supposed to do ?

    &#xA;

    Edit : I've tried adding these two lines to video_encoder::video_encoder by deleting avformat_alloc_output_context2(&amp;enc_inf.oc, NULL, NULL, filename); :

    &#xA;

    &#xA;    video_codec = avcodec_find_encoder(AV_CODEC_ID_H264);&#xA;    enc_inf.video_st.enc = avcodec_alloc_context3(video_codec);&#xA;&#xA;

    &#xA;

    But it resulted in these errors :&#xA;It says this every frame (A bunch of times)

    &#xA;

    [mpeg @ 0x56057c465480] buffer underflow st=0 bufi=26822 size=31816&#xA;

    &#xA;

    Says this once when the frame encoding loop is over :

    &#xA;

    [mpeg @ 0x5565ac4a04c0] start time for stream 0 is not set in estimate_timings_from_pts&#xA;[mpeg @ 0x5565ac4a04c0] stream 0 : no TS found at start of file, duration not set&#xA;[mpeg @ 0x5565ac4a04c0] Could not find codec parameters for stream 0 (Video: mpeg2video, none): unspecified size&#xA;Consider increasing the value for the &#x27;analyzeduration&#x27; (0) and &#x27;probesize&#x27; (5000000) options&#xA;

    &#xA;

  • How to use Behavioural Analytics to Improve Website Performance

    20 septembre 2021, par Ben Erskine — Analytics Tips, Plugins, Heatmap

    User behavioural analytics (UBA) give your business unique insights into your customers. 

    Where traditional website metrics track what actions are completed or how many visitors you have, user behaviour shows the driving factors behind those actions. UBA tools such as website heatmap software provide an easy-to-read visualisation of this data. 

    Ultimately, user behaviour analysis improves website performance and conversions by boosting customer engagement, optimising positive customer experiences, and focusing on the most important part of your sales : the people who are actually buying from you. 

    What is user behaviour analytics ?

    User behaviour analytics (UBA) is data that shows how customers and website visitors interact with your brand online. 

    UBA is tracked using tools such as heatmaps, session recordings and data visualisation software. 

    Where traditional web analytics track metrics such as page views and bounce rates, behavioural analytics provide an even more in-depth picture of your website or funnel success. 

    For example, UBA tracks actions like 

    • How far users are scrolling down the page 
    • Which CTA’s and copy they are focusing on (or not focusing on) 
    • Which design elements, links or buttons they are interacting with 
    • What is happening in between each action

    Tracking user behaviour metrics help keep visitors on your website longer because they analyse where customers may be confused or unclear so you can fix it. 

    What’s the difference between data and behavioural analytics ?

    There are a few key differences between data and behavioural analytics. While data analytics are beneficial to improving website performance, using UBA creates a more customer-centric approach to funnel building. 

    The biggest difference between data and behavioural analytics ? Metric data shows which actions are happening. Behavioural analytics show you WHY they are happening. 

    For example, data can show you that a customer bounced or clicked away. Behaviour analytics show you that a page took a long time to load, they tried to click a link several times and then maybe got frustrated and clicked away. 

    Key differences between data analytics and behavioural analytics : 

    • What is happening versus what is driving it 
    • Track an action (e.g. click-through) versus tracking inaction (e.g. hover without clicking) 
    • Measuring completion of an action versus the flow of actions to complete action 
    • Source of traffic versus individual actions 
    • What happens when someone takes an action versus what happens in between taking action 

    Matomo heatmaps offer both website analytics and user behaviour for a comprehensive analysis.

    Why do behavioural analytics help improve website performance ?

    User behaviour is important because it doesn’t matter how many website visitors you have if they don’t convert. 

    If you have a lot of traffic on mobile devices, but a low CTR, heatmaps show you what is causing the low conversions. Perhaps there is a button that isn’t optimised for mobile scrolling, or a pop up that covers important copy. 

    Analysing the driving factors behind each decision means that you can increase sign-ups and conversions without losing money on website traffic that never actually buys. 

    Matomo's heatmaps feature

    How do heatmap tools show website user behaviour analytics ? 

    Heatmap tools provide a visual representation of user behaviour. 

    There are several key ways that heatmap tracking can improve website performance and therefore your overall conversions.

    Firstly, heatmaps show where to optimise website structure. It uses real visitor experiences to indicate whether customers have to scroll to reach important content, whether important messages are being missed, and whether CTAs are clear. 

    Secondly, heatmaps provide always-on UX and useability testing for your website, identifying user frustrations and optimising their experience over time.

    They also show valuable user experience insights for A/B versions of a landing page. Not only will you see the raw conversion data, but you will also understand why one page converts more than another.

    Ultimately, heatmaps increase ROI on marketing by optimising the traffic that you are sending to your website.

    Matomo Heatmaps - Hotjar alternative

    5 ways heatmaps and user behaviour analytics improve website performance and conversions

    #1. Improve customer experience

    One of the most important uses for UBA is to improve your customer experience. 

    Imagine you had a physical store. If there was something blocking customers from getting to the counter you could easily see and fix the problem. 

    It is just as important for an online store to find and fix these “roadblocks”. 

    Not only does it reduce friction in the sales funnel and make it easy for customers to buy from you, it improves their overall experience. And when 86% of buyers are willing to pay more for a great customer experience, UBA should be one of your number one priorities for growing your bottom line. 

    #2. Improve customer engagement

    Customer engagement is any interaction between a customer/product user and your business. 

    User behaviour analytics increase engagement at each customer journey touch point. 

    Using data from heatmaps will improve customer engagement because it gives you insights into how you can make your website more user friendly. This reduces friction and increases customer loyalty by making sure customers :

    • See important content 
    • Are not distracted by unnecessary elements 
    • Can easily access information or pages no matter what device they are using 
    • Are clicking on important page elements that take them further through the customer journey 

    For example, say a customer is on a sales page. A heatmap might show that pop ups or design elements like links to another page are pulling their attention away from the primary focus (i.e. the sales copy). 

    #3. Focus on customer-centric approach 

    A customer-centric approach means putting your customers at the centre of everything that you do. There is a lot of competition for your customers’ hard earned dollars, so you need to stand out. A good product or service is not enough on its own anymore. 

    User behaviour analytics are at the heart of customer-centric strategies. Instead of guessing how customers interact with your online presence, tools like heatmaps give insight into exactly what customers need. 

    This matched with an effective customer feedback strategy gives a holistic and effective approach to improving your customer experiences. 

    #4. Capture customer data across multiple channels

    Most customers won’t convert on their very first visit to a website. They might interact with your business across many channels and research your product multiple times before purchasing. 

    Multi Channel Conversion Attribution, also known as Cross Channel Attribution, lets you assign a value to each visit prior to a conversion or prior to a sale. By applying different attribution models, you get a better view on which channels actually lead to a conversion.

    User behaviour analytics like the multi channel conversion attribution that Matomo offers can show you exactly where you should focus your money to acquire new customers. 

    #5. Track and measure business objectives

    User behaviour analytics like heatmaps can show you whether you are actually hitting your targets. 

    Setting goals helps track your website performance against business objectives. 

    These include objectives such as lead generation, online sales and increased brand exposure. Matomo has a specific function for tracking goals and measuring analytics.

    Using a combination of UBA and data metrics will produce the most effective conversions. 

    For example, a customer reaching the payment confirmation page is a common objective to measure conversions. However, it is only tracked if they actually complete the action. Measuring on-page customer activity with heatmaps shows why they do or do not convert so you can fix issues. 

    Final thoughts on user behaviour analytics 

    User behavioural analytics (UBA) provide a unique and in-depth insight into your customers and their needs. Unlike traditional data metrics that track completed actions, UBA like heatmaps show you what happens in between each action and help fix any critical issues. 

    Heatmaps are your secret weapon to improving website performance while staying customer-centric ! 

    Want to know how heatmap analytics increase conversions and improve customer experience without spending more on traffic or marketing ? Check out some of the other in depth guides below. 

    The Ultimate Guide to Heatmap Software

    10 Proven Ways Heatmap Software Improves Website Conversions

    Heatmap Video

    Session Recording Video