Recherche avancée

Médias (3)

Mot : - Tags -/Valkaama

Autres articles (15)

  • Creating farms of unique websites

    13 avril 2011, par

    MediaSPIP platforms can be installed as a farm, with a single "core" hosted on a dedicated server and used by multiple websites.
    This allows (among other things) : implementation costs to be shared between several different projects / individuals rapid deployment of multiple unique sites creation of groups of like-minded sites, making it possible to browse media in a more controlled and selective environment than the major "open" (...)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

  • Gestion des droits de création et d’édition des objets

    8 février 2011, par

    Par défaut, beaucoup de fonctionnalités sont limitées aux administrateurs mais restent configurables indépendamment pour modifier leur statut minimal d’utilisation notamment : la rédaction de contenus sur le site modifiables dans la gestion des templates de formulaires ; l’ajout de notes aux articles ; l’ajout de légendes et d’annotations sur les images ;

Sur d’autres sites (3910)

  • Matomo analytics for wordpress

    15 octobre 2019, par Matomo Core Team — Community

    Self-hosting web analytics got a whole lot easier ! Introducing Matomo for WordPress

    Be the first to try it out ! Your feedback is much needed and appreciated

    Get a fully functioning Matomo (which is comparable to Google Analytics) in seconds ! How ? With the new Matomo Analytics for WordPress plugin. 

    Web analytics in WordPress has never been easier to get, or more powerful. Matomo Analytics for WordPress is the one-stop problem solver. It’ll save you time, money and give you the insights to help your website or business succeed. 

    Best of all, we get to further the goal of decentralising the internet. Our hope is for Matomo Analytics for WordPress to spread far and wide. We’re so excited that more and more people can now get their hands on this powerful, free, open-source analytics platform, in a few clicks !

    Download now and check it out !

    What do you get ?

    • No more signing up to third party analytics service (like Google)
    • No more sending away your valuable data to a third party service (like Google)
    • Easy setup – install with a few clicks, no tracking code installation or developer knowledge needed
    • 100% accurate data – no data sampling and no data limits 
    • Full data ownership – all data is stored on your servers and no one else can see your data
    • Privacy protection / GDPR compliance
    • Ecommerce tracking out-of-the-box (Woocommerce, Easy Digital Downloads, and MemberPress) and we’re keen to add many more over time
    • Powerful features – segmenting, comparing reports, different visualisations, real-time reports, visit logs and visitor profiles, Matomo Tag Manager, dashboards, data export, APIs, and many more
    • Compared to other WordPress solutions we don’t charge you extra for basic features that should work out-of-the-box
    • Just like Matomo On-Premise, Matomo Analytics for WordPress is free

    We need your feedback !

    We all know and love the versatility of WordPress – with over 55,000 plugins and all the different ways of hosting it. However, with this great versatility comes the potential for things to be missed, so we’re keen to hear your feedback.

    Thank you ! We really appreciate your help on this ❤️

    How do you get Matomo Analytics for WordPress ?

    Log in to your WordPress and go to “Plugins => Add New”, search for “Matomo Analytics – Ethical Stats. Powerful Insights”, click on “Install” and then “Activate”.

    All you need is at least WordPress 4.8 and PHP 7.0 or later. MySQL 5.1+ is recommended. 

    The source code is available at : https://github.com/matomo-org/wp-matomo/

    In perfect harmony : Matomo and WordPress

    Matomo Analytics for WordPress

    The idea for this started two years ago when we realised the similarities between the Matomo and WordPress project. 

    Not only from a technological point of view – where both are based on PHP and MySQL and can be extended using plugins – but also from a philosophical, license and values point of view. We both believe in privacy, security, data ownership, openness, transparency, having things working out-of-the-box, simplicity etc. 

    WordPress is currently used on approximately 30% of all websites. Many of them use the self-hosted open-source WordPress version. Giving everyone in this market the opportunity to easily get a powerful web analytics platform for free, means a lot to us. We believe WordPress users get a real choice besides the standard solution of Google Analytics, and it furthers our effort and goal of decentralising the internet. 

    We’re hoping more people will be empowered to protect user privacy, have access to a great free and open-source tool, and keep control of data in their own hands.

    We hope you feel the same. Help us spread the word to your friends and get them in on this awesome new project !

    Share on facebook
    Share on twitter
    Share on linkedin

    FAQs

    Isn’t there already a WP-Matomo plugin for WordPress available ?

    Yes, the existing WP-Matomo (WP-Piwik) plugin is an awesome plugin to connect your existing Matomo On-Premise or Matomo Cloud account with WordPress. The difference is that this new plugin installs Matomo Analytics fully in your WordPress. So you get the convenience of having a powerful analytics platform within your WordPress.

    We highly recommend you install this new plugin if you use WordPress and are not running Matomo yet. 

    If you are already using Matomo on our Cloud or On-Premise, we’d still highly recommend you use WP-Matomo (WP-Piwik). So that you get an easier way of inserting the tracking code into your WordPress site and get insights faster.

    I have a high traffic website, will it be an issue ?

    If you have a lot of traffic, we’d advise you to install Matomo On-Premise separately. There’s no specific traffic threshold we can give you on when it’s better to use Matomo On-Premise. It really depends on your server. 

    We reckon if you have more than 500,000 page views a month, you may want to think about using Matomo On-Premise with WP-Matomo instead, but this is just an estimate. In general, if the load on your server is already quite high, then it might be better to install Matomo on a separate server. See also recommended server sizing for running Matomo.

    How do I report a bug or request a new feature in Matomo for WordPress ?

    Please create an issue, on our repository whenever you find a bug or if you have any suggestion or ideas of improvement. We want to build an outstanding analytics experience for WordPress !

    Have another question you’re dying to ask ? The Matomo for WordPress FAQ page might have the answer you need. 

    Matomo Analytics for WordPress newsletter

    Get ahead of the crowd – signup to our exclusive Matomo for WordPress newsletter to get the latest updates on this exciting new project.

    &lt;script type=&quot;text/javascript&quot;&gt;<br />
    (function(global) {<br />
     function serialize(form){if(!form||form.nodeName!==&quot;FORM&quot;){return }var i,j,q=[];for(i=form.elements.length-1;i&gt;=0;i=i-1){if(form.elements[i].name===&quot;&quot;){continue}switch(form.elements[i].nodeName){case&quot;INPUT&quot;:switch(form.elements[i].type){case&quot;text&quot;:case&quot;hidden&quot;:case&quot;password&quot;:case&quot;button&quot;:case&quot;reset&quot;:case&quot;submit&quot;:q.push(form.elements[i].name+&quot;=&quot;+encodeURIComponent(form.elements[i].value));break;case&quot;checkbox&quot;:case&quot;radio&quot;:if(form.elements[i].checked){q.push(form.elements[i].name+&quot;=&quot;+encodeURIComponent(form.elements[i].value))}break;case&quot;file&quot;:break}break;case&quot;TEXTAREA&quot;:q.push(form.elements[i].name+&quot;=&quot;+encodeURIComponent(form.elements[i].value));break;case&quot;SELECT&quot;:switch(form.elements[i].type){case&quot;select-one&quot;:q.push(form.elements[i].name+&quot;=&quot;+encodeURIComponent(form.elements[i].value));break;case&quot;select-multiple&quot;:for(j=form.elements[i].options.length-1;j&gt;=0;j=j-1){if(form.elements[i].options[j].selected){q.push(form.elements[i].name+&quot;=&quot;+encodeURIComponent(form.elements[i].options[j].value))}}break}break;case&quot;BUTTON&quot;:switch(form.elements[i].type){case&quot;reset&quot;:case&quot;submit&quot;:case&quot;button&quot;:q.push(form.elements[i].name+&quot;=&quot;+encodeURIComponent(form.elements[i].value));break}break}}return q.join(&quot;&amp;&quot;)};<br />
    <br />
    <br />
     function extend(destination, source) {<br />
       for (var prop in source) {<br />
         destination[prop] = source[prop];<br />
       }<br />
     }<br />
    <br />
     if (!Mimi) var Mimi = {};<br />
     if (!Mimi.Signups) Mimi.Signups = {};<br />
    <br />
     Mimi.Signups.EmbedValidation = function() {<br />
       this.initialize();<br />
    <br />
       var _this = this;<br />
       if (document.addEventListener) {<br />
         this.form.addEventListener('submit', function(e){<br />
           _this.onFormSubmit(e);<br />
         });<br />
       } else {<br />
         this.form.attachEvent('onsubmit', function(e){<br />
           _this.onFormSubmit(e);<br />
         });<br />
       }<br />
     };<br />
    <br />
     extend(Mimi.Signups.EmbedValidation.prototype, {<br />
       initialize: function() {<br />
         this.form         = document.getElementById('ema_signup_form');<br />
         this.submit       = document.getElementById('webform_submit_button');<br />
         this.callbackName = 'jsonp_callback_' + Math.round(100000 * Math.random());<br />
         this.validEmail   = /.+@.+\..+/<br />
       },<br />
    <br />
       onFormSubmit: function(e) {<br />
         e.preventDefault();<br />
    <br />
         this.validate();<br />
         if (this.isValid) {<br />
           this.submitForm();<br />
         } else {<br />
           this.revalidateOnChange();<br />
         }<br />
       },<br />
    <br />
       validate: function() {<br />
         this.isValid = true;<br />
         this.emailValidation();<br />
         this.fieldAndListValidation();<br />
         this.updateFormAfterValidation();<br />
       },<br />
    <br />
       emailValidation: function() {<br />
         var email = document.getElementById('signup_email');<br />
    <br />
         if (this.validEmail.test(email.value)) {<br />
           this.removeTextFieldError(email);<br />
         } else {<br />
           this.textFieldError(email);<br />
           this.isValid = false;<br />
         }<br />
       },<br />
    <br />
       fieldAndListValidation: function() {<br />
         var fields = this.form.querySelectorAll('.mimi_field.required');<br />
    <br />
         for (var i = 0; i &lt; fields.length; ++i) {<br />
           var field = fields[i],<br />
               type  = this.fieldType(field);<br />
           if (type === 'checkboxes' || type === 'radio_buttons' || type === 'age_check') {<br />
             this.checkboxAndRadioValidation(field);<br />
           } else {<br />
             this.textAndDropdownValidation(field, type);<br />
           }<br />
         }<br />
       },<br />
    <br />
       fieldType: function(field) {<br />
         var type = field.querySelectorAll('.field_type');<br />
    <br />
         if (type.length) {<br />
           return type[0].getAttribute('data-field-type');<br />
         } else if (field.className.indexOf('checkgroup') &gt;= 0) {<br />
           return 'checkboxes';<br />
         } else {<br />
           return 'text_field';<br />
         }<br />
       },<br />
    <br />
       checkboxAndRadioValidation: function(field) {<br />
         var inputs   = field.getElementsByTagName('input'),<br />
             selected = false;<br />
    <br />
         for (var i = 0; i &lt; inputs.length; ++i) {<br />
           var input = inputs[i];<br />
           if((input.type === 'checkbox' || input.type === 'radio') &amp;&amp; input.checked) {<br />
             selected = true;<br />
           }<br />
         }<br />
    <br />
         if (selected) {<br />
           field.className = field.className.replace(/ invalid/g, '');<br />
         } else {<br />
           if (field.className.indexOf('invalid') === -1) {<br />
             field.className += ' invalid';<br />
           }<br />
    <br />
           this.isValid = false;<br />
         }<br />
       },<br />
    <br />
       textAndDropdownValidation: function(field, type) {<br />
         var inputs = field.getElementsByTagName('input');<br />
    <br />
         for (var i = 0; i &lt; inputs.length; ++i) {<br />
           var input = inputs[i];<br />
           if (input.name.indexOf('signup') &gt;= 0) {<br />
             if (type === 'text_field') {<br />
               this.textValidation(input);<br />
             } else {<br />
               this.dropdownValidation(field, input);<br />
             }<br />
           }<br />
         }<br />
         this.htmlEmbedDropdownValidation(field);<br />
       },<br />
    <br />
       textValidation: function(input) {<br />
         if (input.id === 'signup_email') return;<br />
    <br />
         if (input.value) {<br />
           this.removeTextFieldError(input);<br />
         } else {<br />
           this.textFieldError(input);<br />
           this.isValid = false;<br />
         }<br />
       },<br />
    <br />
       dropdownValidation: function(field, input) {<br />
         if (input.value) {<br />
           field.className = field.className.replace(/ invalid/g, '');<br />
         } else {<br />
           if (field.className.indexOf('invalid') === -1) field.className += ' invalid';<br />
           this.onSelectCallback(input);<br />
           this.isValid = false;<br />
         }<br />
       },<br />
    <br />
       htmlEmbedDropdownValidation: function(field) {<br />
         var dropdowns = field.querySelectorAll('.mimi_html_dropdown');<br />
         var _this = this;<br />
    <br />
         for (var i = 0; i &lt; dropdowns.length; ++i) {<br />
           var dropdown = dropdowns[i];<br />
    <br />
           if (dropdown.value) {<br />
             field.className = field.className.replace(/ invalid/g, '');<br />
           } else {<br />
             if (field.className.indexOf('invalid') === -1) field.className += ' invalid';<br />
             this.isValid = false;<br />
             dropdown.onchange = (function(){ _this.validate(); });<br />
           }<br />
         }<br />
       },<br />
    <br />
       textFieldError: function(input) {<br />
         input.className   = 'required invalid';<br />
         input.placeholder = input.getAttribute('data-required-field');<br />
       },<br />
    <br />
       removeTextFieldError: function(input) {<br />
         input.className   = 'required';<br />
         input.placeholder = '';<br />
       },<br />
    <br />
       onSelectCallback: function(input) {<br />
         if (typeof Widget === 'undefined' || !Widget.BasicDropdown) return;<br />
    <br />
         var dropdownEl = input.parentNode,<br />
             instances  = Widget.BasicDropdown.instances,<br />
             _this = this;<br />
    <br />
         for (var i = 0; i &lt; instances.length; ++i) {<br />
           var instance = instances[i];<br />
           if (instance.wrapperEl === dropdownEl) {<br />
             instance.onSelect = function(){ _this.validate() };<br />
           }<br />
         }<br />
       },<br />
    <br />
       updateFormAfterValidation: function() {<br />
         this.form.className   = this.setFormClassName();<br />
         this.submit.value     = this.submitButtonText();<br />
         this.submit.disabled  = !this.isValid;<br />
         this.submit.className = this.isValid ? 'submit' : 'disabled';<br />
       },<br />
    <br />
       setFormClassName: function() {<br />
         var name = this.form.className;<br />
    <br />
         if (this.isValid) {<br />
           return name.replace(/\s?mimi_invalid/, '');<br />
         } else {<br />
           if (name.indexOf('mimi_invalid') === -1) {<br />
             return name += ' mimi_invalid';<br />
           } else {<br />
             return name;<br />
           }<br />
         }<br />
       },<br />
    <br />
       submitButtonText: function() {<br />
         var invalidFields = document.querySelectorAll('.invalid'),<br />
             text;<br />
    <br />
         if (this.isValid || !invalidFields) {<br />
           text = this.submit.getAttribute('data-default-text');<br />
         } else {<br />
           if (invalidFields.length || invalidFields[0].className.indexOf('checkgroup') === -1) {<br />
             text = this.submit.getAttribute('data-invalid-text');<br />
           } else {<br />
             text = this.submit.getAttribute('data-choose-list');<br />
           }<br />
         }<br />
         return text;<br />
       },<br />
    <br />
       submitForm: function() {<br />
         this.formSubmitting();<br />
    <br />
         var _this = this;<br />
         window[this.callbackName] = function(response) {<br />
           delete window[this.callbackName];<br />
           document.body.removeChild(script);<br />
           _this.onSubmitCallback(response);<br />
         };<br />
    <br />
         var script = document.createElement('script');<br />
         script.src = this.formUrl('json');<br />
         document.body.appendChild(script);<br />
       },<br />
    <br />
       formUrl: function(format) {<br />
         var action  = this.form.action;<br />
         if (format === 'json') action += '.json';<br />
         return action + '?callback=' + this.callbackName + '&amp;' + serialize(this.form);<br />
       },<br />
    <br />
       formSubmitting: function() {<br />
         this.form.className  += ' mimi_submitting';<br />
         this.submit.value     = this.submit.getAttribute('data-submitting-text');<br />
         this.submit.disabled  = true;<br />
         this.submit.className = 'disabled';<br />
       },<br />
    <br />
       onSubmitCallback: function(response) {<br />
         if (response.success) {<br />
           this.onSubmitSuccess(response.result);<br />
         } else {<br />
           top.location.href = this.formUrl('html');<br />
         }<br />
       },<br />
    <br />
       onSubmitSuccess: function(result) {<br />
         if (result.has_redirect) {<br />
           top.location.href = result.redirect;<br />
         } else if(result.single_opt_in || !result.confirmation_html) {<br />
           this.disableForm();<br />
           this.updateSubmitButtonText(this.submit.getAttribute('data-thanks'));<br />
         } else {<br />
           this.showConfirmationText(result.confirmation_html);<br />
         }<br />
       },<br />
    <br />
       showConfirmationText: function(html) {<br />
         var fields = this.form.querySelectorAll('.mimi_field');<br />
    <br />
         for (var i = 0; i &lt; fields.length; ++i) {<br />
           fields[i].style['display'] = 'none';<br />
         }<br />
    <br />
         (this.form.querySelectorAll('fieldset')[0] || this.form).innerHTML = html;<br />
       },<br />
    <br />
       disableForm: function() {<br />
         var elements = this.form.elements;<br />
         for (var i = 0; i &lt; elements.length; ++i) {<br />
           elements[i].disabled = true;<br />
         }<br />
       },<br />
    <br />
       updateSubmitButtonText: function(text) {<br />
         this.submit.value = text;<br />
       },<br />
    <br />
       revalidateOnChange: function() {<br />
         var fields = this.form.querySelectorAll(&quot;.mimi_field.required&quot;),<br />
             _this = this;<br />
    <br />
         var onTextFieldChange = function() {<br />
           if (this.getAttribute('name') === 'signup[email]') {<br />
             if (_this.validEmail.test(this.value)) _this.validate();<br />
           } else {<br />
             if (this.value.length === 1) _this.validate();<br />
           }<br />
         }<br />
    <br />
         for (var i = 0; i &lt; fields.length; ++i) {<br />
           var inputs = fields[i].getElementsByTagName('input');<br />
           for (var j = 0; j &lt; inputs.length; ++j) {<br />
             if (this.fieldType(fields[i]) === 'text_field') {<br />
               inputs[j].onkeyup = onTextFieldChange;<br />
               inputs[j].onchange = onTextFieldChange; <br />
             } else {<br />
               inputs[j].onchange = function(){ _this.validate() };<br />
             }<br />
           }<br />
         }<br />
       }<br />
     });<br />
    <br />
     if (document.addEventListener) {<br />
       document.addEventListener(&quot;DOMContentLoaded&quot;, function() {<br />
         new Mimi.Signups.EmbedValidation();<br />
       });<br />
     }<br />
     else {<br />
       window.attachEvent('onload', function() {<br />
         new Mimi.Signups.EmbedValidation();<br />
       });<br />
     }<br />
    })(this);<br />
    &lt;/script&gt;
  • Accessibility Testing : Why It Matters and How to Get Started

    7 mai 2024, par Erin

    Nearly 96% of website homepages had failures with meeting web accessibility criteria in 2024. Aside from not complying with web accessibility laws and regulations, companies are failing a growing number of users with accessibility needs.

    With disabilities, chronic illnesses and ageing populations all rising, brands need to take accessibility more seriously. 

    In this article, we explain why accessibility testing is so important and how you can get started today.

    What is accessibility testing ?

    Accessibility testing optimises digital experiences to make them accessible for users with a range of disabilities and impairments. This includes users with vision impairments, hearing loss, neurodivergence, motor disabilities and cognitive conditions.

    The goal is to create inclusive experiences for everyone by implementing UX principles that address the usability needs of diverse audiences.

    To help developers create accessible experiences, the World Wide Web Consortium (W3C) created the Web Content Accessibility Guidelines (WCAG). The international WCAG standards define the Four Principles of Accessibility :

    • Perceivable : Information and user interface components must be presentable to users in ways they perceive.
    • Operable : User interface components and navigation must be operable.
    • Understandable : Information and the operation of user interfaces must be understandable.
    • Robust : Content must be robust enough to be interpreted reliably by various user agents, including assistive technologies.
    WCAG Four Principles of Accessibility

    The current version of WCAG (2.2) contains 86 success criteria with three grades representing conformance levels :

    • Level A is the minimum conformance rating, indicating that web content is accessible to most users.
    • Level AA is the recommended conformance level to make content accessible to almost everyone, including users with severe disabilities.
    • Level AAA is the highest conformance rating, making content accessible to everyone, regardless of disability.
    WCAG accessibility conformance levels

    Why is accessibility testing important ?

    With record numbers of lawsuits over online accessibility cases, it’s clear that companies underestimate the importance of accessibility testing. Here are seven key reasons you should pay more attention to it :

    1. Create inclusive experiences : Above all, accessibility testing creates inclusive experiences for all users.
    2. Adhere to accessibility regulations : Accessibility laws in most major markets — including the EU web accessibility policy — make it illegal for companies to discriminate against users with disabilities.
    3. Social responsibility : Companies have an ethical responsibility to cater to all users and consumers. 57% say they’re more loyal to brands that commit to addressing social inequities.
    4. Accessibility needs are growing : 16% of the world’s population (1 in 6) experience significant disability and the number will continue to grow as ageing populations rise.
    5. Improve experiences for everyone : Accessibility improves experiences for all users — for example, 80% of UK viewers aged 18-25 (2021) watch content with subtitles enabled.
    6. Maximise marketing reach : Platforms like Google prioritise accessibility yearly, making accessible content and experiences more visible.
    7. Accessibility is profitable : Inclusive companies earn 1.6x more revenue, 2.6x more net income and 2x more profit, according to Accenture (PDF).
    Accenture Accessibility is Profitable

    Who needs inclusive UX ?

    Accessibility testing starts with understanding the usability needs of audiences with disabilities and impairments. Here’s a quick summary of the most common impairments and some of the needs they have in common :

    • Visual impairments : Users may rely on screen readers, magnification software, braille displays, etc. or require certain levels of contrast, text sizes and colour combinations to aid visibility.
    • Hearing impairments : Users may rely on closed captions and subtitles for video content, transcripts for multimedia content and visual alerts/notifications for updates.
    • Motor or mobility impairments : Users might rely on adaptive keyboards, voice recognition and other assistive devices.
    • Cognitive and neurological impairments : Users may rely on technologies like text-to-speech software or require simplified user interfaces, contrast designs, etc., to aid comprehension.
    • Speech impairments : Users may rely on speech recognition and dictation software for any interaction that requires them to speak (e.g., automated customer service machines).

    While accessibility tools can alleviate certain accessibility challenges, inclusive design can remove much of the burden from users. This can involve using plenty of contrast, careful font selection, increasing whitespace and plenty of other design choices.

    Refer to the latest version of the WCAG for further guidance.

    How to run accessibility testing

    Now that we’ve emphasised the importance of accessibility, let’s explain how you can implement your own accessibility testing strategy.

    Create your accessibility testing plan

    Careful planning is crucial for making accessibility testing affordable and profitable. This starts with identifying the assets you need to test and optimise. This may include :

    • Website or web app
    • Mobile app
    • Videos
    • Podcasts and audio
    • PDFs
    • Marketing emails

    Map out all the assets your target audience interacts with and bring them into your accessibility testing plan. Optimising your website for screen readers is great, but you don’t want to forget your marketing emails and exclude vision-impaired users.

    Once you’ve got a complete list of assets, identify the elements and interactions with each one that require accessibility testing. For example, on your website, you should optimise navigation, user interfaces, layouts, web forms, etc.

    You also need to consider the impact of device types. For example, how touchscreens change the experience for motor impairments.

    Now that you know the scope of your testing strategy, it’s time to define your accessibility standards. Use external frameworks like WCAG guidelines and relevant legal requirements to create an internal set of standards.

    Once your accessibility standards are complete, train your staff at every level. This includes designers, developers, and content creators — everyone who works on assets is included in your accessibility testing strategy.

    Implement your accessibility standards throughout the design and development phases. Aim to create the most inclusive experiences possible before the accessibility testing stage.

    Implement accessibility practices at every level

    Treating accessibility as an afterthought is the biggest mistake you can make. Aside from neglecting the importance of accessibility, it’s simply not affordable to create assets and then optimise them for accessibility.

    Instead, you need to implement accessibility standards in every design and development stage. This way, you create inclusive assets from the beginning, and accessibility testing flags minor fixes rather than overhauls.

    By extension, you can take lessons from accessibility tests and update your accessibility standards to improve the quality of future assets.

    Set clear specifications in your accessibility standards for everyone to follow. For example, content publishers should be responsible for adding alt-text to all images. Make designers responsible for following contrast guidelines when optimising elements like CTA buttons.

    A comparison of CTA buttons

    Next, managers can review assets and check for accessibility standards before anything is signed off. This way, you achieve higher test accessibility scores, and most fixes should be minor.

    This is the key to making accessibility testing manageable and profitable.

    Automate accessibility testing

    Automation is the other big factor in making accessibility efficient. With the right tools, you can run tests periodically without any manual workload, collecting data and flagging potential issues at almost no cost.

    For example, you can run automated accessibility tests on your website every month to check for common issues. This might flag up pages without alt-text for images, colour issues on a new batch of landing pages or a sudden drop in mobile loading times.

    Every automated test you can run reduces the manual workload of optimising accessibility. This frees up more time for the manual tests that require the attention of accessibility experts. 

    • Free up time for accessibility tasks that require manual testing
    • Identify issues with new content, assets, code, etc. faster
    • Run automated accessibility testing on new CRO changes

    Schedule manual accessibility reviews

    While it’s important to automate as much accessibility testing as possible, most accessibility standards require some form of manual testing. If we use the WCAG standards as a guideline, more than 70% of success require manual review and verification, including :

    • Testing websites with a screen reader
    • Navigating apps by only using a keyword
    • Quality assessing closed captions and subtitles
    • Testing web forms for people using speech input
    • Checking conversion actions for users with mobility issues (CTAs, forms, payments, etc.)

    Yes, you can automatically check all images for alt-text, but simply providing alt-text isn’t enough. You also have to review alt-text to make sure they’re descriptive, accurate and informative about the experience.

    Once again, the best way to minimise your time spent on manual testing is to implement accessibility standards throughout design and development. Train your content publishers to create alt-text that meets your criteria and editors to review them before pieces are signed off. 

    This way, you should always have the required alt-text before the content reaches the accessibility testing stage. The same applies to video transcriptions, web forms, website navigation, etc.

    Building a culture of accessibility makes the testing process as efficient as possible.

    What tools do you need for accessibility testing ?

    Now that we’ve covered the key essentials of accessibility testing, let’s look at some of the best accessibility testing tools to help you implement your strategy.

    accessiBe : AI-powered accessibility testing automation

    accessiBe is an accessibility testing automation and management system. It incorporates two core products : accessWidget for automating UI accessibility and accessFlow as an all-in-one solution for developers.

    screenshot of accessiBe

    Key features :

    • Automated accessibility testing
    • Accessibility widget for easy optimisation
    • Product accessibility for web, mobile and native apps
    • AI-powered accessibility insights
    • Compliance with WCAG, EAA and more

    As explained earlier, automation is crucial for making accessibility testing efficient and profitable. With accessiBe, you can automate the first line of accessibility checks so testers only need to get involved when manual action is necessary.

    Maze : Intelligent usability testing software

    Maze is a usability testing system that uses AI and automation to enhance traditional qualitative testing. You can run automated tests on live websites, capture survey feedback and recruit users to test experiences with real people.

    screenshot of Maze

    Key features :

    • Live website testing
    • Feedback surveys
    • Usability interviews
    • Test recruitment
    • Automated analysis

    While traditional usability interviews can provide in-depth insights, they’re expensive, time-consuming and difficult to run at scale. Maze’s solution is a hybrid testing system that automates data capture and analysis while supporting real user testing in one system.

    Matomo : Empowering people with ethical web analytics

    Matomo is a web analytics solution that gives you 100% data ownership while respecting user privacy. Think of this as a Google Analytics alternative that doesn’t use your visitors’ data for advertising purposes.

    Matomo dashboard

    Key features :

    • Privacy-friendly and GDPR-compliant tracking
    • Conversion rate optimisation features like heatmaps, session recordings, A/B testing and more
    • Accurate, unsampled data – see 40-60% more data than other analytics tools that sample data
    • Open-source

    Accessibility starts with creating quality experiences for everyone. Matomo reliably captures 100% of the data you need to optimise experiences without losing their trust. Instead of handing their personal info to Google or other tech giants, you retain full data ownership — fully compliant with GDPR, CCPA, etc.

    Try Matomo free for 21-days (no credit card required), or speak to our sales team for more info on how Matomo can enhance your site’s user experience and support your accessibility testing strategy.

    Try Matomo for Free

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

    No credit card required

    UserTesting : Video-based user testing software

    UserTesting is the more traditional system for running usability tests with real people. The platform helps you recruit users and manage usability tests with a series of sessions and video interviews.

    screenshot of UserTesting

    Key features :

    • Usability testing
    • Test recruitment
    • Live interviews
    • AI-powered insights
    • Usability services

    UserTesting is a slower, more expensive approach to testing experiences, but its video-based interviews allow you to have meaningful conversations with real users.

    Siteimprove : WCAG compliance testing

    Siteimprove automates website testing, accessibility and optimisation. It includes dedicated tools for checking WCAG and DCI compliance with an automated scoring system. This helps you keep track of scores and identify any accessibility and usability issues faster.

    screenshot of Siteimprove screenshot of Siteimprove

    Key features :

    • Automated accessibility checks
    • Inclusivity scores
    • Accessibility recommendations
    • Accessibility tracking
    • Marketing and revenue attribution
    • Usability insights

    Siteimprove provides a first line of accessibility testing with automated checks and practical recommendations. It also tracks accessibility scores, including ratings for all three WCAG compliance levels (A, AA and AAA).

    Find the value in accessibility testing

    Accessibility testing isn’t only a moral obligation ; it’s good business. Aside from avoiding fines and lawsuits, inclusive experiences are increasingly profitable. User bases with accessibility needs are only growing while non-disabled audiences are using accessibility resources like subtitles and transcripts in greater numbers.

    Accessibility improves everyone’s experiences, and this only does good things for conversion rates, revenue and profit.

    Start building your datasets for accessibility testing today with a Matomo 21-day free trial — no credit card required. Gain 100% ownership over your analytics data while complying with GDPR and other data privacy regulations.

  • Cannot merge VisualSampleEntry error while appending videos in MP4parser

    13 août 2021, par Abhishek Ippakayal

    I am creating four videos with ffmpeg and then i am appending them with MP4parser.&#xA;Details of four videos that i am creating with ffmpeg.

    &#xA;

      &#xA;
    • 1,2 video : created using one image
    • &#xA;

    &#xA;

    [-loop, 1, -i, Count_1627453922.jpg, -s, 720x1280, -vf, format=yuv420p,fps=25,fade=type=in:duration=1,fade=type=out:duration=1:start_time=1, -t, 2, -preset, ultrafast, CountImageVideo_1627453922.mp4]&#xA;

    &#xA;

      &#xA;
    • 3,4 video : trimming 3 second video from an existing mp4 video
    • &#xA;

    &#xA;

    [-i, footages_5_1624263519549.mp4, -ss, 00:00:00, -to, 00:00:02, -s, 720x1280, -r, 25, -preset, ultrafast, One_1627453926.mp4]&#xA;

    &#xA;

    Now i am trying to append all these videos with MP4Parser and getting below error :

    &#xA;

    java.io.IOException: Cannot merge VisualSampleEntry[com.googlecode.mp4parser.boxes.mp4.ESDescriptorBox@f3f76444] and VisualSampleEntry[com.googlecode.mp4parser.boxes.mp4.ESDescriptorBox@e20a2ed0]&#xA;        at com.googlecode.mp4parser.authoring.tracks.AppendTrack.mergeStsds(AppendTrack.java:116)&#xA;        at com.googlecode.mp4parser.authoring.tracks.AppendTrack.<init>(AppendTrack.java:59)&#xA;</init>

    &#xA;

    I have done some debugging and found something that can help understand error better.&#xA;Sample Description boxes of two videos

    &#xA;

    Two video tracks have different formats (MP4v & AVC1). I am new to ffmpeg and MP4parser so did not getting what i am doing wrong. Thanks ! in advance.

    &#xA;

    Logs of all video creation ffmpeg command and error of mp4parser

    &#xA;

    Copyright (c) 2000-2020 the FFmpeg developers&#xA;I:   built with Android (6454773 based on r365631c2) clang version 9.0.8 (https://android.googlesource.com/toolchain/llvm-project 98c855489587874b2a325e7a516b99d838599c6f) (based on LLVM 9.0.8svn)&#xA;I:   configuration: --cross-prefix=i686-linux-android- --sysroot=/files/android-sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/sysroot --prefix=/home/taner/Projects/mobile-ffmpeg/prebuilt/android-x86/ffmpeg --pkg-config=/usr/bin/pkg-config --enable-version3 --arch=i686 --cpu=i686 --cc=i686-linux-android16-clang --cxx=i686-linux-android16-clang&#x2B;&#x2B; --extra-libs=&#x27;-L/home/taner/Projects/mobile-ffmpeg/prebuilt/android-x86/cpu-features/lib -lndk_compat&#x27; --target-os=android --disable-neon --disable-asm --disable-inline-asm --enable-cross-compile --enable-pic --enable-jni --enable-optimizations --enable-swscale --enable-shared --enable-v4l2-m2m --disable-outdev=fbdev --disable-indev=fbdev --enable-small --disable-openssl --disable-xmm-clobber-test --disable-debug --enable-lto --disable-neon-clobber-test --disable-programs --disable-postproc --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --disable-sndio --disable-schannel --disable-securetransport --disable-xlib --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --disable-videotoolbox --disable-audiotoolbox --disable-appkit --disable-alsa --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-gmp --enable-gnutls --enable-libmp3lame --enable-libass --enable-iconv --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxml2 --enable-libopencore-amrnb --enable-libshine --enable-libspeex --enable-libwavpack --enable-libkvazaar --enable-libilbc --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libaom --enable-libtwolame --disable-sdl2 --enable-libvo-amrwbenc --enable-zlib --enable-mediacodec&#xA;I:   libavutil      56. 55.100 / 56. 55.100&#xA;I:   libavcodec     58. 96.100 / 58. 96.100&#xA;I:   libavformat    58. 48.100 / 58. 48.100&#xA;I:   libavdevice    58. 11.101 / 58. 11.101&#xA;I:   libavfilter     7. 87.100 /  7. 87.100&#xA;I:   libswscale      5.  8.100 /  5.  8.100&#xA;I:   libswresample   3.  8.100 /  3.  8.100&#xA;I: Input #0, png_pipe, from &#x27;1628829731.jpg&#x27;:&#xA;I:   Duration: &#xA;I: N/A&#xA;I: , bitrate: &#xA;I: N/A&#xA;I:     Stream #0:0&#xA;I: : Video: png, rgb24(pc), 1280x592&#xA;I: , &#xA;I: 25 fps, &#xA;I: 25 tbr, &#xA;I: 25 tbn, &#xA;I: 25 tbc&#xA;I: Input #1, lavfi, from &#x27;anullsrc&#x27;:&#xA;I:   Duration: &#xA;I: N/A&#xA;I: , start: &#xA;I: 0.000000&#xA;I: , bitrate: &#xA;I: 705 kb/s&#xA;I:     Stream #1:0&#xA;I: : Audio: pcm_u8, 44100 Hz, stereo, u8, 705 kb/s&#xA;W: Codec AVOption preset (Configuration preset) specified for output file #0 (FootageVideo_1628829747.mp4) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.&#xA;I: Stream mapping:&#xA;I:   Stream #0:0 -> #0:0&#xA;I:  (png (native) -> mpeg4 (native))&#xA;I:   Stream #1:0 -> #0:1&#xA;I:  (pcm_u8 (native) -> aac (native))&#xA;I: Press [q] to stop, [?] for help&#xA;W: [graph 0 input from stream 0:0 @ 0xbdf3a220] sws_param option is deprecated and ignored&#xA;I: Output #0, mp4, to &#x27;FootageVideo_1628829747.mp4&#x27;:&#xA;I:   Metadata:&#xA;I:     encoder         : &#xA;I: Lavf58.48.100&#xA;I:     Stream #0:0&#xA;I: : Video: mpeg4 (mp4v / 0x7634706D), yuv420p, 1280x592, q=2-31, 200 kb/s&#xA;I: , &#xA;I: 24 fps, &#xA;I: 12288 tbn, &#xA;I: 24 tbc&#xA;I:     Metadata:&#xA;I:       encoder         : &#xA;I: Lavc58.96.100 mpeg4&#xA;I:     Side data:&#xA;I:       &#xA;I: cpb: &#xA;I: bitrate max/min/avg: 0/0/200000 buffer size: 0 &#xA;I: vbv_delay: N/A&#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I:     Stream #0:1&#xA;I: : Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s&#xA;I:     Metadata:&#xA;I:       encoder         : &#xA;I: Lavc58.96.100 aac&#xA;I: Background young concurrent copying GC freed 20080(1054KB) AllocSpace objects, 9(2100KB) LOS objects, 7% free, 26MB/29MB, paused 4.477ms total 113.190ms&#xA;I: frame=    9 fps=0.0 q=13.8 size=       0kB time=00:00:00.34 bitrate=   1.0kbits/s speed=0.665x    &#xA;I: frame=   24 fps= 23 q=24.9 size=       0kB time=00:00:00.97 bitrate=   0.4kbits/s speed=0.953x    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=   40 fps= 26 q=21.0 size=       0kB time=00:00:01.64 bitrate=   0.2kbits/s speed=1.07x    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=   55 fps= 27 q=23.7 size=       0kB time=00:00:02.27 bitrate=   0.2kbits/s speed= 1.1x    &#xA;I: frame=   71 fps= 28 q=31.0 size=     256kB time=00:00:02.92 bitrate= 716.9kbits/s speed=1.13x    &#xA;I: frame=   72 fps= 27 q=31.0 Lsize=     307kB time=00:00:03.01 bitrate= 832.4kbits/s speed=1.14x    &#xA;I: video:303kB audio:1kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: &#xA;I: 1.018265%&#xA;I: [aac @ 0xbdf43c00] Qavg: 65536.000&#xA;I: Image to video: 0 : 674960272&#xA;I: [-loop, 1, -i, Count_1628829749.jpg, -f, lavfi, -i, anullsrc, -s, 1280x592, -vf, scale=&#x27;if(gt(a,1280/592),1280,-1)&#x27;:&#x27;if(gt(a1280/592),-1,592)&#x27;,format=yuv420p,fps=24,fade=type=in:duration=1,fade=type=out:duration=1:start_time=1, -t, 2, -preset, ultrafast, CountImageVideo_1628829749.mp4]&#xA;I: [-loop, 1, -i, Count_1628829749.jpg, -f, lavfi, -i, anullsrc, -s, 1280x592, -vf, scale=&#x27;if(gt(a,1280/592),1280,-1)&#x27;:&#x27;if(gt(a1280/592),-1,592)&#x27;,format=yuv420p,fps=24,fade=type=in:duration=1,fade=type=out:duration=1:start_time=1, -t, 2, -preset, ultrafast, CountImageVideo_1628829749.mp4]&#xA;I: Image to Video: [-loop, 1, -i, Count_1628829749.jpg, -f, lavfi, -i, anullsrc, -s, 1280x592, -vf, scale=&#x27;if(gt(a,1280/592),1280,-1)&#x27;:&#x27;if(gt(a1280/592),-1,592)&#x27;,format=yuv420p,fps=24,fade=type=in:duration=1,fade=type=out:duration=1:start_time=1, -t, 2, -preset, ultrafast, CountImageVideo_1628829749.mp4]&#xA;I: ffmpeg version v4.4-dev-416&#xA;I:  Copyright (c) 2000-2020 the FFmpeg developers&#xA;I:   built with Android (6454773 based on r365631c2) clang version 9.0.8 (https://android.googlesource.com/toolchain/llvm-project 98c855489587874b2a325e7a516b99d838599c6f) (based on LLVM 9.0.8svn)&#xA;I:   configuration: --cross-prefix=i686-linux-android- --sysroot=/files/android-sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/sysroot --prefix=/home/taner/Projects/mobile-ffmpeg/prebuilt/android-x86/ffmpeg --pkg-config=/usr/bin/pkg-config --enable-version3 --arch=i686 --cpu=i686 --cc=i686-linux-android16-clang --cxx=i686-linux-android16-clang&#x2B;&#x2B; --extra-libs=&#x27;-L/home/taner/Projects/mobile-ffmpeg/prebuilt/android-x86/cpu-features/lib -lndk_compat&#x27; --target-os=android --disable-neon --disable-asm --disable-inline-asm --enable-cross-compile --enable-pic --enable-jni --enable-optimizations --enable-swscale --enable-shared --enable-v4l2-m2m --disable-outdev=fbdev --disable-indev=fbdev --enable-small --disable-openssl --disable-xmm-clobber-test --disable-debug --enable-lto --disable-neon-clobber-test --disable-programs --disable-postproc --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --disable-sndio --disable-schannel --disable-securetransport --disable-xlib --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --disable-videotoolbox --disable-audiotoolbox --disable-appkit --disable-alsa --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-gmp --enable-gnutls --enable-libmp3lame --enable-libass --enable-iconv --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxml2 --enable-libopencore-amrnb --enable-libshine --enable-libspeex --enable-libwavpack --enable-libkvazaar --enable-libilbc --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libaom --enable-libtwolame --disable-sdl2 --enable-libvo-amrwbenc --enable-zlib --enable-mediacodec&#xA;I:   libavutil      56. 55.100 / 56. 55.100&#xA;I:   libavcodec     58. 96.100 / 58. 96.100&#xA;I:   libavformat    58. 48.100 / 58. 48.100&#xA;I:   libavdevice    58. 11.101 / 58. 11.101&#xA;I:   libavfilter     7. 87.100 /  7. 87.100&#xA;I:   libswscale      5.  8.100 /  5.  8.100&#xA;I:   libswresample   3.  8.100 /  3.  8.100&#xA;I: Input #0, png_pipe, from &#x27;Count_1628829749.jpg&#x27;:&#xA;I:   Duration: &#xA;I: N/A&#xA;I: , bitrate: &#xA;I: N/A&#xA;I:     Stream #0:0&#xA;I: : Video: png, rgba(pc), 1794x1080&#xA;I: , &#xA;I: 25 fps, &#xA;I: 25 tbr, &#xA;I: 25 tbn, &#xA;I: 25 tbc&#xA;I: Input #1, lavfi, from &#x27;anullsrc&#x27;:&#xA;I:   Duration: &#xA;I: N/A&#xA;I: , start: &#xA;I: 0.000000&#xA;I: , bitrate: &#xA;I: 705 kb/s&#xA;I:     Stream #1:0&#xA;I: : Audio: pcm_u8, 44100 Hz, stereo, u8, 705 kb/s&#xA;W: Codec AVOption preset (Configuration preset) specified for output file #0 (CountImageVideo_1628829749.mp4) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.&#xA;I: Stream mapping:&#xA;I:   Stream #0:0 -> #0:0&#xA;I:  (png (native) -> mpeg4 (native))&#xA;I:   Stream #1:0 -> #0:1&#xA;I:  (pcm_u8 (native) -> aac (native))&#xA;I: Press [q] to stop, [?] for help&#xA;W: [graph 0 input from stream 0:0 @ 0xbe554440] sws_param option is deprecated and ignored&#xA;I: Output #0, mp4, to &#x27;CountImageVideo_1628829749.mp4&#x27;:&#xA;I:   Metadata:&#xA;I:     encoder         : &#xA;I: Lavf58.48.100&#xA;I:     Stream #0:0&#xA;I: : Video: mpeg4 (mp4v / 0x7634706D), yuv420p, 1280x592, q=2-31, 200 kb/s&#xA;I: , &#xA;I: 24 fps, &#xA;I: 12288 tbn, &#xA;I: 24 tbc&#xA;I:     Metadata:&#xA;I:       encoder         : &#xA;I: Lavc58.96.100 mpeg4&#xA;I:     Side data:&#xA;I:       &#xA;I: cpb: &#xA;I: bitrate max/min/avg: 0/0/200000 buffer size: 0 &#xA;I: vbv_delay: N/A&#xA;I:     Stream #0:1&#xA;I: : Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s&#xA;I:     Metadata:&#xA;I:       encoder         : &#xA;I: Lavc58.96.100 aac&#xA;W: Not supplying enough data to HAL, expected position 1243219441 , only wrote 1243083210&#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=    3 fps=0.0 q=2.0 size=       0kB time=00:00:00.09 bitrate=   3.8kbits/s speed=0.289x    &#xA;I: frame=   11 fps=0.0 q=2.0 size=       0kB time=00:00:00.44 bitrate=   0.8kbits/s speed=0.521x    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=   18 fps= 13 q=2.0 size=       0kB time=00:00:00.71 bitrate=   0.5kbits/s speed=0.532x    &#xA;I: frame=   26 fps= 14 q=2.0 size=       0kB time=00:00:01.06 bitrate=   0.3kbits/s speed=0.571x    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=   35 fps= 14 q=2.0 size=       0kB time=00:00:01.43 bitrate=   0.2kbits/s speed=0.595x    &#xA;I: frame=   43 fps= 14 q=2.0 size=       0kB time=00:00:01.76 bitrate=   0.2kbits/s speed=0.593x    &#xA;D: onUnbind: Intent { act=com.google.android.gms.wallet.service.BIND pkg=com.google.android.gms }&#xA;D: onUnbind: Intent { act=com.google.android.mdd.service.START cmp=com.google.android.gms/.chimera.GmsBoundBrokerService }&#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=   48 fps= 14 q=2.0 Lsize=      75kB time=00:00:02.02 bitrate= 303.7kbits/s speed=0.586x    &#xA;I: video:72kB audio:1kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: &#xA;I: 3.472700%&#xA;I: [aac @ 0xbdf69c00] Qavg: 65536.000&#xA;I: Count Image to video: 0 : 674963874&#xA;I: Start Video Query: [-i, iOS_footages_4_1627755471638.mp4, -ss, 00:00:02, -to, 00:00:05, -s, 1280x592, -r, 24, -preset, ultrafast, TilePartOne_1628829753.mp4]&#xA;I: ffmpeg version v4.4-dev-416&#xA;I:  Copyright (c) 2000-2020 the FFmpeg developers&#xA;I:   built with Android (6454773 based on r365631c2) clang version 9.0.8 (https://android.googlesource.com/toolchain/llvm-project 98c855489587874b2a325e7a516b99d838599c6f) (based on LLVM 9.0.8svn)&#xA;I:   configuration: --cross-prefix=i686-linux-android- --sysroot=/files/android-sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/sysroot --prefix=/home/taner/Projects/mobile-ffmpeg/prebuilt/android-x86/ffmpeg --pkg-config=/usr/bin/pkg-config --enable-version3 --arch=i686 --cpu=i686 --cc=i686-linux-android16-clang --cxx=i686-linux-android16-clang&#x2B;&#x2B; --extra-libs=&#x27;-L/home/taner/Projects/mobile-ffmpeg/prebuilt/android-x86/cpu-features/lib -lndk_compat&#x27; --target-os=android --disable-neon --disable-asm --disable-inline-asm --enable-cross-compile --enable-pic --enable-jni --enable-optimizations --enable-swscale --enable-shared --enable-v4l2-m2m --disable-outdev=fbdev --disable-indev=fbdev --enable-small --disable-openssl --disable-xmm-clobber-test --disable-debug --enable-lto --disable-neon-clobber-test --disable-programs --disable-postproc --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --disable-sndio --disable-schannel --disable-securetransport --disable-xlib --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --disable-videotoolbox --disable-audiotoolbox --disable-appkit --disable-alsa --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-gmp --enable-gnutls --enable-libmp3lame --enable-libass --enable-iconv --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxml2 --enable-libopencore-amrnb --enable-libshine --enable-libspeex --enable-libwavpack --enable-libkvazaar --enable-libilbc --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libaom --enable-libtwolame --disable-sdl2 --enable-libvo-amrwbenc --enable-zlib --enable-mediacodec&#xA;I:   libavutil      56. 55.100 / 56. 55.100&#xA;I:   libavcodec     58. 96.100 / 58. 96.100&#xA;I:   libavformat    58. 48.100 / 58. 48.100&#xA;I:   libavdevice    58. 11.101 / 58. 11.101&#xA;I:   libavfilter     7. 87.100 /  7. 87.100&#xA;I:   libswscale      5.  8.100 /  5.  8.100&#xA;I:   libswresample   3.  8.100 /  3.  8.100&#xA;I: Input #0, mov,mp4,m4a,3gp,3g2,mj2, from &#x27;iOS_footages_4_1627755471638.mp4&#x27;:&#xA;I:   Metadata:&#xA;I:     major_brand     : &#xA;I: qt  &#xA;I:     minor_version   : &#xA;I: 0&#xA;I:     compatible_brands: &#xA;I: qt  &#xA;I:     creation_time   : &#xA;I: 2021-07-31T18:17:18.000000Z&#xA;I:     com.apple.quicktime.author: &#xA;I: ReplayKitRecording&#xA;I:   Duration: &#xA;I: 00:03:34.00&#xA;I: , start: &#xA;I: 0.000000&#xA;I: , bitrate: &#xA;I: 2183 kb/s&#xA;I:     Stream #0:0&#xA;I: (und)&#xA;I: : Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 37 kb/s&#xA;I:  (default)&#xA;I:     Metadata:&#xA;I:       creation_time   : &#xA;I: 2021-07-31T18:17:18.000000Z&#xA;I:       handler_name    : &#xA;I: Core Media Audio&#xA;I:     Stream #0:1&#xA;I: (und)&#xA;I: : Video: h264 (avc1 / 0x31637661), yuvj420p(pc, bt709), 592x1280, 2139 kb/s&#xA;I: , &#xA;I: 38.89 fps, &#xA;I: 59.94 tbr, &#xA;I: 600 tbn, &#xA;I: 1200 tbc&#xA;I:  (default)&#xA;I:     Metadata:&#xA;I:       rotate          : &#xA;I: 270&#xA;I:       creation_time   : &#xA;I: 2021-07-31T18:17:18.000000Z&#xA;I:       handler_name    : &#xA;I: Core Media Video&#xA;I:       encoder         : &#xA;I: H.264&#xA;I:     Side data:&#xA;I:       &#xA;I: displaymatrix: rotation of 90.00 degrees&#xA;W: Codec AVOption preset (Configuration preset) specified for output file #0 (TilePartOne_1628829753.mp4) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.&#xA;I: Stream mapping:&#xA;I:   Stream #0:1 -> #0:0&#xA;I:  (h264 (native) -> mpeg4 (native))&#xA;I:   Stream #0:0 -> #0:1&#xA;I:  (aac (native) -> aac (native))&#xA;I: Press [q] to stop, [?] for help&#xA;I: frame=    0 fps=0.0 q=0.0 size=       0kB time=-577014:32:22.77 bitrate=  -0.0kbits/s speed=N/A    &#xA;W: [graph 0 input from stream 0:1 @ 0xedd7fca0] sws_param option is deprecated and ignored&#xA;W: [swscaler @ 0xb645a800] deprecated pixel format used, make sure you did set range correctly&#xA;I: frame=    0 fps=0.0 q=0.0 size=       0kB time=-577014:32:22.77 bitrate=  -0.0kbits/s speed=N/A    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;E: Couldn&#x27;t load memtrack module&#xA;W: failed to get memory consumption info: -1&#xA;I: Output #0, mp4, to &#x27;TilePartOne_1628829753.mp4&#x27;:&#xA;I:   Metadata:&#xA;I:     major_brand     : &#xA;I: qt  &#xA;I:     minor_version   : &#xA;I: 0&#xA;I:     compatible_brands: &#xA;I: qt  &#xA;I:     com.apple.quicktime.author: &#xA;I: ReplayKitRecording&#xA;I:     encoder         : &#xA;I: Lavf58.48.100&#xA;I:     Stream #0:0&#xA;I: (und)&#xA;I: : Video: mpeg4 (mp4v / 0x7634706D), yuv420p(progressive), 1280x592, q=2-31, 200 kb/s&#xA;I: , &#xA;I: 24 fps, &#xA;I: 12288 tbn, &#xA;I: 24 tbc&#xA;I:  (default)&#xA;I:     Metadata:&#xA;I:       encoder         : &#xA;I: Lavc58.96.100 mpeg4&#xA;I:       creation_time   : &#xA;I: 2021-07-31T18:17:18.000000Z&#xA;I:       handler_name    : &#xA;I: Core Media Video&#xA;I:     Side data:&#xA;I:       &#xA;I: cpb: &#xA;I: bitrate max/min/avg: 0/0/200000 buffer size: 0 &#xA;I: vbv_delay: N/A&#xA;I:       &#xA;I: displaymatrix: rotation of -0.00 degrees&#xA;I:     Stream #0:1&#xA;I: (und)&#xA;I: : Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s&#xA;I:  (default)&#xA;I:     Metadata:&#xA;I:       creation_time   : &#xA;I: 2021-07-31T18:17:18.000000Z&#xA;I:       handler_name    : &#xA;I: Core Media Audio&#xA;I:       encoder         : &#xA;I: Lavc58.96.100 aac&#xA;I: frame=    6 fps=6.0 q=5.8 size=       0kB time=00:00:00.20 bitrate=   1.7kbits/s speed=0.208x    &#xA;I: frame=   28 fps= 18 q=31.0 size=       0kB time=00:00:01.12 bitrate=   0.3kbits/s dup=0 drop=3 speed=0.736x    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=   44 fps= 22 q=31.0 size=       0kB time=00:00:01.79 bitrate=   0.2kbits/s dup=0 drop=15 speed=0.881x    &#xA;I: frame=   63 fps= 25 q=31.0 size=       0kB time=00:00:02.58 bitrate=   0.1kbits/s dup=0 drop=18 speed=1.01x    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=   72 fps= 24 q=31.0 size=     256kB time=00:00:02.95 bitrate= 709.0kbits/s dup=0 drop=19 speed=0.968x    &#xA;I: frame=   72 fps= 21 q=31.0 Lsize=     448kB time=00:00:03.01 bitrate=1215.1kbits/s dup=0 drop=19 speed=0.873x    &#xA;I: video:398kB audio:47kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: &#xA;I: 0.696200%&#xA;I: Start video: 0 : 674967468&#xA;I: [aac @ 0xb8c6e400] Qavg: 667.684&#xA;I: End Video Query: [-i, iOS_footages_4_1627755471638.mp4, -ss, 00:00:05, -to, 00:00:08, -s, 1280x592, -r, 24, -preset, ultrafast, TilePartTwo_1628829756.mp4]&#xA;I: ffmpeg version v4.4-dev-416&#xA;I:  Copyright (c) 2000-2020 the FFmpeg developers&#xA;I:   built with Android (6454773 based on r365631c2) clang version 9.0.8 (https://android.googlesource.com/toolchain/llvm-project 98c855489587874b2a325e7a516b99d838599c6f) (based on LLVM 9.0.8svn)&#xA;I:   configuration: --cross-prefix=i686-linux-android- --sysroot=/files/android-sdk/ndk/21.3.6528147/toolchains/llvm/prebuilt/linux-x86_64/sysroot --prefix=/home/taner/Projects/mobile-ffmpeg/prebuilt/android-x86/ffmpeg --pkg-config=/usr/bin/pkg-config --enable-version3 --arch=i686 --cpu=i686 --cc=i686-linux-android16-clang --cxx=i686-linux-android16-clang&#x2B;&#x2B; --extra-libs=&#x27;-L/home/taner/Projects/mobile-ffmpeg/prebuilt/android-x86/cpu-features/lib -lndk_compat&#x27; --target-os=android --disable-neon --disable-asm --disable-inline-asm --enable-cross-compile --enable-pic --enable-jni --enable-optimizations --enable-swscale --enable-shared --enable-v4l2-m2m --disable-outdev=fbdev --disable-indev=fbdev --enable-small --disable-openssl --disable-xmm-clobber-test --disable-debug --enable-lto --disable-neon-clobber-test --disable-programs --disable-postproc --disable-doc --disable-htmlpages --disable-manpages --disable-podpages --disable-txtpages --disable-static --disable-sndio --disable-schannel --disable-securetransport --disable-xlib --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --disable-videotoolbox --disable-audiotoolbox --disable-appkit --disable-alsa --disable-cuda --disable-cuvid --disable-nvenc --disable-vaapi --disable-vdpau --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-gmp --enable-gnutls --enable-libmp3lame --enable-libass --enable-iconv --enable-libtheora --enable-libvorbis --enable-libvpx --enable-libwebp --enable-libxml2 --enable-libopencore-amrnb --enable-libshine --enable-libspeex --enable-libwavpack --enable-libkvazaar --enable-libilbc --enable-libopus --enable-libsnappy --enable-libsoxr --enable-libaom --enable-libtwolame --disable-sdl2 --enable-libvo-amrwbenc --enable-zlib --enable-mediacodec&#xA;I:   libavutil      56. 55.100 / 56. 55.100&#xA;I:   libavcodec     58. 96.100 / 58. 96.100&#xA;I:   libavformat    58. 48.100 / 58. 48.100&#xA;I:   libavdevice    58. 11.101 / 58. 11.101&#xA;I:   libavfilter     7. 87.100 /  7. 87.100&#xA;I:   libswscale      5.  8.100 /  5.  8.100&#xA;I:   libswresample   3.  8.100 /  3.  8.100&#xA;I: Input #0, mov,mp4,m4a,3gp,3g2,mj2, from &#x27;iOS_footages_4_1627755471638.mp4&#x27;:&#xA;I:   Metadata:&#xA;I:     major_brand     : &#xA;I: qt  &#xA;I:     minor_version   : &#xA;I: 0&#xA;I:     compatible_brands: &#xA;I: qt  &#xA;I:     creation_time   : &#xA;I: 2021-07-31T18:17:18.000000Z&#xA;I:     com.apple.quicktime.author: &#xA;I: ReplayKitRecording&#xA;I:   Duration: &#xA;I: 00:03:34.00&#xA;I: , start: &#xA;I: 0.000000&#xA;I: , bitrate: &#xA;I: 2183 kb/s&#xA;I:     Stream #0:0&#xA;I: (und)&#xA;I: : Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 37 kb/s&#xA;I:  (default)&#xA;I:     Metadata:&#xA;I:       creation_time   : &#xA;I: 2021-07-31T18:17:18.000000Z&#xA;I:       handler_name    : &#xA;I: Core Media Audio&#xA;I:     Stream #0:1&#xA;I: (und)&#xA;I: : Video: h264 (avc1 / 0x31637661), yuvj420p(pc, bt709), 592x1280, 2139 kb/s&#xA;I: , &#xA;I: 38.89 fps, &#xA;I: 59.94 tbr, &#xA;I: 600 tbn, &#xA;I: 1200 tbc&#xA;I:  (default)&#xA;I:     Metadata:&#xA;I:       rotate          : &#xA;I: 270&#xA;I:       creation_time   : &#xA;I: 2021-07-31T18:17:18.000000Z&#xA;I:       handler_name    : &#xA;I: Core Media Video&#xA;I:       encoder         : &#xA;I: H.264&#xA;I:     Side data:&#xA;I:       &#xA;I: displaymatrix: rotation of 90.00 degrees&#xA;W: Codec AVOption preset (Configuration preset) specified for output file #0 (TilePartTwo_1628829756.mp4) has not been used for any stream. The most likely reason is either wrong type (e.g. a video option with no video streams) or that it is a private option of some encoder which was not actually used for any stream.&#xA;I: Stream mapping:&#xA;I:   Stream #0:1 -> #0:0&#xA;I:  (h264 (native) -> mpeg4 (native))&#xA;I:   Stream #0:0 -> #0:1&#xA;I:  (aac (native) -> aac (native))&#xA;I: Press [q] to stop, [?] for help&#xA;W: [graph 0 input from stream 0:1 @ 0xe2c97860] sws_param option is deprecated and ignored&#xA;W: [swscaler @ 0xb5d28a80] deprecated pixel format used, make sure you did set range correctly&#xA;I: frame=    0 fps=0.0 q=0.0 size=       0kB time=-577014:32:22.77 bitrate=  -0.0kbits/s speed=N/A    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=    0 fps=0.0 q=0.0 size=       0kB time=-577014:32:22.77 bitrate=  -0.0kbits/s speed=N/A    &#xA;I: Output #0, mp4, to &#x27;TilePartTwo_1628829756.mp4&#x27;:&#xA;I:   Metadata:&#xA;I:     major_brand     : &#xA;I: qt  &#xA;I:     minor_version   : &#xA;I: 0&#xA;I:     compatible_brands: &#xA;I: qt  &#xA;I:     com.apple.quicktime.author: &#xA;I: ReplayKitRecording&#xA;I:     encoder         : &#xA;I: Lavf58.48.100&#xA;I:     Stream #0:0&#xA;I: (und)&#xA;I: : Video: mpeg4 (mp4v / 0x7634706D), yuv420p, 1280x592, q=2-31, 200 kb/s&#xA;I: , &#xA;I: 24 fps, &#xA;I: 12288 tbn, &#xA;I: 24 tbc&#xA;I:  (default)&#xA;I:     Metadata:&#xA;I:       encoder         : &#xA;I: Lavc58.96.100 mpeg4&#xA;I:       creation_time   : &#xA;I: 2021-07-31T18:17:18.000000Z&#xA;I:       handler_name    : &#xA;I: Core Media Video&#xA;I:     Side data:&#xA;I:       &#xA;I: cpb: &#xA;I: bitrate max/min/avg: 0/0/200000 buffer size: 0 &#xA;I: vbv_delay: N/A&#xA;I:       &#xA;I: displaymatrix: rotation of -0.00 degrees&#xA;I:     Stream #0:1&#xA;I: (und)&#xA;I: : Audio: aac (mp4a / 0x6134706D), 44100 Hz, stereo, fltp, 128 kb/s&#xA;I:  (default)&#xA;I:     Metadata:&#xA;I:       creation_time   : &#xA;I: 2021-07-31T18:17:18.000000Z&#xA;I:       handler_name    : &#xA;I: Core Media Audio&#xA;I:       encoder         : &#xA;I: Lavc58.96.100 aac&#xA;I: frame=    0 fps=0.0 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A speed=   0x    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=    0 fps=0.0 q=0.0 size=       0kB time=00:00:00.00 bitrate=N/A speed=   0x    &#xA;I: frame=   10 fps=4.9 q=18.5 size=       0kB time=00:00:00.37 bitrate=   0.9kbits/s speed=0.183x    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=   31 fps= 12 q=31.0 size=       0kB time=00:00:01.25 bitrate=   0.3kbits/s dup=0 drop=2 speed=0.491x    &#xA;I: frame=   52 fps= 17 q=31.0 size=       0kB time=00:00:02.12 bitrate=   0.2kbits/s dup=0 drop=5 speed=0.692x    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=   72 fps= 20 q=31.0 size=       0kB time=00:00:02.95 bitrate=   0.1kbits/s dup=0 drop=7 speed=0.827x    &#xA;I: frame=   72 fps= 18 q=31.0 size=     256kB time=00:00:02.95 bitrate= 709.0kbits/s dup=0 drop=7 speed=0.725x    &#xA;E: gnssSvStatusCb: a: input svInfo.flags is 8&#xA;E: gnssSvStatusCb: b: input svInfo.flags is 8&#xA;I: frame=   72 fps= 16 q=31.0 Lsize=     543kB time=00:00:03.01 bitrate=1472.6kbits/s dup=0 drop=7 speed=0.689x    &#xA;I: video:493kB audio:47kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: &#xA;I: 0.573798%&#xA;I: [aac @ 0xc2f20000] Qavg: 669.561&#xA;I: Movie paths: [CountImageVideo_1628829749.mp4, TilePartTwo_1628829756.mp4, FootageVideo_1628829747.mp4]&#xA;    &#xA;    --------- beginning of crash&#xA;E: FATAL EXCEPTION: Thread-8&#xA;    Process: com.wev.app, PID: 21310&#xA;    java.io.IOException: Cannot merge VisualSampleEntry[com.googlecode.mp4parser.boxes.mp4.ESDescriptorBox@ed48a2a8] and VisualSampleEntry[com.googlecode.mp4parser.boxes.mp4.ESDescriptorBox@dc387090]&#xA;        at com.googlecode.mp4parser.authoring.tracks.AppendTrack.mergeStsds(AppendTrack.java:116)&#xA;        at com.googlecode.mp4parser.authoring.tracks.AppendTrack.<init>(AppendTrack.java:59)&#xA;        at Mp4Cutter2.combineClips(Mp4Cutter2.kt:208)&#xA;        at com.wev.app.ui.activity.videoplayer.PlayVideoActivity.finalVideoGenerate(PlayVideoActivity.kt:3457)&#xA;        at com.wev.app.ui.activity.videoplayer.PlayVideoActivity.endVideoCreate(PlayVideoActivity.kt:3383)&#xA;        at com.wev.app.ui.activity.videoplayer.PlayVideoActivity.startVideoCreate(PlayVideoActivity.kt:3298)&#xA;        at com.wev.app.ui.activity.videoplayer.PlayVideoActivity.countImageToVideo(PlayVideoActivity.kt:3220)&#xA;        at com.wev.app.ui.activity.videoplayer.PlayVideoActivity.imageToVideo(PlayVideoActivity.kt:3158)&#xA;        at com.wev.app.ui.activity.videoplayer.PlayVideoActivity$createWev$1$getVideo$imageToVideo$1.run(PlayVideoActivity.kt:3056)&#xA;    &#xA;</init>

    &#xA;