Recherche avancée

Médias (0)

Mot : - Tags -/clipboard

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

Autres articles (35)

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

  • Les formats acceptés

    28 janvier 2010, par

    Les commandes suivantes permettent d’avoir des informations sur les formats et codecs gérés par l’installation local de ffmpeg :
    ffmpeg -codecs ffmpeg -formats
    Les format videos acceptés en entrée
    Cette liste est non exhaustive, elle met en exergue les principaux formats utilisés : h264 : H.264 / AVC / MPEG-4 AVC / MPEG-4 part 10 m4v : raw MPEG-4 video format flv : Flash Video (FLV) / Sorenson Spark / Sorenson H.263 Theora wmv :
    Les formats vidéos de sortie possibles
    Dans un premier temps on (...)

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

Sur d’autres sites (8971)

  • Undefined variable PHP uploader video

    23 avril 2022, par i0x4r

    I have a problem !
I found a code to upload a high quality video on my server

    


    using : ffmpeg, dropzone, php

    


    But it has a big problem !

    


    I want after the video upload to the server is completed, a phrase appears with the file name and path
But it does not do this work, and in the report it appears that Undefined variable
this :

    


    [23-Apr-2022 12:46:46 Asia/Riyadh] PHP Notice:  Undefined variable: location in /home/userme134/public_html/SUP/test8/upload.php on line 21
