Recherche avancée

Médias (91)

Autres articles (97)

  • MediaSPIP 0.1 Beta version

    25 avril 2011, par

    MediaSPIP 0.1 beta is the first version of MediaSPIP proclaimed as "usable".
    The zip file provided here only contains the sources of MediaSPIP in its standalone version.
    To get a working installation, you must manually install all-software dependencies on the server.
    If you want to use this archive for an installation in "farm mode", you will also need to proceed to other manual (...)

  • HTML5 audio and video support

    13 avril 2011, par

    MediaSPIP uses HTML5 video and audio tags to play multimedia files, taking advantage of the latest W3C innovations supported by modern browsers.
    The MediaSPIP player used has been created specifically for MediaSPIP and can be easily adapted to fit in with a specific theme.
    For older browsers the Flowplayer flash fallback is used.
    MediaSPIP allows for media playback on major mobile platforms with the above (...)

  • 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 (...)

Sur d’autres sites (8445)

  • Muxing Android MediaCodec encoded H264 packets into RTMP

    31 décembre 2015, par Vadym

    I am coming from a thread Encoding H.264 from camera with Android MediaCodec. My setup is very similar. However, I attempt to write mux the encoded frames and with javacv and broadcast them via rtmp.

    RtmpClient.java

    ...
    private volatile BlockingQueue mFrameQueue = new LinkedBlockingQueue(MAXIMUM_VIDEO_FRAME_BACKLOG);
    ...
    private void startStream() throws FrameRecorder.Exception, IOException {
       if (TextUtils.isEmpty(mDestination)) {
           throw new IllegalStateException("Cannot start RtmpClient without destination");
       }

       if (mCamera == null) {
           throw new IllegalStateException("Cannot start RtmpClient without camera.");
       }

       Camera.Parameters cameraParams = mCamera.getParameters();

       mRecorder = new FFmpegFrameRecorder(
               mDestination,
               mVideoQuality.resX,
               mVideoQuality.resY,
               (mAudioQuality.channelType.equals(AudioQuality.CHANNEL_TYPE_STEREO) ? 2 : 1));

       mRecorder.setFormat("flv");

       mRecorder.setFrameRate(mVideoQuality.frameRate);
       mRecorder.setVideoBitrate(mVideoQuality.bitRate);
       mRecorder.setVideoCodec(avcodec.AV_CODEC_ID_H264);

       mRecorder.setSampleRate(mAudioQuality.samplingRate);
       mRecorder.setAudioBitrate(mAudioQuality.bitRate);
       mRecorder.setAudioCodec(avcodec.AV_CODEC_ID_AAC);

       mVideoStream = new VideoStream(mRecorder, mVideoQuality, mFrameQueue, mCamera);
       mAudioStream = new AudioStream(mRecorder, mAudioQuality);

       mRecorder.start();

       // Setup a bufferred preview callback
       setupCameraCallback(mCamera, mRtmpClient, DEFAULT_PREVIEW_CALLBACK_BUFFERS,
               mVideoQuality.resX * mVideoQuality.resY * ImageFormat.getBitsPerPixel(
                       cameraParams.getPreviewFormat())/8);

       try {
           mVideoStream.start();
           mAudioStream.start();
       }
       catch(Exception e) {
           e.printStackTrace();
           stopStream();
       }
    }
    ...
    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
       boolean frameQueued = false;

       if (mRecorder == null || data == null) {
           return;
       }

       frameQueued = mFrameQueue.offer(data);

       // return the buffer to be reused - done in videostream
       //camera.addCallbackBuffer(data);
    }
    ...

    VideoStream.java

    ...
    @Override
    public void run() {
       try {
           mMediaCodec = MediaCodec.createEncoderByType("video/avc");
           MediaFormat mediaFormat = MediaFormat.createVideoFormat("video/avc", mVideoQuality.resX, mVideoQuality.resY);
           mediaFormat.setInteger(MediaFormat.KEY_BIT_RATE, mVideoQuality.bitRate);
           mediaFormat.setInteger(MediaFormat.KEY_FRAME_RATE, mVideoQuality.frameRate);
           mediaFormat.setInteger(MediaFormat.KEY_COLOR_FORMAT, MediaCodecInfo.CodecCapabilities.COLOR_FormatYUV420SemiPlanar);
           mediaFormat.setInteger(MediaFormat.KEY_I_FRAME_INTERVAL, 1);
           mMediaCodec.configure(mediaFormat, null, null, MediaCodec.CONFIGURE_FLAG_ENCODE);
           mMediaCodec.start();
       }
       catch(IOException e) {
           e.printStackTrace();
       }

       long startTimestamp = System.currentTimeMillis();
       long frameTimestamp = 0;
       byte[] rawFrame = null;

       try {
           while (!Thread.interrupted()) {
               rawFrame = mFrameQueue.take();

               frameTimestamp = 1000 * (System.currentTimeMillis() - startTimestamp);

               encodeFrame(rawFrame, frameTimestamp);

               // return the buffer to be reused
               mCamera.addCallbackBuffer(rawFrame);
           }
       }
       catch (InterruptedException ignore) {
           // ignore interrup while waiting
       }

       // Clean up video stream allocations
       try {
           mMediaCodec.stop();
           mMediaCodec.release();
           mOutputStream.flush();
           mOutputStream.close();
       } catch (Exception e){
           e.printStackTrace();
       }
    }
    ...
    private void encodeFrame(byte[] input, long timestamp) {
       try {
           ByteBuffer[] inputBuffers = mMediaCodec.getInputBuffers();
           ByteBuffer[] outputBuffers = mMediaCodec.getOutputBuffers();

           int inputBufferIndex = mMediaCodec.dequeueInputBuffer(0);

           if (inputBufferIndex >= 0) {
               ByteBuffer inputBuffer = inputBuffers[inputBufferIndex];
               inputBuffer.clear();
               inputBuffer.put(input);
               mMediaCodec.queueInputBuffer(inputBufferIndex, 0, input.length, timestamp, 0);
           }

           MediaCodec.BufferInfo bufferInfo = new MediaCodec.BufferInfo();

           int outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);

           if (outputBufferIndex >= 0) {
               while (outputBufferIndex >= 0) {
                   ByteBuffer outputBuffer = outputBuffers[outputBufferIndex];

                   // Should this be a direct byte buffer?
                   byte[] outData = new byte[bufferInfo.size - bufferInfo.offset];
                   outputBuffer.get(outData);

                   mFrameRecorder.record(outData, bufferInfo.offset, outData.length, timestamp);

                   mMediaCodec.releaseOutputBuffer(outputBufferIndex, false);
                   outputBufferIndex = mMediaCodec.dequeueOutputBuffer(bufferInfo, 0);
               }
           }
           else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_BUFFERS_CHANGED) {
               outputBuffers = mMediaCodec.getOutputBuffers();
           } else if (outputBufferIndex == MediaCodec.INFO_OUTPUT_FORMAT_CHANGED) {
               // ignore for now
           }
       } catch (Throwable t) {
           t.printStackTrace();
       }

    }
    ...

    FFmpegFrameRecorder.java

    ...
    // Hackish codec copy frame recording function
    public boolean record(byte[] encodedData, int offset, int length, long frameCount) throws Exception {
       int ret;

       if (encodedData == null) {
           return false;
       }

       av_init_packet(video_pkt);

       // this is why i wondered whether I should get outputbuffer data into direct byte buffer
       video_outbuf.put(encodedData, 0, encodedData.length);

       video_pkt.data(video_outbuf);
       video_pkt.size(video_outbuf_size);

       video_pkt.pts(frameCount);
       video_pkt.dts(frameCount);

       video_pkt.stream_index(video_st.index());

       synchronized (oc) {
           /* write the compressed frame in the media file */
           if (interleaved && audio_st != null) {
               if ((ret = av_interleaved_write_frame(oc, video_pkt)) < 0) {
                   throw new Exception("av_interleaved_write_frame() error " + ret + " while writing interleaved video frame.");
               }
           } else {
               if ((ret = av_write_frame(oc, video_pkt)) < 0) {
                   throw new Exception("av_write_frame() error " + ret + " while writing video frame.");
               }
           }
       }
       return (video_pkt.flags() & AV_PKT_FLAG_KEY) == 1;
    }
    ...

    When I try to stream the video and run ffprobe on it, I get the following output :

    ffprobe version 2.5.3 Copyright (c) 2007-2015 the FFmpeg developers
     built on Jan 19 2015 12:56:57 with gcc 4.1.2 (GCC) 20080704 (Red Hat 4.1.2-55)
     configuration: --prefix=/usr --bindir=/usr/bin --datadir=/usr/share/ffmpeg --incdir=/usr/include/ffmpeg --libdir=/usr/lib64 --mandir=/usr/share/man --arch=x86_64 --optflags='-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic' --enable-bzlib --disable-crystalhd --enable-libass --enable-libdc1394 --enable-libfaac --enable-nonfree --disable-indev=jack --enable-libfreetype --enable-libgsm --enable-libmp3lame --enable-openal --enable-libopencv --enable-libopenjpeg --enable-libopus --enable-librtmp --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libxvid --enable-x11grab --enable-avfilter --enable-avresample --enable-postproc --enable-pthreads --disable-static --enable-shared --enable-gpl --disable-debug --disable-stripping --enable-libcaca --shlibdir=/usr/lib64 --enable-runtime-cpudetect
     libavutil      54. 15.100 / 54. 15.100
     libavcodec     56. 13.100 / 56. 13.100
     libavformat    56. 15.102 / 56. 15.102
     libavdevice    56.  3.100 / 56.  3.100
     libavfilter     5.  2.103 /  5.  2.103
     libavresample   2.  1.  0 /  2.  1.  0
     libswscale      3.  1.101 /  3.  1.101
     libswresample   1.  1.100 /  1.  1.100
     libpostproc    53.  3.100 / 53.  3.100
    Metadata:
     Server                NGINX RTMP (github.com/arut/nginx-rtmp-module)
     width                 320.00
     height                240.00
     displayWidth          320.00
     displayHeight         240.00
     duration              0.00
     framerate             0.00
     fps                   0.00
     videodatarate         261.00
     videocodecid          7.00
     audiodatarate         62.00
     audiocodecid          10.00
     profile
     level
    [live_flv @ 0x1edb0820] Could not find codec parameters for stream 0 (Video: none, none, 267 kb/s): unknown codec
    Consider increasing the value for the 'analyzeduration' and 'probesize' options
    Input #0, live_flv, from 'rtmp://<server>/input/<stream>':
     Metadata:
       Server          : NGINX RTMP (github.com/arut/nginx-rtmp-module)
       displayWidth    : 320
       displayHeight   : 240
       fps             : 0
       profile         :
       level           :
     Duration: 00:00:00.00, start: 16.768000, bitrate: N/A
       Stream #0:0: Video: none, none, 267 kb/s, 1k tbr, 1k tbn, 1k tbc
       Stream #0:1: Audio: aac (LC), 16000 Hz, mono, fltp, 63 kb/s
    Unsupported codec with id 0 for input stream 0
    </stream></server>

    I am not, by any means, an expert in H264 or video encoding. I know that the encoded frames that come out from MediaCodec contain SPS NAL, PPS NAL, and frame NAL units. I’ve also written the MediaCodec output into a file and was able to play it back (I did have to specify the format and framerate as otherwise it would play too fast).

    My assumption is that things should work (see how little I know :)). Knowing that SPS and PPS are written out, decoder should know enough. Yet, ffprobe fails to recognize codec, fps, and other video information. Do I need to pass packet flag information to FFmpegFrameRecorder.java:record() function ? Or should I use direct buffer ? Any suggestion will be appreciated ! I should figure things out with a hint.

    PS : I know that some codecs use Planar and other SemiPlanar color formats. That distinction will come later if I get past this. Also, I didn’t go the Surface to MediaCodec way because I need to support API 17 and it requires more changes than this route, which I think helps me understand the more basic flow. Agan, I appreciate any suggestions. Please let me know if something needs to be clarified.

    Update #1

    So having done more testing, I see that my encoder outputs the following frames :

    000000016742800DDA0507E806D0A1350000000168CE06E2
    0000000165B840A6F1E7F0EA24000AE73BEB5F51CC7000233A84240...
    0000000141E2031364E387FD4F9BB3D67F51CC7000279B9F9CFE811...
    0000000141E40304423FFFFF0B7867F89FAFFFFFFFFFFCBE8EF25E6...
    0000000141E602899A3512EF8AEAD1379F0650CC3F905131504F839...
    ...

    The very first frame contains SPS and PPS. From what I was able to see, these are transmitted only once. The rest are NAL types 1 and 5. So, my assumption is that, for ffprobe to see stream info not only when the stream starts, I should capture SPS and PPS frames and re-transmit them myself periodically, after a certain number of frames, or perhaps before every I-frame. What do you think ?

    Update #2

    Unable to validate that I’m writing frames successfully. After having tried to read back the written packet, I cannot validate written bytes. As strange, on successful write of IPL image and streaming, I also cannot print out bytes of encoded packet after avcodec_encode_video2. Hit the official dead end.

  • keepalive type and frequency in ffmpeg [on hold]

    19 novembre 2013, par Jack Simth

    My company has a bunch of IP cameras that we distribute - specifically Grandstream - and the manufacturer has changed their firmware. The normal keepalive that ffmpeg uses for the rtsp streams ( either ff_rtsp_send_cmd_async(s, "GET_PARAMETER", rt->control_uri, NULL) ; or ff_rtsp_send_cmd_async(s, "OPTIONS", "*", NULL) ; both in in libavformat/rtspdec.c) is no longer working, for two reasons :

    1) The new Grandstream firmware is now checking for a receiver report to determine whether or not the program reading the stream is live, not just anything.

    2) The new Grandstream firmware requires that the receiver report to keep the connection alive happen at least once every 25 seconds, and on the audio stream it is currently only happening about every 30 seconds or so (video is getting it every 7 seconds or so).

    So after about a minute with ffmpeg connected, the camera stops sending the audio stream, the audio stream on ffmpeg reads end-of-file, and then ffmpeg shuts everything down.

    As I can't change the firmware, I'm trying to dig through the ffmpeg code to make it send the appropriate receiver report for the keep alive... but I am getting nowhere. I've added a little snippet of code into the receiver reports so I know when they're running when I call ffmpeg on debug, but... well, it's not going well.

    Test command :
    ffmpeg -loglevel debug -i rtsp ://admin:admin@192.168.4.3:554/0 -acodec libmp3lame -ar 22050 -vcodec copy -y -f flv /dev/null &> test.txt

    Test output :

    `[root@localhost ffmpeg]# cat test.txt
    ffmpeg version 2.0 Copyright (c) 2000-2013 the FFmpeg developers
     built on Aug 21 2013 14:24:28 with gcc 4.4.7 (GCC) 20120313 (Red Hat 4.4.7-3)
     configuration: --datadir=/usr/share/ffmpeg --bindir=/usr/local/bin --libdir=/usr/local/lib --incdir=/usr/local/include --shlibdir=/usr/lib --mandir=/usr/share/man --disable-avisynth --extra-cflags=&#39;-O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m32 -march=i386 -mtune=generic -fasynchronous-unwind-tables&#39; --enable-avfilter --enable-libx264 --enable-gpl --enable-version3 --enable-postproc --enable-pthreads --enable-shared --enable-swscale --enable-vdpau --enable-x11grab --enable-librtmp --enable-libopencore-amrnb --enable-libopencore-amrwb --disable-static --enable-libgsm --enable-libxvid --enable-libvpx --enable-libvorbis --enable-libvo-aacenc --enable-libmp3lame
     libavutil      52. 38.100 / 52. 38.100
     libavcodec     55. 18.102 / 55. 18.102
     libavformat    55. 12.100 / 55. 12.100
     libavdevice    55.  3.100 / 55.  3.100
     libavfilter     3. 79.101 /  3. 79.101
     libswscale      2.  3.100 /  2.  3.100
     libswresample   0. 17.102 /  0. 17.102
     libpostproc    52.  3.100 / 52.  3.100
    Splitting the commandline.
    Reading option &#39;-loglevel&#39; ... matched as option &#39;loglevel&#39; (set logging level) with argument &#39;debug&#39;.
    Reading option &#39;-i&#39; ... matched as input file with argument &#39;rtsp://admin:admin@192.168.4.3:554/0&#39;.
    Reading option &#39;-acodec&#39; ... matched as option &#39;acodec&#39; (force audio codec (&#39;copy&#39; to copy stream)) with argument &#39;libmp3lame&#39;.
    Reading option &#39;-ar&#39; ... matched as option &#39;ar&#39; (set audio sampling rate (in Hz)) with argument &#39;22050&#39;.
    Reading option &#39;-vcodec&#39; ... matched as option &#39;vcodec&#39; (force video codec (&#39;copy&#39; to copy stream)) with argument &#39;copy&#39;.
    Reading option &#39;-y&#39; ... matched as option &#39;y&#39; (overwrite output files) with argument &#39;1&#39;.
    Reading option &#39;-f&#39; ... matched as option &#39;f&#39; (force format) with argument &#39;flv&#39;.
    Reading option &#39;/dev/null&#39; ... matched as output file.
    Finished splitting the commandline.
    Parsing a group of options: global .
    Applying option loglevel (set logging level) with argument debug.
    Applying option y (overwrite output files) with argument 1.
    Successfully parsed a group of options.
    Parsing a group of options: input file rtsp://admin:admin@192.168.4.3:554/0.
    Successfully parsed a group of options.
    Opening an input file: rtsp://admin:admin@192.168.4.3:554/0.
    [rtsp @ 0x9d9ccc0] SDP:
    v=0
    o=StreamingServer 3331435948 1116907222000 IN IP4 192.168.4.3
    s=h264.mp4
    c=IN IP4 0.0.0.0
    t=0 0
    a=control:*
    m=video 0 RTP/AVP 96
    a=control:trackID=0
    a=rtpmap:96 H264/90000
    a=fmtp:96 packetization-mode=1; sprop-parameter-sets=Z0LgHtoCgPRA,aM4wpIA=
    m=audio 0 RTP/AVP 0
    a=control:trackID=1
    a=rtpmap:0 PCMU/8000
    a=ptime:20
    m=application 0 RTP/AVP 107
    a=control:trackID=2
    a=rtpmap:107 vnd.onvif.metadata/90000


    [rtsp @ 0x9d9ccc0] video codec set to: h264
    [NULL @ 0x9d9f400] RTP Packetization Mode: 1
    [NULL @ 0x9d9f400] Extradata set to 0x9d9f900 (size: 22)!
    [rtsp @ 0x9d9ccc0] audio codec set to: pcm_mulaw
    [rtsp @ 0x9d9ccc0] audio samplerate set to: 8000
    [rtsp @ 0x9d9ccc0] audio channels set to: 1
    [rtsp @ 0x9d9ccc0] hello state=0
    [h264 @ 0x9d9f400] Current profile doesn&#39;t provide more RBSP data in PPS, skipping
       Last message repeated 1 times
    [rtsp @ 0x9d9ccc0] All info found
    Guessed Channel Layout for  Input Stream #0.1 : mono
    Input #0, rtsp, from &#39;rtsp://admin:admin@192.168.4.3:554/0&#39;:
     Metadata:
       title           : h264.mp4
     Duration: N/A, start: 0.000000, bitrate: 64 kb/s
       Stream #0:0, 28, 1/90000: Video: h264 (Constrained Baseline), yuv420p, 640x480, 1/180000, 10 tbr, 90k tbn, 180k tbc
       Stream #0:1, 156, 1/8000: Audio: pcm_mulaw, 8000 Hz, mono, s16, 64 kb/s
    Successfully opened the file.
    Parsing a group of options: output file /dev/null.
    Applying option acodec (force audio codec (&#39;copy&#39; to copy stream)) with argument libmp3lame.
    Applying option ar (set audio sampling rate (in Hz)) with argument 22050.
    Applying option vcodec (force video codec (&#39;copy&#39; to copy stream)) with argument copy.
    Applying option f (force format) with argument flv.
    Successfully parsed a group of options.
    Opening an output file: /dev/null.
    Successfully opened the file.
    detected 2 logical cores
    [graph 0 input from stream 0:1 @ 0x9f15380] Setting &#39;time_base&#39; to value &#39;1/8000&#39;
    [graph 0 input from stream 0:1 @ 0x9f15380] Setting &#39;sample_rate&#39; to value &#39;8000&#39;
    [graph 0 input from stream 0:1 @ 0x9f15380] Setting &#39;sample_fmt&#39; to value &#39;s16&#39;
    [graph 0 input from stream 0:1 @ 0x9f15380] Setting &#39;channel_layout&#39; to value &#39;0x4&#39;
    [graph 0 input from stream 0:1 @ 0x9f15380] tb:1/8000 samplefmt:s16 samplerate:8000 chlayout:0x4
    [audio format for output stream 0:1 @ 0x9efa7c0] Setting &#39;sample_fmts&#39; to value &#39;s32p|fltp|s16p&#39;
    [audio format for output stream 0:1 @ 0x9efa7c0] Setting &#39;sample_rates&#39; to value &#39;22050&#39;
    [audio format for output stream 0:1 @ 0x9efa7c0] Setting &#39;channel_layouts&#39; to value &#39;0x4|0x3&#39;
    [audio format for output stream 0:1 @ 0x9efa7c0] auto-inserting filter &#39;auto-inserted resampler 0&#39; between the filter &#39;Parsed_anull_0&#39; and the filter &#39;audio format for output stream 0:1&#39;
    [AVFilterGraph @ 0x9f15980] query_formats: 4 queried, 9 merged, 3 already done, 0 delayed
    [auto-inserted resampler 0 @ 0x9dfada0] ch:1 chl:mono fmt:s16 r:8000Hz -> ch:1 chl:mono fmt:s16p r:22050Hz
    Output #0, flv, to &#39;/dev/null&#39;:
     Metadata:
       title           : h264.mp4
       encoder         : Lavf55.12.100
       Stream #0:0, 0, 1/1000: Video: h264 ([7][0][0][0] / 0x0007), yuv420p, 640x480, 1/90000, q=2-31, 1k tbn, 90k tbc
       Stream #0:1, 0, 1/1000: Audio: mp3 (libmp3lame) ([2][0][0][0] / 0x0002), 22050 Hz, mono, s16p
    Stream mapping:
     Stream #0:0 -> #0:0 (copy)
     Stream #0:1 -> #0:1 (pcm_mulaw -> libmp3lame)
    Press [q] to stop, [?] for help
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 135.4kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 134.4kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 135.0kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 135.5kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 136.9kbits/s
    Queue input is backward in time=     233kB time=00:00:13.69 bitrate= 139.4kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 136.3kbits/s
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 13926; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 13952; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 13979; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 14005; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 14031; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 14057; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 14083; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 14109; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 14135; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 14161; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 14188; changing to 14239. This may result in incorrect timestamps in the output file.
    [flv @ 0x9de1200] Non-monotonous DTS in output stream 0:1; previous: 14239, current: 14214; changing to 14239. This may result in incorrect timestamps in the output file.
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 141.5kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 142.0kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 142.5kbits/s
    Receiver Report delay: 469789, gettime: -1527669086, last_recep: 322446, timebase: -1534837492
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 141.5kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 141.7kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 141.1kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 140.6kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 140.7kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 139.9kbits/s
    Receiver Report delay: 132993, gettime: -1516538925, last_recep: 322446, timebase: -1518568234
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 139.6kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 139.6kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 139.7kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 139.4kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 140.0kbits/s
    Receiver Report delay: 897727, gettime: -1504870331, last_recep: 322446, timebase: -1518568552
    [NULL @ 0x9d9f400] Current profile doesn&#39;t provide more RBSP data in PPS, skipping
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 139.4kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 139.1kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 139.0kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 139.0kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 138.6kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 138.5kbits/s
    Current profile doesn&#39;t provide more RBSP data in PPS, skippingrate= 138.2kbits/s
    EOF on sink link output stream 0:1:default.time=00:00:58.40 bitrate= 139.6kbits/s
    No more output streams to write to, finishing.
    [libmp3lame @ 0x9dfa580] Trying to remove 344 more samples than there are in the queue
    frame=  589 fps= 11 q=-1.0 Lsize=    1003kB time=00:00:58.85 bitrate= 139.5kbits/s
    video:724kB audio:231kB subtitle:0 global headers:0kB muxing overhead 4.955356%
    2959 frames successfully decoded, 0 decoding errors
    [AVIOContext @ 0x9e021c0] Statistics: 3 seeks, 2860 writeouts
    [root@localhost ffmpeg]#
  • Top 4 CRO Tools to Boost Your Conversion Rates in 2024

    31 octobre 2023, par Erin

    Are you tired of watching potential customers leave your website without converting ? You’ve spent countless hours creating an engaging website, but those high bounce rates keep haunting you.

    The good news ? The solution lies in the transformative power of Conversion Rate Optimisation (CRO) tools. In this guide, we’ll dive deep into the world of CRO tools. We will equip you with strategies to turn those bounces into conversions.

    Why are conversion rate optimisation tools so crucial ?

    CRO tools can be assets in digital marketing, playing a pivotal role in enhancing online businesses’ performance. CRO tools empower businesses to improve website conversion rates by analysing user behaviour. You can then leverage this user data to optimise web elements.

    Improving website conversion rates is paramount because it increases revenue and customer satisfaction. A study by VentureBeat revealed an average return on investment (ROI) of 223% thanks to CRO tools.

    173 marketers out of the surveyed group reported returns exceeding 1,000%. Both of these data points highlight the impact CRO tools can have.

    Toolbox with a "CRO" label full of various tools

    Coupled with CRO tools, certain testing tools and web analytics tools play a crucial role. They offer insight into user behaviour patterns, enabling businesses to choose effective strategies. By understanding what resonates with users, these tools help inform data-driven decisions. This allows businesses to refine online strategies and enhance the customer experience.

    CRO tools enhance user experiences and ensure business sustainability. Integrating these tools is crucial for staying ahead. CRO and web analytics work together to optimise digital presence. 

    Real-world examples of CRO tools in action

    In this section, we’ll explore real case studies showcasing CRO tools in action. See how businesses enhance conversion rates, user experiences, and online performance. These studies reveal the practical impact of data-driven decisions and user-focused strategies.

    A computer with A and B on both sides and a magnifying glass hovering over the keyboard

    Case study : How Matomo’s Form Analytics helped Concrete CMS 3x leads

    Concrete CMS, is a content management system provider that helps users build and manage websites. They used Matomo’s Form Analytics to uncover that users were getting stuck at the address input stage of the onboarding process. Using these insights to make adjustments to their onboarding form, Concrete CMS was able to achieve 3 times the amount of leads in just a few days.

    Read the full Concrete CMS case study.

    Best analytics tools for enhancing conversion rate optimisation in 2023

    Jump to the comparison table to see an overview of each tool.

    1. Matomo

    Matomo main dashboard

    Matomo stands out as an all-encompassing tool that seamlessly combines traditional web analytics features (like pageviews and bounce rates) with advanced behavioural analytics capabilities, providing a full spectrum of insights for effective CRO.

    Key features

    • Heatmaps and Session Recordings :
      These features empower businesses to see their websites through the eyes of their visitors. By visually mapping user engagement and observing individual sessions, businesses can make informed decisions, enhance user experience and ultimately increase conversions. These tools are invaluable assets for businesses aiming to create user-friendly websites.
    • Form Analytics :
      Matomo’s Form Analytics offers comprehensive tracking of user interactions within forms. This includes covering input fields, dropdowns, buttons and submissions. Businesses can create custom conversion funnels and pinpoint form abandonment reasons. 
    • Users Flow :
      Matomo’s Users Flow feature tracks visitor paths, drop-offs and successful routes, helping businesses optimise their websites. This insight informs decisions, enhances user experience, and boosts conversion rates.
    • Surveys plugin :
      The Matomo Surveys plugin allows businesses to gather direct feedback from users. This feature enhances understanding by capturing user opinions, adding another layer to the analytical depth Matomo offers.
    • A/B testing :
      The platform allows you to conduct A/B tests to compare different versions of web pages. This helps determine which performs better in conversions. By conducting experiments and analysing the results within Matomo, businesses can iteratively refine their content and design elements.
    • Funnels :
      Matomo’s Funnels feature empower businesses to visualise, analyse and optimise their conversion paths. By identifying drop-off points, tailoring user experiences and conducting A/B tests within the funnel, businesses can make data-driven decisions that significantly boost conversions and enhance the overall user journey on their websites.

    Pros

    • Starting at $19 per month, Matomo is an affordable CRO solution.
    • Matomo guarantees accurate data, eliminating the need to fill gaps with artificial intelligence (AI) or machine learning. 
    • Matomo’s open-source framework ensures enhanced security, privacy, customisation, community support and long-term reliability. 

    Cons

    • The On-Premise (self-hosted) version is free, with additional charges for advanced features.
    • Managing Matomo On-Premise requires servers and technical know-how.

    Try Matomo for Free

    Get the web insights you need, without compromising data accuracy.

    No credit card required

    2. Google Analytics

    Traffic tracking chart and life cycle

    Google Analytics provides businesses and website owners valuable insights into their online audience. It tracks website traffic, user interactions and analyses conversion data to enhance the user experience.

    While Google Analytics may not provide the extensive CRO-specific features found in other tools on this list, it can still serve as a valuable resource for basic analysis and optimisation of conversion rates.

    Key features

    • Comprehensive Data Tracking :
      Google Analytics meticulously tracks website traffic, user behaviour and conversion rates. These insights form the foundation for CRO efforts. Businesses can identify patterns, user bottlenecks and high-performing areas.
    • Real-Time Reporting :
      Access to real-time data is invaluable for CRO efforts. Monitor current website activity, user interactions, and campaign performance as they unfold. This immediate feedback empowers businesses to make instant adjustments, optimising web elements and content for maximum conversions.
    • User flow analysis
      Visualise and understand how visitors navigate through your website. It provides insights into the paths users take as they move from one page to another, helping you identify the most common routes and potential drop-off points in the user journey.
    • Event-based tracking :
      GA4’s event-based reporting offers greater flexibility and accuracy in data collection. By tracking various interactions, including video views and checkout processes, businesses can gather more precise insights into user behaviour. 
    • Funnels :
      GA4 offers multistep funnels, path analysis, custom metrics that integrate with audience segments. These user behaviour insights help businesses to tailor their websites, marketing campaigns and user experiences.

    Pros

    • Flexible audience management across products, regions or brands allow businesses to analyse data from multiple source properties. 
    • Google Analytics integrates with other Google services and third-party platforms. This enables a comprehensive view of online activities.
    • Free to use, although enterprises may need to switch to the paid version to accommodate higher data volumes.

    Cons

    • Google Analytics raises privacy concerns, primarily due to its tracking capabilities and the extensive data it collects.
    • Limitations imposed by thresholding can significantly hinder efforts to enhance user experience and boost conversions effectively.
    • Property and sampling limits exist. This creates problems when you’re dealing with extensive datasets or high-traffic websites. 
    • The interface is difficult to navigate and configure, resulting in a steep learning curve.

    3. Contentsquare

    Pie chart with landing page journey data

    Contentsquare is a web analytics and CRO platform. It stands out for its in-depth behavioural analytics. Contentsquare offers detailed data on how users interact with websites and mobile applications.

    Key features

    • Heatmaps and Session Replays :
      Users can visualise website interactions through heatmaps, highlighting popular areas and drop-offs. Session replay features enable the playback of user sessions. These provide in-depth insights into individual user experiences.
    • Conversion Funnel Analysis :
      Contentsquare tracks users through conversion funnels, identifying where users drop off during conversion. This helps in optimising the user journey and increasing conversion rates.
    • Segmentation and Personalisation :
      Businesses can segment their audience based on various criteria. Segments help create personalised experiences, tailoring content and offers to specific user groups.
    • Integration Capabilities :
      Contentsquare integrates with various third-party tools and platforms, enhancing its functionality and allowing businesses to leverage their existing tech stack.

    Pros

    • Comprehensive support and resources.
    • User-friendly interface.
    • Personalisation capabilities.

    Cons

    • High price point.
    • Steep learning curve.

    4. Hotjar

    Pricing page heatmap data

    Hotjar is a robust tool designed to unravel user behaviour intricacies. With its array of features including visual heatmaps, session recordings and surveys, it goes beyond just identifying popular areas and drop-offs.

    Hotjar provides direct feedback and offers an intuitive interface, enabling seamless experience optimisation.

    Key features

    • Heatmaps :
      Hotjar provides visual heatmaps that display user interactions on your website. Heatmaps show where users click, scroll, and how far they read. This feature helps identify popular areas and points of abandonment.
    • Session Recordings :
      Hotjar allows you to record user sessions and watch real interactions on your site. This insight is invaluable for understanding user behaviour and identifying usability issues.
    • Surveys and Feedback :
      Hotjar offers on-site surveys and feedback forms that can get triggered based on user behaviour. These tools help collect qualitative data from real users, providing valuable insights.
    • Recruitment Tool :
      Hotjar’s recruitment tool lets you recruit participants from your website for user testing. This feature streamlines the process of finding participants for usability studies.
    • Funnel and Form Analysis :
      Hotjar enables the tracking of user journeys through funnels. It provides insights into where users drop off during the conversion process. It also offers form analysis to optimise form completion rates.
    • User Polls :
      You can create customisable polls to engage with visitors. Gather specific feedback on your website, products, or services.

    Pros

    • Starting at $32 per month, Hotjar is a cost-effective solution for most businesses. 
    • Hotjar provides a user-friendly interface that is easy for the majority of users to pick up quickly.

    Cons

    • Does not provide traditional web analytics and requires combining with another tool, potentially creating a less streamlined and cohesive user experience, which can complicate conversion rate optimization efforts.
    • Hotjar’s limited integrations can hinder its ability to seamlessly work with other essential tools and platforms, potentially further complicating CRO.

    Comparison Table

    Please note : We aim to keep this table accurate and up to date. However, if you see any inaccuracies or outdated information, please email us at marketing@matomo.org

    To make comparing these tools even easier, we’ve put together a table for you to compare features and price points :

    A comparison chart comparing the CRO/web analytics features and price points of Matomo, Google Analytics, ContentSquare, and HotJar

    Conclusion

    CRO tools and web analytics are essential for online success. Businesses thrive by investing wisely, understanding user behaviour and using targeted strategies. The key : generate traffic and convert it into leads and customers. The right tools and strategies lead to remarkable conversions and online success. Each click, each interaction, becomes an opportunity to create an engaging user journey. This careful orchestration of data and insight separates thriving businesses from the rest.

    Are you ready to embark on a journey toward improved conversions and enhanced user experiences ? Matomo offers analytics solutions meticulously designed to complement your CRO strategy. Take the next step in your CRO journey. Start your 21-day free trial today—no credit card required.