[23-Apr-2022 12:48:17 Asia/Riyadh] PHP Notice:  Undefined variable: location in /home/userme134/public_html/SUP/test8/upload.php on line 21
[23-Apr-2022 12:51:39 Asia/Riyadh] PHP Notice:  Undefined variable: location in /home/userme134/public_html/SUP/test8/upload.php on line 21
[23-Apr-2022 12:52:12 Asia/Riyadh] PHP Notice:  Undefined variable: location in /home/userme134/public_html/SUP/test8/upload.php on line 21


    


    index.php

    


    &#xA;&#xA; &#xA;  &#xA;  &#xA;  <code class="echappe-js">&lt;script src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/2.2.0/jquery.min.js&quot;&gt;&lt;/script&gt;&#xA;        &lt;script src=&quot;https://maxcdn.bootstrapcdn.com/bootstrap/3.3.6/js/bootstrap.min.js&quot;&gt;&lt;/script&gt;        &#xA;  &#xA;  &lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/dropzone/5.5.1/dropzone.js&quot;&gt;&lt;/script&gt;&#xA;  &#xA; &#xA; &#xA;  
    &#xA;
    &#xA;

    Video Uploader

    &#xA;
    &#xA; &#xA;

    &#xA;&#xA;

    &#xA; &#xA; &#xA; &#xA;
    &#xA;
    &#xA;

    &#xA;
    &#xA;
    &#xA;

    &#xA; &#xA;&#xA;&#xA;&lt;script&gt;&amp;#xA;&amp;#xA;$(document).ready(function(){&amp;#xA; &amp;#xA; Dropzone.options.dropzoneFrom = {&amp;#xA;  autoProcessQueue: true,&amp;#xA;  timeout: 300000,&amp;#xA;  acceptedFiles:&quot;video/*&quot;,&amp;#xA;  init: function(){&amp;#xA;&amp;#xA;   this.on(&quot;complete&quot;, function(){&amp;#xA;    if(this.getQueuedFiles().length == 0 &amp;amp;&amp;amp; this.getUploadingFiles().length == 0)&amp;#xA;    {&amp;#xA;     var _this = this;&amp;#xA;     _this.removeAllFiles();&amp;#xA;    }&amp;#xA;    viewResult();&amp;#xA;   });&amp;#xA;  },&amp;#xA; };&amp;#xA;&amp;#xA; function viewResult()&amp;#xA; {&amp;#xA;  $.ajax({&amp;#xA;   url:&quot;upload.php&quot;,&amp;#xA;   success:function(data){&amp;#xA;    $(&quot;#preview&quot;).html(data);&amp;#xA;   }&amp;#xA;  });&amp;#xA; }&amp;#xA;&amp;#xA; $(document).on(&amp;#x27;click&amp;#x27;, &amp;#x27;.remove_image&amp;#x27;, function(){&amp;#xA;  var name = $(this).attr(&amp;#x27;id&amp;#x27;);&amp;#xA;  $.ajax({&amp;#xA;   url:&quot;upload.php&quot;,&amp;#xA;   method:&quot;POST&quot;,&amp;#xA;   data:{name:name},&amp;#xA;   success:function(data)&amp;#xA;   {&amp;#xA;    list_image();&amp;#xA;   }&amp;#xA;  })&amp;#xA; });&amp;#xA; &amp;#xA;});&amp;#xA;&lt;/script&gt;&#xA;

    &#xA;

    upload.php

    &#xA;

    &lt;?php&#xA;&#xA;//upload.php&#xA;&#xA;$folder_name = &#x27;upload/&#x27;;&#xA;&#xA;if(!empty($_FILES))&#xA;{&#xA;&#xA; $temp_file = $_FILES[&#x27;file&#x27;][&#x27;tmp_name&#x27;];&#xA; $location = $folder_name . $_FILES[&#x27;file&#x27;][&#x27;name&#x27;];&#xA; move_uploaded_file($temp_file, $location);&#xA; $upload = $_FILES[&#x27;file&#x27;][&#x27;name&#x27;];&#xA; $uploadStr = str_replace(" ", "\ ",$upload);&#xA; $locationStr = str_replace(" ","\ ",$location);&#xA; $cmd  = "ffmpeg -y -i {$locationStr} -ss 00:00:15 -vframes 1 thumb/{$uploadStr}.png 2>&amp;1";&#xA; echo shell_exec($cmd);&#xA;}&#xA;&#xA;echo "Successfly Uploaded File is : ";&#xA;echo $location;&#xA;&#xA;?>&#xA;

    &#xA;

    enter image description here

    &#xA;

    I hope you can help me because I am tired of many useless attempts.

    &#xA;

  • Apostrophe issue with FFmpeg

    1er mars 2024, par Rohan Molinillo

    I'm working on a company's project which is vue.js.&#xA;There are also code parts in php.&#xA;It uses FFmpeg to create a video from multiple videos.&#xA;On each video, there is a text type subtitle.&#xA;Each text is retrieved from a .txt file&#xA;But I have a problem with apostrophes.

    &#xA;

    If in the subtitle is stored like this ( I'm here ) in the txt file, on the video there will be written ( Im ).&#xA;The apostrophe is removed and the rest of the text too ( here ) will not be displayed.

    &#xA;

    I'm new to php and ffmpeg, I've been on this problem for almost 3 weeks.

    &#xA;

    I share the php code with you.

    &#xA;

    &lt;?php&#xA;&#xA;declare(strict_types=1);&#xA;&#xA;array_shift($argv); // remove script name in $argv[0]&#xA;&#xA;$parameters = array_reduce($argv, function ($carry, $arg) {&#xA;    $tokens = explode(&#x27;=&#x27;, $arg);&#xA;    $carry[$tokens[0]] = $tokens[1];&#xA;    return $carry;&#xA;}, []);&#xA;&#xA;$projectPath = $parameters[&#x27;projectPath&#x27;];&#xA;$musicPath = $parameters[&#x27;musicPath&#x27;];&#xA;&#xA;$fontPath = getcwd() . "/public/fonts/cobol/Cobol-Bold.ttf";&#xA;$logoPath = getcwd() . "/public/images/saintex.jpg";&#xA;$carnetLogoPath = getcwd() . "/public/images/CarnetTitre.jpg";&#xA;&#xA;// Adding descriptions for each clip and fade in and fade out filters&#xA;$clipsToDescribe =  glob("$projectPath/*.webm");&#xA;$clipFrameRate = (int) shell_exec("cd $projectPath &amp;&amp; ffprobe -v error -select_streams v -of default=noprint_wrappers=1:nokey=1 -show_entries stream=r_frame_rate $clipsToDescribe[0]");&#xA;$clipFrameRate = $clipFrameRate > 60 ? 30 : $clipFrameRate;&#xA;&#xA;foreach ($clipsToDescribe as $key => $clipToDescribe) {&#xA;    $clipIndex = $key &#x2B; 1;&#xA;    $clipFrames = (int) shell_exec("cd $projectPath &amp;&amp; ffprobe -v error -select_streams v:0 -count_packets -show_entries stream=nb_read_packets -of csv=p=0 $clipToDescribe");&#xA;    $clipDuration = (float) ($clipFrames / $clipFrameRate) - 0.5;&#xA;    file_put_contents("$projectPath/clip{$clipIndex}_desc.txt", addslashes($parameters["clip{$clipIndex}_desc"]));&#xA;    shell_exec("cd $projectPath &amp;&amp; ffmpeg -i $clipToDescribe -vf &#x27;drawtext=fontfile=$fontPath: textfile=clip{$clipIndex}_desc.txt: fontcolor=white: fontsize=46: box=1: boxcolor=black@0.5: boxborderw=5: x=(w-text_w)/2: y=(h-text_h-50): fix_bounds=true, fade=t=in:st=0:d=0.3,fade=t=out:st=$clipDuration:d=0.3&#x27; -b:v 3000K -b:a 192K clip{$clipIndex}.webm");&#xA;}&#xA;array_map(&#x27;unlink&#x27;, glob("$projectPath/*desc.txt"));&#xA;&#xA;shell_exec("cd $projectPath &amp;&amp; ffmpeg -t 2 -f lavfi -i color=c=black:s=1280x720 -r 30 blank.webm");&#xA;shell_exec("cd $projectPath &amp;&amp; ffmpeg -i blank.webm -i $carnetLogoPath -filter_complex &#x27;[0:v][1:v] overlay=(main_w/2)-(overlay_w/2):(main_h/2)-(overlay_h/2)&#x27; -pix_fmt yuv420p -c:a copy logo.webm");&#xA;&#xA;&#xA;&#xA;$workshop = $parameters["workshop_type"];&#xA;$title = $parameters["title"];&#xA;shell_exec("cd $projectPath &amp;&amp; ffmpeg -f lavfi -i color=size=1280x720:duration=3:rate=30:color=black -vf &#x27;drawtext=text=$workshop:fontfile=$fontPath:fontcolor=white:fontsize=46:x=(w-text_w)/2:y=(h-text_h)/2, drawtext=text=$title:fontfile=$fontPath:fontcolor=white:fontsize=46:x=(w-text_w)/2:y=((h-text_h)/2)&#x2B;lh&#x2B;5&#x27; opening.webm");&#xA;unlink("$projectPath/blank.webm");&#xA;&#xA;$videosFile = "file &#x27;logo.webm&#x27;\n";&#xA;$videosFile .= "file &#x27;opening.webm&#x27;\n";{&#xA;    file_put_contents("$projectPath/project_desc.txt", $parameters["project_desc"]);&#xA;    shell_exec("cd $projectPath &amp;&amp; ffmpeg -f lavfi -i color=size=1280x720:duration=3:rate=30:color=black -vf &#x27;drawtext=fontfile=$fontPath:fontsize=46:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:textfile=project_desc.txt&#x27; project_desc.webm");&#xA;    unlink("$projectPath/project_desc.txt");&#xA;    $videosFile .= "file &#x27;project_desc.webm&#x27;\n";&#xA;} &#xA;if(array_key_exists("participants", $parameters)) {&#xA;    file_put_contents("$projectPath/participants.txt", "Participants :\n" . $parameters["participants"]);&#xA;    shell_exec("cd $projectPath &amp;&amp; ffmpeg -f lavfi -i color=size=1280x720:duration=2:rate=30:color=black -vf &#x27;drawtext=fontfile=$fontPath:fontsize=46:fontcolor=white:x=(w-text_w)/2:y=(h-text_h)/2:textfile=participants.txt&#x27; participants.webm");&#xA;    unlink("$projectPath/participants.txt");&#xA;}&#xA;&#xA;$videos =  glob("$projectPath/clip*.webm");&#xA;foreach($videos as $video) {&#xA;    if($video != "originalVideos") {&#xA;        $videosFile .= "file ". "&#x27;{$video}&#x27;\n";&#xA;    }&#xA;} &#xA;if(array_key_exists("participants", $parameters)) {&#xA;    $videosFile .= "file &#x27;$projectPath/participants.webm&#x27;";&#xA;}&#xA;array_map(&#x27;unlink&#x27;, glob("$projectPath/*webm.txt"));&#xA;file_put_contents("$projectPath/videosFile.txt", $videosFile);&#xA;if($musicPath == "/_musics/") {&#xA;    echo(shell_exec("cd $projectPath &amp;&amp; ffmpeg -f concat -safe 0 -i videosFile.txt -b:v 10000K -crf 20 -b:a 192K output.webm"));&#xA;} else {&#xA;    echo(shell_exec("cd $projectPath &amp;&amp; ffmpeg -f concat -safe 0 -i videosFile.txt -b:v 10000K -crf 20 -b:a 192K assembled.webm &amp;&amp; ffmpeg -i assembled.webm -i ../..$musicPath -filter_complex &#x27; [1:0] apad &#x27; -shortest -y -b:v 3000K -b:a 192K output.webm"));&#xA;}&#xA;

    &#xA;

    I tried many things but each time there were errors.&#xA;I think I didn't implement the code properly.

    &#xA;

    I share you the error

    &#xA;

            [09:21:02] RECEIVED EVENT: videoRequest&#xA;{ Error: Command failed: php ./public/src/generate.php projectPath=&#x27;/home/rohan/Documents/dodoc2/_projects/its-a-test&#x27; musicPath=&#x27;/_musics/classic.mp3&#x27; clip1_name=&#x27;&#x27; clip2_name=&#x27;&#x27; clip3_name=&#x27;&#x27; clip4_name=&#x27;&#x27; clip5_name=&#x27;&#x27; clip1_desc=&#x27;It&#x27;s a first test&#x27; clip2_desc=&#x27;It&#x27;s a second test&#x27; clip3_desc=&#x27;It&#x27;s a third test&#x27; clip4_desc=&#x27;It&#x27;s a fourth&#x27; clip5_desc=&#x27;It&#x27;s a last test&#x27; project_desc=&#x27;&#x27; workshop_type=&#x27;Atelier Robotique&#x27; title=&#x27;It&#x27;s a test&#x27; participants=&#x27;Molinillo Rohan&#xA;&#x27;&#xA;PHP Warning:  Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 9&#xA;PHP Warning:  Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 9&#xA;PHP Warning:  Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 9&#xA;PHP Warning:  Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 9&#xA;PHP Warning:  Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 9&#xA;PHP Warning:  Undefined array key 1 in /home/rohan/carnet-numerique/public/src/generate.php on line 9&#xA;ffmpeg version 5.1.1-1ubuntu2.1 Copyright (c) 2000-2022 the FFmpeg developers&#xA;  built with gcc 12 (Ubuntu 12.2.0-3ubuntu1)&#xA;  configuration: --prefix=/usr --extra-version=1ubuntu2.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libdav1d --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libglslang --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librabbitmq --enable-librist --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libsrt --enable-libssh --enable-libsvtav1 --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzimg --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opencl --enable-opengl --enable-sdl2 --disable-sndio --enable-pocketsphinx --enable-librsvg --enable-libmfx --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-libplacebo --enable-shared&#xA;  libavutil      57. 28.100 / 57. 28.100&#xA;  libavcodec     59. 37.100 / 59. 37.100&#xA;  libavformat    59. 27.100 / 59. 27.100&#xA;  libavdevice    59.  7.100 / 59.  7.100&#xA;  libavfilter     8. 44.100 /  8. 44.100&#xA;  libswscale      6.  7.100 /  6.  7.100&#xA;  libswresample   4.  7.100 /  4.  7.100&#xA;  libpostproc    56.  6.100 / 56.  6.100&#xA;Input #0, matroska,webm, from &#x27;/home/rohan/Documents/dodoc2/_projects/its-a-test/video-20230404-091933-682.webm&#x27;:&#xA;  Metadata:&#xA;    encoder         : QTmuxingAppLibWebM-0.0.1&#xA;  Duration: N/A, start: -0.001000, bitrate: N/A&#xA;  Stream #0:0(eng): Video: vp8, yuv420p(progressive), 1280x720, SAR 1:1 DAR 16:9, 1k tbr, 1k tbn (default)&#xA;  Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, fltp (default)&#xA;Stream mapping:&#xA;  Stream #0:0 -> #0:0 (vp8 (native) -> vp9 (libvpx-vp9))&#xA;  Stream #0:1 -> #0:1 (opus (native) -> opus (libopus))&#xA;Press [q] to stop, [?] for help&#xA;[libvpx-vp9 @ 0x55952c183000] v1.12.0&#xA;Output #0, webm, to &#x27;clip1.webm&#x27;:&#xA;  Metadata:&#xA;    encoder         : Lavf59.27.100&#xA;  Stream #0:0(eng): Video: vp9, yuv420p(tv, bt470bg/unknown/unknown, progressive), 1280x720 [SAR 1:1 DAR 16:9], q=2-31, 3000 kb/s, 1k fps, 1k tbn (default)&#xA;    Metadata:&#xA;      encoder         : Lavc59.37.100 libvpx-vp9&#xA;    Side data:&#xA;      cpb: bitrate max/min/avg: 0/0/0 buffer size: 0 vbv_delay: N/A&#xA;  Stream #0:1(eng): Audio: opus, 48000 Hz, stereo, flt, 192 kb/s (default)&#xA;    Metadata:&#xA;      encoder         : Lavc59.37.100 libopus&#xA;frame=  229 fps= 11 q=12.0 Lsize=    2786kB time=00:00:07.52 bitrate=3034.7kbits/s speed=0.377x    &#xA;video:2601kB audio:181kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.175036%&#xA;PHP Warning:  Undefined array key "clip2_desc" in /home/rohan/carnet-numerique/public/src/generate.php on line 29&#xA;PHP Fatal error:  Uncaught TypeError: addslashes(): Argument #1 ($string) must be of type string, null given in /home/rohan/carnet-numerique/public/src/generate.php:29&#xA;Stack trace:&#xA;#0 /home/rohan/carnet-numerique/public/src/generate.php(29): addslashes()&#xA;#1 {main}&#xA;  thrown in /home/rohan/carnet-numerique/public/src/generate.php on line 29&#xA;&#xA;    at ChildProcess.exithandler (child_process.js:275:12)&#xA;    at emitTwo (events.js:126:13)&#xA;    at ChildProcess.emit (events.js:214:7)&#xA;    at maybeClose (internal/child_process.js:925:16)&#xA;    at Socket.stream.socket.on (internal/child_process.js:346:11)&#xA;    at emitOne (events.js:116:13)&#xA;    at Socket.emit (events.js:211:7)&#xA;    at Pipe._handle.close [as _onclose] (net.js:554:12)&#xA;  killed: false,&#xA;  code: 255,&#xA;  signal: null,&#xA;  cmd: &#x27;php ./public/src/generate.php projectPath=\&#x27;/home/rohan/Documents/dodoc2/_projects/its-a-test\&#x27; musicPath=\&#x27;/_musics/classic.mp3\&#x27; clip1_name=\&#x27;\&#x27; clip2_name=\&#x27;\&#x27; clip3_name=\&#x27;\&#x27; clip4_name=\&#x27;\&#x27; clip5_name=\&#x27;\&#x27; clip1_desc=\&#x27;It\&#x27;s a first test\&#x27; clip2_desc=\&#x27;It\&#x27;s a second test\&#x27; clip3_desc=\&#x27;It\&#x27;s a third test\&#x27; clip4_desc=\&#x27;It\&#x27;s a fourth\&#x27; clip5_desc=\&#x27;It\&#x27;s a last test\&#x27; project_desc=\&#x27;\&#x27; workshop_type=\&#x27;Atelier Robotique\&#x27; title=\&#x27;It\&#x27;s a test\&#x27; participants=\&#x27;Molinillo Rohan\n\&#x27;&#x27; }&#xA;

    &#xA;

  • Google Optimize vs Matomo A/B Testing : Everything You Need to Know

    17 mars 2023, par Erin — Analytics Tips

    Google Optimize is a popular A/B testing tool marketers use to validate the performance of different marketing assets, website design elements and promotional offers. 

    But by September 2023, Google will sunset both free and paid versions of the Optimize product. 

    If you’re searching for an equally robust, but GDPR compliant, privacy-friendly alternative to Google Optimize, have a look at Matomo A/B Testing

    Integrated with our analytics platform and conversion rate optimisation (CRO) tools, Matomo allows you to run A/B and A/B/n tests without any usage caps or compromises in user privacy.

    Disclaimer : Please note that the information provided in this blog post is for general informational purposes only and is not intended to provide legal advice. Every situation is unique and requires a specific legal analysis. If you have any questions regarding the legal implications of any matter, please consult with your legal team or seek advice from a qualified legal professional.

    Google Optimize vs Matomo : Key Capabilities Compared 

    This guide shows how Matomo A/B testing stacks against Google Optimize in terms of features, reporting, integrations and pricing.

    Supported Platforms 

    Google Optimize supports experiments for dynamic websites and single-page mobile apps only. 

    If you want to run split tests in mobile apps, you’ll have to do so via Firebase — Google’s app development platform. It also has a free tier but paid usage-based subscription kicks in after your product(s) reaches a certain usage threshold. 

    Google Optimize also doesn’t support CRO experiments for web or desktop applications, email campaigns or paid ad campaigns.Matomo A/B Testing, in contrast, allows you to run experiments in virtually every channel. We have three installation options — using JavaScript, server-side technology, or our mobile tracking SDK. These allow you to run split tests in any type of web or mobile app (including games), a desktop product, or on your website. Also, you can do different email marketing tests (e.g., compare subject line variants).

    A/B Testing 

    A/B testing (split testing) is the core feature of both products. Marketers use A/B testing to determine which creative elements such as website microcopy, button placements and banner versions, resonate better with target audiences. 

    You can benchmark different versions against one another to determine which variation resonates more with users. Or you can test an A version against B, C, D and beyond. This is called A/B/n testing. 

    Both Matomo A/B testing and Google Optimize let you test either separate page elements or two completely different landing page designs, using redirect tests. You can show different variants to different user groups (aka apply targeting criteria). For example, activate tests only for certain device types, locations or types of on-site behaviour. 

    The advantage of Matomo is that we don’t limit the number of concurrent experiments you can run. With Google Optimize, you’re limited to 5 simultaneous experiments. Likewise, 

    Matomo lets you select an unlimited number of experiment objectives, whereas Google caps the maximum choice to 3 predefined options per experiment. 

    Objectives are criteria the underlying statistical model will use to determine the best-performing version. Typically, marketers use metrics such as page views, session duration, bounce rate or generated revenue as conversion goals

    Conversions Report Matomo

    Multivariate testing (MVT)

    Multivariate testing (MVT) allows you to “pack” several A/B tests into one active experiment. In other words : You create a stack of variants to determine which combination drives the best marketing outcomes. 

    For example, an MVT experiment can include five versions of a web page, where each has a different slogan, product image, call-to-action, etc. Visitors are then served with a different variation. The tracking code collects data on their behaviours and desired outcomes (objectives) and reports the results.

    MVT saves marketers time as it’s a great alternative to doing separate A/B tests for each variable. Both Matomo and Google Optimize support this feature. However, Google Optimize caps the number of possible combinations at 16, whereas Matomo has no limits. 

    Redirect Tests

    Redirect tests, also known as split URL tests, allow you to serve two entirely different web page versions to users and compare their performance. This option comes in handy when you’re redesigning your website or want to test a localised page version in a new market. 

    Also, redirect tests are a great way to validate the performance of bottom-of-the-funnel (BoFU) pages as a checkout page (for eCommerce websites), a pricing page (for SaaS apps) or a contact/booking form (for a B2B service businesses). 

    You can do split URL tests with Google Optimize and Matomo A/B Testing. 

    Experiment Design 

    Google Optimize provides a visual editor for making simple page changes to your website (e.g., changing button colour or adding several headline variations). You can then preview the changes before publishing an experiment. For more complex experiments (e.g., testing different page block sequences), you’ll have to codify experiments using custom JavaScript, HTML and CSS.

    In Matomo, all A/B tests are configured on the server-side (i.e., by editing your website’s raw HTML) or client-side via JavaScript. Afterwards, you use the Matomo interface to start or schedule an experiment, set objectives and view reports. 

    Experiment Configuration 

    Marketers know how complex customer journeys can be. Multiple factors — from location and device to time of the day and discount size — can impact your conversion rates. That’s why a great CRO app allows you to configure multiple tracking conditions. 

    Matomo A/B testing comes with granular controls. First of all, you can decide which percentage of total web visitors participate in any given experiment. By default, the number is set to 100%, but you can change it to any other option. 

    Likewise, you can change which percentage of traffic each variant gets in an experiment. For example, your original version can get 30% of traffic, while options A and B receive 40% each. We also allow users to specify custom parameters for experiment participation. You can only show your variants to people in specific geo-location or returning visitors only. 

    Finally, you can select any type of meaningful objective to evaluate each variant’s performance. With Matomo, you can either use standard website analytics metrics (e.g., total page views, bounce rate, CTR, visit direction, etc) or custom goals (e.g., form click, asset download, eCommerce order, etc). 

    In other words : You’re in charge of deciding on your campaign targeting criteria, duration and evaluation objectives.

    A free Google Optimize account comes with three main types of user targeting options : 

    • Geo-targeting at city, region, metro and country levels. 
    • Technology targeting  by browser, OS or device type, first-party cookie, etc. 
    • Behavioural targeting based on metrics like “time since first arrival” and “page referrer” (referral traffic source). 

    Users can also configure other types of tracking scenarios (for example to only serve tests to signed-in users), using condition-based rules

    Reporting 

    Both Matomo and Google Optimize use different statistical models to evaluate which variation performs best. 

    Matomo relies on statistical hypothesis testing, which we use to count unique visitors and report on conversion rates. We analyse all user data (with no data sampling applied), meaning you get accurate reporting, based on first-hand data, rather than deductions. For that reason, we ask users to avoid drawing conclusions before their experiment participation numbers reach a statistically significant result. Typically, we recommend running an experiment for at least several business cycles to get a comprehensive report. 

    Google Optimize, in turn, uses Bayesian inference — a statistical method, which relies on a random sample of users to compare the performance rates of each creative against one another. While a Bayesian model generates CRO reports faster and at a bigger scale, it’s based on inferences.

    Model developers need to have the necessary skills to translate subjective prior beliefs about the probability of a certain event into a mathematical formula. Since Google Optimize is a proprietary tool, you cannot audit the underlying model design and verify its accuracy. In other words, you trust that it was created with the right judgement. 

    In comparison, Matomo started as an open-source project, and our source code can be audited independently by anyone at any time. 

    Another reporting difference to mind is the reporting delays. Matomo Cloud generates A/B reports within 6 hours and in only 1 hour for Matomo On-Premise. Google Optimize, in turn, requires 12 hours from the first experiment setup to start reporting on results. 

    When you configure a test experiment and want to quickly verify that everything is set up correctly, this can be an inconvenience.

    User Privacy & GDPR Compliance 

    Google Optimize works in conjunction with Google Analytics, which isn’t GDPR compliant

    For all website traffic from the EU, you’re therefore obliged to show a cookie consent banner. The kicker, however, is that you can only show an Optimize experiment after the user gives consent to tracking. If the user doesn’t, they will only see an original page version. Considering that almost 40% of global consumers reject cookie consent banners, this can significantly affect your results.

    This renders Google Optimize mostly useless in the EU since it would only allow you to run tests with a fraction ( 60%) of EU traffic — and even less if you apply any extra targeting criteria. 

    In comparison, Matomo is fully GDPR compliant. Therefore, our users are legally exempt from displaying cookie-consent banners in most EU markets (with Germany and the UK being an exception). Since Matomo A/B testing is part of Matomo web analytics, you don’t have to worry about GDPR compliance or breaches in user privacy. 

    Digital Experience Intelligence 

    You can get comprehensive statistical data on variants’ performance with Google Optimize. But you don’t get further insights on why some tests are more successful than others. 

    Matomo enables you to collect more insights with two extra features :

    • User session recordings : Monitor how users behave on different page versions. Observe clicks, mouse movements, scrolls, page changes, and form interactions to better understand the users’ cumulative digital experience. 
    • Heatmaps : Determine which elements attract the most users’ attention to fine-tune your split tests. With a standard CRO tool, you only assume that a certain page element does matter for most users. A heatmap can help you determine for sure. 

    Both of these features are bundled into your Matomo Cloud subscription

    Integrations 

    Both Matomo and Google Optimize integrate with multiple other tools. 

    Google Optimize has native integrations with other products in the marketing family — GA, Google Ads, Google Tag Manager, Google BigQuery, Accelerated Mobile Pages (AMP), and Firebase. Separately, other popular marketing apps have created custom connectors for integrating Google Optimize data. 

    Matomo A/B Testing, in turn, can be combined with other web analytics and CRO features such as Funnels, Multi-Channel Attribution, Tag Manager, Form Analytics, Heatmaps, Session Recording, and more ! 

    You can also conveniently export your website analytics or CRO data using Matomo Analytics API to analyse it in another app. 

    Pricing 

    Google Optimize is a free tool but has usage caps. If you want to schedule more than 5 concurrent experiments or test more than 16 variants at once, you’ll have to upgrade to Optimize 360. Optimize 360 prices aren’t listed publicly but are said to be closer to six figures per year. 

    Matomo A/B Testing is available with every Cloud subscription (starting from €19) and Matomo On-Premise users can also get A/B Testing as a plugin (starting from €199/year). In each case, there are no caps or data limits. 

    Google Optimize vs Matomo A/B Testing : Comparison Table

    Features/capabilitiesGoogle OptimizeMatomo A/B test
    Supported channelsWebWeb, mobile, email, digital campaigns
    A/B testingcheck mark iconcheck mark icon
    Multivariate testing (MVT)check mark iconcheck mark icon
    Split URL testscheck mark iconcheck mark icon
    Web analytics integration Native with UA/GA4 Native with Matomo

    You can also migrate historical UA (GA3) data to Matomo
    Audience segmentation BasicAdvanced
    Geo-targetingcheck mark iconX
    Technology targetingcheck mark iconX
    Behavioural targetingBasicAdvanced
    Reporting modelBayesian analysisStatistical hypothesis testing
    Report availability Within 12 hours after setup 6 hours for Matomo Cloud

    1 hour for Matomo On-Premise
    HeatmapsXcheck mark icon

    Included with Matomo Cloud
    Session recordingsXcheck mark icon

    Included with Matomo Cloud
    GDPR complianceXcheck mark icon
    Support Self-help desk on a free tierSelf-help guides, user forum, email
    PriceFree limited tier From €19 for Cloud subscription

    From €199/year as plugin for On-Premise

    Final Thoughts : Who Benefits the Most From an A/B Testing Tool ?

    Split testing is an excellent method for validating various assumptions about your target customers. 

    With A/B testing tools you get a data-backed answer to research hypotheses such as “How different pricing affects purchases ?”, “What contact button placement generates more clicks ?”, “Which registration form performs best with new app subscribers ?” and more. 

    Such insights can be game-changing when you’re trying to improve your demand-generation efforts or conversion rates at the BoFu stage. But to get meaningful results from CRO tests, you need to select measurable, representative objectives.

    For example, split testing different pricing strategies for low-priced, frequently purchased products makes sense as you can run an experiment for a couple of weeks to get a statistically relevant sample. 

    But if you’re in a B2B SaaS product, where the average sales cycle takes weeks (or months) to finalise and things like “time-sensitive discounts” or “one-time promos” don’t really work, getting adequate CRO data will be harder. 

    To see tangible results from CRO, you’ll need to spend more time on test ideation than implementation. Your team needs to figure out : which elements to test, in what order, and why. 

    Effective CRO tests are designed for a specific part of the funnel and assume that you’re capable of effectively identifying and tracking conversions (goals) at the selected stage. This alone can be a complex task since not all customer journeys are alike. For SaaS websites, using a goal like “free trial account registration” can be a good starting point.

    A good test also produces a meaningful difference between the proposed variant and the original version. As Nima Yassini, Partner at Deloitte Digital, rightfully argues :

    “I see people experimenting with the goal of creating an uplift. There’s nothing wrong with that, but if you’re only looking to get wins you will be crushed when the first few tests fail. The industry average says that only one in five to seven tests win, so you need to be prepared to lose most of the time”.

    In many cases, CRO tests don’t provide the data you expected (e.g., people equally click the blue and green buttons). In this case, you need to start building your hypothesis from scratch. 

    At the same time, it’s easy to get caught up in optimising for “vanity metrics” — such that look good in the report, but don’t quite match your marketing objectives. For example, better email headline variations can improve your email open rates. But if users don’t proceed to engage with the email content (e.g. click-through to your website or use a provided discount code), your efforts are still falling short. 

    That’s why developing a baseline strategy is important before committing to an A/B testing tool. Google Optimize appealed to many users because it’s free and allows you to test your split test strategy cost-effectively. 

    With its upcoming depreciation, many marketers are very committed to a more expensive A/B tool (especially when they’re not fully sure about their CRO strategy and its results). 

    Matomo A/B testing is a cost-effective, GDPR-compliant alternative to Google Optimize with a low learning curve and extra competitive features. 

    Discover if Matomo A/B Testing is the ideal Google Optimize alternative for your organization with our free 21-day trial. No credit card required.