Recherche avancée

Médias (0)

Mot : - Tags -/diogene

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

Autres articles (108)

  • XMP PHP

    13 mai 2011, par

    Dixit Wikipedia, XMP signifie :
    Extensible Metadata Platform ou XMP est un format de métadonnées basé sur XML utilisé dans les applications PDF, de photographie et de graphisme. Il a été lancé par Adobe Systems en avril 2001 en étant intégré à la version 5.0 d’Adobe Acrobat.
    Étant basé sur XML, il gère un ensemble de tags dynamiques pour l’utilisation dans le cadre du Web sémantique.
    XMP permet d’enregistrer sous forme d’un document XML des informations relatives à un fichier : titre, auteur, historique (...)

  • 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 ;

  • Support de tous types de médias

    10 avril 2011

    Contrairement à beaucoup de logiciels et autres plate-formes modernes de partage de documents, MediaSPIP a l’ambition de gérer un maximum de formats de documents différents qu’ils soient de type : images (png, gif, jpg, bmp et autres...) ; audio (MP3, Ogg, Wav et autres...) ; vidéo (Avi, MP4, Ogv, mpg, mov, wmv et autres...) ; contenu textuel, code ou autres (open office, microsoft office (tableur, présentation), web (html, css), LaTeX, Google Earth) (...)

Sur d’autres sites (4329)

  • How HSBC and ING are transforming banking with AI

    9 novembre 2024, par Daniel Crough — Banking and Financial Services, Featured Banking Content

    We recently partnered with FinTech Futures to produce an exciting webinar discussing how analytics leaders from two global banks are using AI to protect customers, streamline operations, and support environmental goals.

    Watch the on-demand webinar : Advancing analytics maturity.

    By providing your email and clicking “submit”, you agree to receive direct marketing materials relating to Matomo products and services, surveys, information about events, publications and promotions. You can unsubscribe at any time by clicking the opt-out link provided in each communication. We will process your personal information in accordance with our Privacy Policy.

    <script>document.getElementById( "ak_js_3" ).setAttribute( "value", ( new Date() ).getTime() );</script>

    &lt;script&gt;<br />
    gform.initializeOnLoaded( function() {gformInitSpinner( 71, 'https://matomo.org/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_71').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') &gt;= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_71');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_71').length &gt; 0;var is_redirect = contents.indexOf('gformRedirect(){') &gt;= 0;var is_form = form_content.length &gt; 0 &amp;&amp; ! is_redirect &amp;&amp; ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_71').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_71').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_71').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_71').val();gformInitSpinner( 71, 'https://matomo.org/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [71, current_page]);window['gf_submitting_71'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_71').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [71]);window['gf_submitting_71'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_71').text());}, 50);}else{jQuery('#gform_71').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger(&quot;gform_pre_post_render&quot;, [{ formId: &quot;71&quot;, currentPage: &quot;current_page&quot;, abort: function() { this.preventDefault(); } }]);                if (event.defaultPrevented) {                return;         }        const gformWrapperDiv = document.getElementById( &quot;gform_wrapper_71&quot; );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( &quot;span&quot; );            visibilitySpan.id = &quot;gform_visibility_test_71&quot;;            gformWrapperDiv.insertAdjacentElement( &quot;afterend&quot;, visibilitySpan );        }        const visibilityTestDiv = document.getElementById( &quot;gform_visibility_test_71&quot; );        let postRenderFired = false;                function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            jQuery( document ).trigger( 'gform_post_render', [71, current_page] );            gform.utils.trigger( { event: 'gform/postRender', native: false, data: { formId: 71, currentPage: current_page } } );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate &amp;&amp; !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv &amp;&amp; visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) =&gt; {                mutations.forEach( ( mutation ) =&gt; {                    if ( mutation.type === 'attributes' &amp;&amp; visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );<br />
    &lt;/script&gt;

    Meet the expert panel

    Roshini Johri heads ESG Analytics at HSBC, where she leads AI and remote sensing applications supporting the bank’s net zero goals. Her expertise spans climate tech and financial services, with a focus on scalable analytics solutions.

     

    Marco Li Mandri leads Advanced Analytics Strategy at ING, where he focuses on delivering high-impact solutions and strengthening analytics foundations. His background combines analytics, KYC operations, and AI strategy.

     

    Carmen Soini Tourres works as a Web Analyst Consultant at Matomo, helping financial organisations optimise their digital presence whilst maintaining privacy compliance.

     

    Key findings from the webinar

    The discussion highlighted four essential elements for advancing analytics capabilities :

    1. Strong data foundations matter most

    “It doesn’t matter how good the AI model is. It is garbage in, garbage out,”

    Johri explained. Banks need robust data governance that works across different regulatory environments.

    2. Transform rather than tweak

    Li Mandri emphasised the need to reconsider entire processes :

    “We try to look at the banking domain and processes and try to re-imagine how they should be done with AI.”

    3. Bridge technical and business understanding

    Both leaders stressed the value of analytics translators who understand both technology and business needs.

    “We’re investing in this layer we call product leads,”

    Li Mandri explained. These roles combine technical knowledge with business acumen – a rare but vital skill set.

    4. Consider production costs early

    Moving from proof-of-concept to production requires careful planning. As Johri noted :

    “The scale of doing things in production is quite massive and often doesn’t get accounted for in the cost.”

    This includes :

    • Ongoing monitoring requirements
    • Maintenance needs
    • Regulatory compliance checks
    • Regular model updates

    Real-world applications

    ING’s approach demonstrates how banks can transform their operations through thoughtful AI implementation. Li Mandri shared several areas where the bank has successfully deployed analytics solutions, each benefiting both the bank and its customers.

    Customer experience enhancement

    The bank’s implementation of AI-powered instant loan processing shows how analytics can transform traditional banking.

    “We know AI can make loans instant for the customer, that’s great. Clicking one button and adding a loan, that really changes things,”

    Li Mandri explained. This goes beyond automation – it represents a fundamental shift in how banks serve their customers.

    The system analyses customer data to make rapid lending decisions while maintaining strong risk assessment standards. For customers, this means no more lengthy waiting periods or complex applications. For the bank, it means more efficient resource use and better risk management.

    The bank also uses AI to personalise customer communications.

    “We’re using that to make certain campaigns more personalised, having a certain tone of voice,”

    noted Li Mandri. This particularly resonates with younger customers who expect relevant, personalised interactions from their bank.

    Operational efficiency transformation

    ING’s approach to Know Your Customer (KYC) processes shows how AI can transform resource-heavy operations.

    “KYC is a big area of cost for the bank. So we see massive value there, a lot of scale,”

    Li Mandri explained. The bank developed an AI-powered system that :

    • Automates document verification
    • Flags potential compliance issues for human review
    • Maintains consistent standards across jurisdictions
    • Reduces processing time while improving accuracy

    This implementation required careful consideration of regulations across different markets. The bank developed monitoring systems to ensure their AI models maintain high accuracy while meeting compliance standards.

    In the back office, ING uses AI to extract and process data from various documents, significantly reducing manual work. This automation lets staff focus on complex tasks requiring human judgment.

    Sustainable finance initiatives

    ING’s commitment to sustainable banking has driven innovative uses of AI in environmental assessment.

    “We have this ambition to be a sustainable bank. If you want to be a sustainable finance customer, that requires a lot of work to understand who the company is, always comparing against its peers.”

    The bank developed AI models that :

    • Analyse company sustainability metrics
    • Compare environmental performance against industry benchmarks
    • Assess transition plans for high-emission industries
    • Monitor ongoing compliance with sustainability commitments

    This system helps staff evaluate the environmental impact of potential deals quickly and accurately.

    “We are using AI there to help our frontline process customers to see how green that deal might be and then use that as a decision point,”

    Li Mandri noted.

    HSBC’s innovative approach

    Under Johri’s leadership, HSBC has developed several groundbreaking uses of AI and analytics, particularly in environmental monitoring and operational efficiency. Their work shows how banks can use advanced technology to address complex global challenges while meeting regulatory requirements.

    Environmental monitoring through advanced technology

    HSBC uses computer vision and satellite imagery analysis to measure environmental impact with new precision.

    “This is another big research area where we look at satellite images and we do what is called remote sensing, which is the study of a remote area,”

    Johri explained.

    The system provides several key capabilities :

    • Analysis of forest coverage and deforestation rates
    • Assessment of biodiversity impact in specific regions
    • Monitoring of environmental changes over time
    • Measurement of environmental risk in lending portfolios

    “We can look at distant images of forest areas and understand how much percentage deforestation is being caused in that area, and we can then measure our biodiversity impact more accurately,”

    Johri noted. This technology enables HSBC to :

    • Make informed lending decisions
    • Monitor environmental commitments of borrowers
    • Support sustainability-linked lending programmes
    • Provide accurate environmental impact reporting

    Transforming document analysis

    HSBC is tackling one of banking’s most time-consuming challenges : processing vast amounts of documentation.

    “Can we reduce the onus of human having to go and read 200 pages of sustainability reports each time to extract answers ?”

    Johri asked. Their solution combines several AI technologies to make this process more efficient while maintaining accuracy.

    The bank’s approach includes :

    • Natural language processing to understand complex documents
    • Machine learning models to extract relevant information
    • Validation systems to ensure accuracy
    • Integration with existing compliance frameworks

    “We’re exploring solutions to improve our reporting, but we need to do it in a safe, robust and transparent way.”

    This careful balance between efficiency and accuracy exemplifies HSBC’s approach to AI.

    Building future-ready analytics capabilities

    Both banks emphasise that successful analytics requires a comprehensive, long-term approach. Their experiences highlight several critical considerations for financial institutions looking to advance their analytics capabilities.

    Developing clear governance frameworks

    “Understanding your AI risk appetite is crucial because banking is a highly regulated environment,”

    Johri emphasised. Banks need to establish governance structures that :

    • Define acceptable uses for AI
    • Establish monitoring and control mechanisms
    • Ensure compliance with evolving regulations
    • Maintain transparency in AI decision-making

    Creating solutions that scale

    Li Mandri stressed the importance of building systems that grow with the organisation :

    “When you try to prototype a model, you have to take care about the data safety, ethical consideration, you have to identify a way to monitor that model. You need model standard governance.”

    Successful scaling requires :

    • Standard approaches to model development
    • Clear evaluation frameworks
    • Simple processes for model updates
    • Strong monitoring systems
    • Regular performance reviews

    Investing in people and skills

    Both leaders highlighted how important skilled people are to analytics success.

    “Having a good hiring strategy as well as creating that data literacy is really important,”

    Johri noted. Banks need to :

    • Develop comprehensive training programmes
    • Create clear career paths for analytics professionals
    • Foster collaboration between technical and business teams
    • Build internal expertise in emerging technologies

    Planning for the future

    Looking ahead, both banks are preparing for increased regulation and growing demands for transparency. Key focus areas include :

    • Adapting to new privacy regulations
    • Making AI decisions more explainable
    • Improving data quality and governance
    • Strengthening cybersecurity measures

    Practical steps for financial institutions

    The experiences shared by HSBC and ING provide valuable insights for financial institutions at any stage of their analytics journey. Their successes and challenges outline a clear path forward.

    Key steps for success

    Financial institutions looking to enhance their analytics capabilities should :

    1. Start with strong foundations
      • Invest in clear data governance frameworks
      • Set data quality standards
      • Build thorough documentation processes
      • Create transparent data tracking
    2. Think strategically about AI implementation
      • Focus on transformative rather than small changes
      • Consider the full costs of AI projects
      • Build solutions that can grow
      • Balance innovation with risk management
    3. Invest in people and processes
      • Develop internal analytics expertise
      • Create clear paths for career growth
      • Foster collaboration between technical and business teams
      • Build a culture of data literacy
    4. Plan for scale
      • Establish monitoring systems
      • Create governance frameworks
      • Develop standard approaches to model development
      • Stay flexible for future regulatory changes

    Learn more

    Want to hear more insights from these industry leaders ? Watch the complete webinar recording on demand. You’ll learn :

    • Detailed technical insights from both banks
    • Extended Q&A with the speakers
    • Additional case studies and examples
    • Practical implementation advice
     
     

    Lorem ipsum dolor sit amet, consectetur adipiscing elit. Ut elit tellus, luctus nec ullamcorper mattis, pulvinar dapibus leo.

    Watch the on-demand webinar : Advancing analytics maturity.

    By providing your email and clicking “submit”, you agree to receive direct marketing materials relating to Matomo products and services, surveys, information about events, publications and promotions. You can unsubscribe at any time by clicking the opt-out link provided in each communication. We will process your personal information in accordance with our Privacy Policy.

    &lt;script&gt;document.getElementById( &quot;ak_js_4&quot; ).setAttribute( &quot;value&quot;, ( new Date() ).getTime() );&lt;/script&gt;

    &lt;script&gt;<br />
    gform.initializeOnLoaded( function() {gformInitSpinner( 71, 'https://matomo.org/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery('#gform_ajax_frame_71').on('load',function(){var contents = jQuery(this).contents().find('*').html();var is_postback = contents.indexOf('GF_AJAX_POSTBACK') &gt;= 0;if(!is_postback){return;}var form_content = jQuery(this).contents().find('#gform_wrapper_71');var is_confirmation = jQuery(this).contents().find('#gform_confirmation_wrapper_71').length &gt; 0;var is_redirect = contents.indexOf('gformRedirect(){') &gt;= 0;var is_form = form_content.length &gt; 0 &amp;&amp; ! is_redirect &amp;&amp; ! is_confirmation;var mt = parseInt(jQuery('html').css('margin-top'), 10) + parseInt(jQuery('body').css('margin-top'), 10) + 100;if(is_form){jQuery('#gform_wrapper_71').html(form_content.html());if(form_content.hasClass('gform_validation_error')){jQuery('#gform_wrapper_71').addClass('gform_validation_error');} else {jQuery('#gform_wrapper_71').removeClass('gform_validation_error');}setTimeout( function() { /* delay the scroll by 50 milliseconds to fix a bug in chrome */  }, 50 );if(window['gformInitDatepicker']) {gformInitDatepicker();}if(window['gformInitPriceFields']) {gformInitPriceFields();}var current_page = jQuery('#gform_source_page_number_71').val();gformInitSpinner( 71, 'https://matomo.org/wp-content/plugins/gravityforms/images/spinner.svg', true );jQuery(document).trigger('gform_page_loaded', [71, current_page]);window['gf_submitting_71'] = false;}else if(!is_redirect){var confirmation_content = jQuery(this).contents().find('.GF_AJAX_POSTBACK').html();if(!confirmation_content){confirmation_content = contents;}setTimeout(function(){jQuery('#gform_wrapper_71').replaceWith(confirmation_content);jQuery(document).trigger('gform_confirmation_loaded', [71]);window['gf_submitting_71'] = false;wp.a11y.speak(jQuery('#gform_confirmation_message_71').text());}, 50);}else{jQuery('#gform_71').append(contents);if(window['gformRedirect']) {gformRedirect();}}jQuery(document).trigger(&quot;gform_pre_post_render&quot;, [{ formId: &quot;71&quot;, currentPage: &quot;current_page&quot;, abort: function() { this.preventDefault(); } }]);                if (event.defaultPrevented) {                return;         }        const gformWrapperDiv = document.getElementById( &quot;gform_wrapper_71&quot; );        if ( gformWrapperDiv ) {            const visibilitySpan = document.createElement( &quot;span&quot; );            visibilitySpan.id = &quot;gform_visibility_test_71&quot;;            gformWrapperDiv.insertAdjacentElement( &quot;afterend&quot;, visibilitySpan );        }        const visibilityTestDiv = document.getElementById( &quot;gform_visibility_test_71&quot; );        let postRenderFired = false;                function triggerPostRender() {            if ( postRenderFired ) {                return;            }            postRenderFired = true;            jQuery( document ).trigger( 'gform_post_render', [71, current_page] );            gform.utils.trigger( { event: 'gform/postRender', native: false, data: { formId: 71, currentPage: current_page } } );            if ( visibilityTestDiv ) {                visibilityTestDiv.parentNode.removeChild( visibilityTestDiv );            }        }        function debounce( func, wait, immediate ) {            var timeout;            return function() {                var context = this, args = arguments;                var later = function() {                    timeout = null;                    if ( !immediate ) func.apply( context, args );                };                var callNow = immediate &amp;&amp; !timeout;                clearTimeout( timeout );                timeout = setTimeout( later, wait );                if ( callNow ) func.apply( context, args );            };        }        const debouncedTriggerPostRender = debounce( function() {            triggerPostRender();        }, 200 );        if ( visibilityTestDiv &amp;&amp; visibilityTestDiv.offsetParent === null ) {            const observer = new MutationObserver( ( mutations ) =&gt; {                mutations.forEach( ( mutation ) =&gt; {                    if ( mutation.type === 'attributes' &amp;&amp; visibilityTestDiv.offsetParent !== null ) {                        debouncedTriggerPostRender();                        observer.disconnect();                    }                });            });            observer.observe( document.body, {                attributes: true,                childList: false,                subtree: true,                attributeFilter: [ 'style', 'class' ],            });        } else {            triggerPostRender();        }    } );} );<br />
    &lt;/script&gt;
  • Six Best Amplitude Alternatives

    10 décembre 2024, par Daniel Crough

    Product analytics is big business. Gone are the days when we could only guess what customers were doing with our products or services. Now, we can track, visualise, and analyse how they interact with them and, with that, constantly improve and optimise. 

    The problem is that many product analytics tools are expensive and complicated — especially for smaller businesses. They’re also packed with functionality more attuned to the needs of massive companies. 

    Amplitude is such a tool. It’s brilliant and it has all the bells and whistles that you’ll probably never need. Fortunately, there are alternatives. In this guide, we’ll explore the best of those alternatives and, along the way, provide the insight you’ll need to select the best analytics tool for your organisation. 

    Amplitude : a brief overview

    To set the stage, it makes sense to understand exactly what Amplitude offers. It’s a real-time data analytics tool for tracking user actions and gaining insight into engagement, retention, and revenue drivers. It helps you analyse that data and find answers to questions about what happened, why it happened, and what to do next.

    However, as good as Amplitude is, it has some significant disadvantages. While it does offer data export functionality, that seems deliberately restricted. It allows data exports for specific events, but it’s not possible to export complete data sets to manipulate or format in another tool. Even pulling it into a CSV file has a 10,000-row limit. There is an API, but not many third-party integration options.

    Getting data in can also be a problem. Amplitude requires manual tags on events that must be tracked for analysis, which can leave holes in the data if every possible subsequent action isn’t tagged. That’s a time-consuming exercise, and it’s made worse because those tags will have to be updated every time the website or app is updated. 

    As good as it is, it can also be overwhelming because it’s stacked with features that can create confusion for novice or inexperienced analysts. It’s also expensive. There is a freemium plan that limits functionality and events. Still, when an organisation wants to upgrade for additional functionality or to analyse more events, the step up to the paid plan is massive.

    Lastly, Amplitude has made some strides towards being a web analytics option, but it lacks some basic functionality that may frustrate people who are trying to see the full picture from web to app.

    Snapshot of Amplitude alternatives

    So, in place of Amplitude, what product analytics tools are available that won’t break the bank and still provide the functionality needed to improve your product ? The good news is that there are literally hundreds of alternatives, and we’ve picked out six of the best.

    1. Matomo – Best privacy-focused web and mobile analytics
    2. Mixpanel – Best for product analytics
    3. Google Analytics – Best free option
    4. Adobe Analytics – Best for predictive analytics
    5. Umami – Best lightweight tool for product analytics
    6. Heap – Best for automatic user data capture

    A more detailed analysis of the Amplitude alternatives

    Now, let’s dive deeper into each of the six Amplitude alternatives. We’ll cover standout features, integrations, pricing, use cases and community critiques. By the end, you’ll know which analytics tool can help optimise website and app performance to grow your business.

    1. Matomo – Best privacy-friendly web and app analytics

    Privacy is a big concern these days, especially for organisations with a presence in the European Union (EU). Unlike other analytics tools, Matomo ensures you comply with privacy laws and regulations, like the General Data Protection Regulation (GDPR) and California’s Consumer Privacy Act (CCPA).

    Matomo helps businesses get the insights they need without compromising user privacy. It’s also one of the few self-hosted tools, ensuring data never has to leave your site.

    Matomo is open-source, which is also rare in this class of tools. That means it’s available for anyone to adapt and customise as they wish. Everything you need to build custom APIs is there.

    Image showing the origin of website traffic.
    The Locations page in Matomo shows the countries, continents, regions, and cities where website traffic originates.

    Its most useful capabilities include visitor logs and session recordings to trace the entire customer journey, spot drop-off points, and fine-tune sales funnels. The platform also comes with heatmaps and A/B testing tools. Heatmaps provide a useful visual representation of your data, while A/B testing allows for more informed, data-driven decisions.

    Despite its range of features, many reviewers laud Matomo’s user interface for its simplicity and user-friendliness. 

    Why Matomo : Matomo is an excellent alternative because it fills in the gaps where Amplitude comes up short, like with cookieless tracking. Also, while Amplitude focuses mainly on behavioural analytics, Matomo offers both behavioural and traditional analytics, which allows more profound insight into your data. Furthermore, Matomo fully complies with the strictest privacy regulations worldwide, including GDPR, LGPD, and HIPAA.

    Standout features include multi-touch attribution, visits log, content engagement, ecommerce, customer segments, event tracking, goal tracking, custom dimensions, custom reports, automated email reports, tag manager, sessions recordings, roll-up reporting that can pull data from multiple websites or mobile apps, Google Analytics importer, Matomo tag manager, comprehensive visitor tracking, heatmaps, and more.

    Integrations with 100+ technologies, including Cloudflare, WordPress, Magento, Google Ads, Drupal, WooCommerce, Vue, SharePoint and Wix.

    Pricing is free for Matomo On-Premise and $23 per month for Matomo Cloud, which comes with a 21-day free trial (no credit card required).

    Strengths

    • Privacy focused
    • Cookieless consent banners
    • 100% accurate, unsampled data
    • Open-source code 
    • Complete data ownership (no sharing with third parties)
    • Self-hosting and cloud-based options
    • Built-in GDPR Manager
    • Custom alerts, white labelling, dashboards and reports

    Community critiques 

    • Premium features are expensive and proprietary
    • Learning curve for non-technical users

    2. Mixpanel – Best for product analytics

    Mixpanel is a dedicated product analytics tool. It tracks and analyses customer interactions with a product across different platforms and helps optimise digital products to improve the user experience. It works with real-time data and can provide answers from customer and revenue data in seconds.

    It also presents data visualisations to show how customers interact with products.

    Screenshot reflecting useful customer trends

    Mixpanel allows you to play around filters and views to reveal and chart some useful customer trends. (Image source)

    Why Mixpanel : One of the strengths of this platform is the ability to test hypotheses. Need to test an ambitious idea ? Mixpanel data can do it with real user analytics. That allows you to make data-driven decisions to find the best path forward.

    Standout features include automatic funnel segment analysis, behavioural segmentation, cohort segmentation, collaboration support, customisable dashboards, data pipelines, filtered data views, SQL queries, warehouse connectors and a wide range of pre-built integrations.

    Integrations available include Appcues, AppsFlyer, AWS, Databox, Figma, Google Cloud, Hotjar, HubSpot, Intercom, Integromat, MailChimp, Microsoft Azure, Segment, Slack, Statsig, VWO, Userpilot, WebEngage, Zapier, ZOH) and dozens of others.

    Pricing starts with a freemium plan valid for up to 20 million events per month. The growth plan is affordable at $25 per month and adds features like no-code data transformations and data pipeline add-ons. The enterprise version runs at a monthly cost of $833 and provides the full suite of features and services and premium support.

    There’s a caveat. Those prices only allow up to 1,000 Monthly Tracked Users (MTUs), calculated based on the number of visitors that perform a qualifying event each month. Beyond that, MTU plans start at $20,000 per year.

    Strengths

    • User behaviour and interaction tracking
    • Unlimited cohort segmentation capabilities
    • Drop-off analysis showing where users get stuck
    • A/B testing capabilities

    Community critiques 

    • Expensive enterprise features
    • Extensive setup and configuration requirements

    3. Google Analytics 4 – Best free web analytics tool

    The first thing to know about Google Analytics 4 is that it’s a web analytics tool. In other words, it tracks sessions, not user behaviours in app environments. It can provide details on how people found your website and how they go there, but it doesn’t offer much detail on how people use your product. 

    There is also an enterprise version, Google Analytics 360, which is not free. We’ve broken down the differences between the two versions elsewhere.

    Image showing audience-related data provided by GA4

    GA4’s audience overview shows visitors, sessions, session lengths, bounce rates, and user engagement data. (Image source)

     

    Why Google Analytics : It’s great for gauging the effectiveness of marketing campaigns, tracking goal completions (purchases, cart additions, etc.) and spotting trends and patterns in user engagement.

    Standout features include built-in automation, customisable conversion goals, data drill-down functionality, detailed web acquisition metrics, media spend ROI calculations and out-of-the-box web analytics reporting.

    Integrations include all major CRM platforms, CallRail, DoubleClick DCM, Facebook, Hootsuite, Marketo, Shopify, VWO, WordPress, Zapier and Zendesk, among many others.

    Pricing is free for the basic version (Google Analytics 4) and scales based on features and data volume. The advanced features (in Google Analytics 360) are pitched at enterprises, and pricing is custom.

    Strengths

    • Free to start
    • Multiple website management
    • Traffic source details
    • Up-to-date traffic data

    Community critiques 

    • Steep learning curve 
    • Data sampling

    4. Adobe Analytics – Best for predictive analytics

    A fully configured Adobe Analytics implementation is the Swiss army knife of analytics tools. It begins with web analytics, adds product analytics, and then wraps it up nicely with predictive analytics.

    Unlike all the Amplitude alternatives here, there’s no free version. Adobe Analytics has a complicated pricing matrix with options like website analytics, marketing analytics, attribution, and predictive analytics. It also has a wide range of customisation options that will appeal to large businesses. But for smaller organisations, it may all be a bit too much.

    Mixpanel allows you to play around filters and views to reveal and chart some useful customer trends. (Image source)

    Screenshot categorising online orders by marketing channel

    Adobe Analytics’ cross-channel attribution ties actions from different channels into a single customer journey. (Image source)

     

    Why Adobe Analytics : For current Adobe customers, this is a logical next step. Either way, Adobe Analytics can combine, evaluate, and analyse data from any part of the customer journey. It analyses that data with predictive intelligence to provide insights to enhance customer experiences.

     

    Standout features include AI-powered prediction analysis, attribution analysis, multi-channel data collection, segmentation and detailed customer journey analytics, product analytics and web analytics.

     

    Integrations are available through the Adobe Experience Cloud Exchange. Adobe Analytics also supports data exchange with brands such as BrightEdge, Branch.io, Google Ads, Hootsuite, Invoca, Salesforce and over 200 other integrations.

     

    Pricing starts at $500 monthly, but prospective customers are encouraged to contact the company for a needs-based quotation.

     

    Strengths

    • Drag-and-drop interface
    • Flexible segmentation 
    • Easy-to-create conversion funnels
    • Threshold-based alerts and notifications

    Community critiques 

    • No free version
    • Lack of technical support
    • Steep learning curve

    5. Umami – Best lightweight tool for web analytics

    The second of our open-source analytics solutions is Umami, a favourite in the software development community. Like Matomo, it’s a powerful and privacy-focused alternative that offers complete data control and respects user privacy. It’s also available as a cloud-based freemium plan or as a self-hosted solution.

     

    Image showing current user traffic and hourly traffic going back 24 hours

    Umami’s dashboard reveals the busiest times of day and which pages are visited when.(Image source)

     

    Why Umami : Unami has a clear and simple user interface (UI) that lets you measure important metrics such as page visits, referrers, and user agents. It also features event tracking, although some reviewers complain that it’s quite limited.

    Standout features can be summed up in five words : privacy, simplicity, lightweight, real-time, and open-source. Unami’s UI is clean, intuitive and modern, and it doesn’t slow down your website. 

    Integrations include plugins for VuePress, Gatsby, Craft CMS, Docusaurus, WordPress and Publii, and a module for Nuxt. Unami’s API communicates with Javascript, PHP Laravel and Python.

    Pricing is free for up to 100k monthly events and three websites, but with limited support and data retention restrictions. The Pro plan costs $20 a month and gives you unlimited websites and team members, a million events (plus $0.00002 for each event over that), five years of data and email support. Their Enterprise plan is priced custom.

    Strengths

    • Freemium plan
    • Open-source
    • Lightweight 

    Community critiques 

    • Limited support options
    • Data retention restrictions
    • No funnel functionality

    6. Heap – Best for automatic data capture

    Product analytics with a twist is a good description of Heap. It features event auto-capture to track user interactions across all touchpoints in the user journey. This lets you fully understand how and why customers engage with your product and website. 

    Using a single Javascript snippet, Heap automatically collects data on everything users do, including how they got to your website. It also helps identify how different cohorts engage with your product, providing the critical insights teams need to boost conversion rates.

    Image showing funnel and path analysis data and insights

    Heap’s journeys feature combines funnel and path analysis. (Image source)

     

    Why Heap : The auto-capture functionality solves a major shortcoming of many product analytics tools — manual tracking. Instead of having to set up manual tags on events, Heap automatically captures all data on user activity from the start. 

    Standout features include event auto-capture, session replay, heatmaps, segments (or cohorts) and journeys, the last of which combines the functions of funnel and path analysis tools into a single feature.

    Integrations include AWS, Google, Microsoft Azure, major CRM platforms, Snowflake and many other data manipulation platforms.

    Pricing is quote-based across all payment tiers. There is also a free plan and a 14-day free trial.

    Strengths

    • Session replay
    • Heatmaps 
    • User segmentation
    • Simple setup 
    • Event auto-capture 

    Community critiques 

    • No A/B testing functionality
    • No GDPR compliance support

    Choosing the best solution for your team

    When selecting a tool, it’s crucial to understand how product analytics and web analytics solutions differ. 

    Product analytics tools track users or accounts and record the features they use, the funnels they move through, and the cohorts they’re part of. Web analytics tools focus more on sessions than users because they’re interested in data that can help improve website usage. 

    Some tools combine product and web analytics to do both of these jobs.

    Area of focus

    Product analytics tools track user behaviour within SaaS- or app-based products. They’re helpful for analysing features, user journeys, engagement metrics, product development and iteration. 

    Web analytics tools analyse web traffic, user demographics, and traffic sources. They’re most often used for marketing and SEO insights.

    Level of detail

    Product analytics tools provide in-depth tracking and analysis of user interactions, feature usage, and cohort analysis.

    Web analytics tools provide broader data on page views, bounce rates, and conversion tracking to analyse overall site performance.

    Whatever tools you try, your first step should be to search for reviews online to see what people who’ve used them think about them. There are some great review sites you can try. See what people are saying on Capterra, G2, Gartner Peer Insights, or TrustRadius

    Use Matomo to power your web and app analytics

    Web and product analytics is a competitive field, and there are many other tools worth considering. This list is a small cross-section of what’s available.

    That said, if you have concerns about privacy and costs, consider choosing Matomo. Start your 21-day free trial today.

  • Integrating FFMpeg in Native Android Application with C++ results in bunch of errors [closed]

    13 décembre 2024, par BraveEvidence

    I need to integrate ffmpeg in my android app, i don't want to usee ffmpegkit as that is not properly maintained, i cloned ffmpeg-android-maker and then ran ./ffmpeg-android-maker.sh it created build folder and output folder,&#xA;The output folder looks like this

    &#xA;

    enter image description here

    &#xA;

    I have created a kotlin android project using android studio, so i have written all the code to pick the video and i have the video uri with me in kotlin, i also added a C&#x2B;&#x2B; module with help of Android studio and it did all the configuration in build.gradle and also created CMake file for me.

    &#xA;

    For now I just want to concentrate on building the android project so forget about writing any C&#x2B;&#x2B; code, I then created jniLibs in main folder and in jniLibs I copied arm64-v8a,armeabi-v7a, x86,x86_64 from the output folder of ffmpeg-android-maker and then I want to cpp folder of my android project which is also in main folder and in cpp folder I created include folder and copied libavcodec, libavdevice, libavfilter etc then I updated my CmakeLists.txt to following

    &#xA;

    cmake_minimum_required(VERSION 3.22.1)&#xA;&#xA;project("myandroidapp")&#xA;&#xA;#set(FFMPEG_LIBS_DIR ${CMAKE_SOURCE_DIR}/src/main/jniLibs)&#xA;&#xA;include_directories(${CMAKE_SOURCE_DIR}/src/main/cpp/include)&#xA;&#xA;set_target_properties(${CMAKE_PROJECT_NAME} PROPERTIES&#xA;        LIBRARY_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR}/src/main/jniLibs/${ANDROID_ABI}&#xA;)&#xA;&#xA;add_library(${CMAKE_PROJECT_NAME} SHARED&#xA;    # List C/C&#x2B;&#x2B; source files with relative paths to this CMakeLists.txt.&#xA;    myandroidapp.cpp)&#xA;&#xA;&#xA;# Specifies libraries CMake should link to your target library. You&#xA;# can link libraries from various origins, such as libraries defined in this&#xA;# build script, prebuilt third-party libraries, or Android system libraries.&#xA;target_link_libraries(${CMAKE_PROJECT_NAME}&#xA;    # List libraries link to the target library&#xA;    android&#xA;    log&#xA;        avcodec&#xA;        avdevice&#xA;        avfilter&#xA;        avformat&#xA;        avutil&#xA;        swresample&#xA;        swscale)&#xA;

    &#xA;

    Then in build.gradle I did following

    &#xA;

    externalNativeBuild {&#xA;        cmake {&#xA;            path = file("src/main/cpp/CMakeLists.txt")&#xA;            version = "3.22.1"&#xA;        }&#xA;    }&#xA;&#xA;    sourceSets {&#xA;        getByName("main") {&#xA;            jniLibs.srcDirs("src/main/jniLibs")&#xA;        }&#xA;    }&#xA;&#xA;    packaging {&#xA;        jniLibs.pickFirsts.add("lib/arm64-v8a/libavcodec.so")&#xA;        jniLibs.pickFirsts.add("lib/arm64-v8a/libavformat.so")&#xA;        jniLibs.pickFirsts.add("lib/arm64-v8a/libavutil.so")&#xA;        jniLibs.pickFirsts.add("lib/arm64-v8a/libswscale.so")&#xA;        jniLibs.pickFirsts.add("lib/armeabi-v7a/libavcodec.so")&#xA;        jniLibs.pickFirsts.add("lib/armeabi-v7a/libavformat.so")&#xA;        jniLibs.pickFirsts.add("lib/armeabi-v7a/libavutil.so")&#xA;        jniLibs.pickFirsts.add("lib/armeabi-v7a/libswscale.so")&#xA;        jniLibs.pickFirsts.add("lib/x86/libavcodec.so")&#xA;        jniLibs.pickFirsts.add("lib/x86/libavformat.so")&#xA;        jniLibs.pickFirsts.add("lib/x86/libavutil.so")&#xA;        jniLibs.pickFirsts.add("lib/x86/libswscale.so")&#xA;        jniLibs.pickFirsts.add("lib/x86_64/libavcodec.so")&#xA;        jniLibs.pickFirsts.add("lib/x86_64/libavformat.so")&#xA;        jniLibs.pickFirsts.add("lib/x86_64/libavutil.so")&#xA;        jniLibs.pickFirsts.add("lib/x86_64/libswscale.so")&#xA;    }&#xA;

    &#xA;

    when I try to build my project I get following error

    &#xA;

    [CXX1429] error when building with cmake using /Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/src/main/cpp/CMakeLists.txt: -- Configuring incomplete, errors occurred!&#xA;See also "/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/.cxx/Debug/406wr1e2/arm64-v8a/CMakeFiles/CMakeOutput.log".&#xA;&#xA;C&#x2B;&#x2B; build system [configure] failed while executing:&#xA;    /Users/transformhub/Library/Android/sdk/cmake/3.22.1/bin/cmake \&#xA;      -H/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/src/main/cpp \&#xA;      -DCMAKE_SYSTEM_NAME=Android \&#xA;      -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \&#xA;      -DCMAKE_SYSTEM_VERSION=24 \&#xA;      -DANDROID_PLATFORM=android-24 \&#xA;      -DANDROID_ABI=arm64-v8a \&#xA;      -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \&#xA;      -DANDROID_NDK=/Users/transformhub/Library/Android/sdk/ndk/26.1.10909125 \&#xA;      -DCMAKE_ANDROID_NDK=/Users/transformhub/Library/Android/sdk/ndk/26.1.10909125 \&#xA;      -DCMAKE_TOOLCHAIN_FILE=/Users/transformhub/Library/Android/sdk/ndk/26.1.10909125/build/cmake/android.toolchain.cmake \&#xA;      -DCMAKE_MAKE_PROGRAM=/Users/transformhub/Library/Android/sdk/cmake/3.22.1/bin/ninja \&#xA;      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/build/intermediates/cxx/Debug/406wr1e2/obj/arm64-v8a \&#xA;      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/build/intermediates/cxx/Debug/406wr1e2/obj/arm64-v8a \&#xA;      -DCMAKE_BUILD_TYPE=Debug \&#xA;      -B/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/.cxx/Debug/406wr1e2/arm64-v8a \&#xA;      -GNinja&#xA;  from /Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app&#xA;CMake Error at CMakeLists.txt:15 (set_target_properties):&#xA;  set_target_properties Can not find target to add properties to:&#xA;  myandroidapp : com.android.ide.common.process.ProcessException: -- Configuring incomplete, errors occurred!&#xA;See also "/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/.cxx/Debug/406wr1e2/arm64-v8a/CMakeFiles/CMakeOutput.log".&#xA;&#xA;C&#x2B;&#x2B; build system [configure] failed while executing:&#xA;    /Users/transformhub/Library/Android/sdk/cmake/3.22.1/bin/cmake \&#xA;      -H/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/src/main/cpp \&#xA;      -DCMAKE_SYSTEM_NAME=Android \&#xA;      -DCMAKE_EXPORT_COMPILE_COMMANDS=ON \&#xA;      -DCMAKE_SYSTEM_VERSION=24 \&#xA;      -DANDROID_PLATFORM=android-24 \&#xA;      -DANDROID_ABI=arm64-v8a \&#xA;      -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a \&#xA;      -DANDROID_NDK=/Users/transformhub/Library/Android/sdk/ndk/26.1.10909125 \&#xA;      -DCMAKE_ANDROID_NDK=/Users/transformhub/Library/Android/sdk/ndk/26.1.10909125 \&#xA;      -DCMAKE_TOOLCHAIN_FILE=/Users/transformhub/Library/Android/sdk/ndk/26.1.10909125/build/cmake/android.toolchain.cmake \&#xA;      -DCMAKE_MAKE_PROGRAM=/Users/transformhub/Library/Android/sdk/cmake/3.22.1/bin/ninja \&#xA;      -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/build/intermediates/cxx/Debug/406wr1e2/obj/arm64-v8a \&#xA;      -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/build/intermediates/cxx/Debug/406wr1e2/obj/arm64-v8a \&#xA;      -DCMAKE_BUILD_TYPE=Debug \&#xA;      -B/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/.cxx/Debug/406wr1e2/arm64-v8a \&#xA;      -GNinja&#xA;  from /Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app&#xA;CMake Error at CMakeLists.txt:15 (set_target_properties):&#xA;  set_target_properties Can not find target to add properties to:&#xA;  myandroidapp&#xA;    at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.execute(ExecuteProcess.kt:288)&#xA;    at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt$executeProcess$1.invoke(ExecuteProcess.kt:108)&#xA;    at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt$executeProcess$1.invoke(ExecuteProcess.kt:106)&#xA;    at com.android.build.gradle.internal.cxx.timing.TimingEnvironmentKt.time(TimingEnvironment.kt:32)&#xA;    at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.executeProcess(ExecuteProcess.kt:106)&#xA;    at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.executeProcess$default(ExecuteProcess.kt:85)&#xA;    at com.android.build.gradle.tasks.CmakeQueryMetadataGenerator.executeProcess(CmakeFileApiMetadataGenerator.kt:59)&#xA;    at com.android.build.gradle.tasks.ExternalNativeJsonGenerator$configureOneAbi$1$1$3.invoke(ExternalNativeJsonGenerator.kt:247)&#xA;    at com.android.build.gradle.tasks.ExternalNativeJsonGenerator$configureOneAbi$1$1$3.invoke(ExternalNativeJsonGenerator.kt:247)&#xA;    at com.android.build.gradle.internal.cxx.timing.TimingEnvironmentKt.time(TimingEnvironment.kt:32)&#xA;    at com.android.build.gradle.tasks.ExternalNativeJsonGenerator.configureOneAbi(ExternalNativeJsonGenerator.kt:247)&#xA;    at com.android.build.gradle.tasks.ExternalNativeJsonGenerator.configure(ExternalNativeJsonGenerator.kt:113)&#xA;    at com.android.build.gradle.tasks.ExternalNativeBuildJsonTask.doTaskAction(ExternalNativeBuildJsonTask.kt:89)&#xA;    at com.android.build.gradle.internal.tasks.UnsafeOutputsTask$taskAction$$inlined$recordTaskAction$1.invoke(BaseTask.kt:66)&#xA;    at com.android.build.gradle.internal.tasks.Blocks.recordSpan(Blocks.java:51)&#xA;    at com.android.build.gradle.internal.tasks.UnsafeOutputsTask.taskAction(UnsafeOutputsTask.kt:81)&#xA;    at jdk.internal.reflect.GeneratedMethodAccessor172.invoke(Unknown Source)&#xA;    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)&#xA;    at java.base/java.lang.reflect.Method.invoke(Unknown Source)&#xA;    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:125)&#xA;    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute(StandardTaskAction.java:58)&#xA;    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:51)&#xA;    at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:29)&#xA;    at org.gradle.api.internal.tasks.execution.TaskExecution$3.run(TaskExecution.java:244)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:29)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:26)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:47)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:68)&#xA;    at org.gradle.api.internal.tasks.execution.TaskExecution.executeAction(TaskExecution.java:229)&#xA;    at org.gradle.api.internal.tasks.execution.TaskExecution.executeActions(TaskExecution.java:212)&#xA;    at org.gradle.api.internal.tasks.execution.TaskExecution.executeWithPreviousOutputFiles(TaskExecution.java:195)&#xA;    at org.gradle.api.internal.tasks.execution.TaskExecution.execute(TaskExecution.java:162)&#xA;    at org.gradle.internal.execution.steps.ExecuteStep.executeInternal(ExecuteStep.java:105)&#xA;    at org.gradle.internal.execution.steps.ExecuteStep.access$000(ExecuteStep.java:44)&#xA;    at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:59)&#xA;    at org.gradle.internal.execution.steps.ExecuteStep$1.call(ExecuteStep.java:56)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)&#xA;    at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:56)&#xA;    at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:44)&#xA;    at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:41)&#xA;    at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:74)&#xA;    at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:55)&#xA;    at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:50)&#xA;    at org.gradle.internal.execution.steps.PreCreateOutputParentsStep.execute(PreCreateOutputParentsStep.java:28)&#xA;    at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:67)&#xA;    at org.gradle.internal.execution.steps.RemovePreviousOutputsStep.execute(RemovePreviousOutputsStep.java:37)&#xA;    at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:61)&#xA;    at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:26)&#xA;    at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:67)&#xA;    at org.gradle.internal.execution.steps.CaptureOutputsAfterExecutionStep.execute(CaptureOutputsAfterExecutionStep.java:45)&#xA;    at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:40)&#xA;    at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:29)&#xA;    at org.gradle.internal.execution.steps.BuildCacheStep.executeWithoutCache(BuildCacheStep.java:189)&#xA;    at org.gradle.internal.execution.steps.BuildCacheStep.lambda$execute$1(BuildCacheStep.java:75)&#xA;    at org.gradle.internal.Either$Right.fold(Either.java:175)&#xA;    at org.gradle.internal.execution.caching.CachingState.fold(CachingState.java:62)&#xA;    at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:73)&#xA;    at org.gradle.internal.execution.steps.BuildCacheStep.execute(BuildCacheStep.java:48)&#xA;    at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:46)&#xA;    at org.gradle.internal.execution.steps.StoreExecutionStateStep.execute(StoreExecutionStateStep.java:35)&#xA;    at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:76)&#xA;    at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$2(SkipUpToDateStep.java:54)&#xA;    at java.base/java.util.Optional.orElseGet(Unknown Source)&#xA;    at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)&#xA;    at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:36)&#xA;    at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:37)&#xA;    at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:27)&#xA;    at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:49)&#xA;    at org.gradle.internal.execution.steps.ResolveIncrementalCachingStateStep.executeDelegate(ResolveIncrementalCachingStateStep.java:27)&#xA;    at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:71)&#xA;    at org.gradle.internal.execution.steps.AbstractResolveCachingStateStep.execute(AbstractResolveCachingStateStep.java:39)&#xA;    at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:65)&#xA;    at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:36)&#xA;    at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:106)&#xA;    at org.gradle.internal.execution.steps.ValidateStep.execute(ValidateStep.java:55)&#xA;    at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:64)&#xA;    at org.gradle.internal.execution.steps.AbstractCaptureStateBeforeExecutionStep.execute(AbstractCaptureStateBeforeExecutionStep.java:43)&#xA;    at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.executeWithNonEmptySources(AbstractSkipEmptyWorkStep.java:125)&#xA;    at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:56)&#xA;    at org.gradle.internal.execution.steps.AbstractSkipEmptyWorkStep.execute(AbstractSkipEmptyWorkStep.java:36)&#xA;    at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsStartedStep.execute(MarkSnapshottingInputsStartedStep.java:38)&#xA;    at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:36)&#xA;    at org.gradle.internal.execution.steps.LoadPreviousExecutionStateStep.execute(LoadPreviousExecutionStateStep.java:23)&#xA;    at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:75)&#xA;    at org.gradle.internal.execution.steps.HandleStaleOutputsStep.execute(HandleStaleOutputsStep.java:41)&#xA;    at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.lambda$execute$0(AssignMutableWorkspaceStep.java:35)&#xA;    at org.gradle.api.internal.tasks.execution.TaskExecution$4.withWorkspace(TaskExecution.java:289)&#xA;    at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:31)&#xA;    at org.gradle.internal.execution.steps.AssignMutableWorkspaceStep.execute(AssignMutableWorkspaceStep.java:22)&#xA;    at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:40)&#xA;    at org.gradle.internal.execution.steps.ChoosePipelineStep.execute(ChoosePipelineStep.java:23)&#xA;    at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.lambda$execute$2(ExecuteWorkBuildOperationFiringStep.java:67)&#xA;    at java.base/java.util.Optional.orElseGet(Unknown Source)&#xA;    at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:67)&#xA;    at org.gradle.internal.execution.steps.ExecuteWorkBuildOperationFiringStep.execute(ExecuteWorkBuildOperationFiringStep.java:39)&#xA;    at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:46)&#xA;    at org.gradle.internal.execution.steps.IdentityCacheStep.execute(IdentityCacheStep.java:34)&#xA;    at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:48)&#xA;    at org.gradle.internal.execution.steps.IdentifyStep.execute(IdentifyStep.java:35)&#xA;    at org.gradle.internal.execution.impl.DefaultExecutionEngine$1.execute(DefaultExecutionEngine.java:61)&#xA;    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeIfValid(ExecuteActionsTaskExecuter.java:127)&#xA;    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:116)&#xA;    at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)&#xA;    at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:51)&#xA;    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)&#xA;    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:74)&#xA;    at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)&#xA;    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:77)&#xA;    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:55)&#xA;    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:200)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:195)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:66)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:59)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:157)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:59)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:53)&#xA;    at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:73)&#xA;    at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:52)&#xA;    at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:42)&#xA;    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:331)&#xA;    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:318)&#xA;    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.lambda$execute$0(DefaultTaskExecutionGraph.java:314)&#xA;    at org.gradle.internal.operations.CurrentBuildOperationRef.with(CurrentBuildOperationRef.java:80)&#xA;    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:314)&#xA;    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:303)&#xA;    at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:463)&#xA;    at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:380)&#xA;    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64)&#xA;    at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:47)&#xA;    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)&#xA;    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)&#xA;    at java.base/java.lang.Thread.run(Unknown Source)&#xA;Caused by: com.android.ide.common.process.ProcessException: Error while executing process /Users/transformhub/Library/Android/sdk/cmake/3.22.1/bin/cmake with arguments {-H/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/src/main/cpp -DCMAKE_SYSTEM_NAME=Android -DCMAKE_EXPORT_COMPILE_COMMANDS=ON -DCMAKE_SYSTEM_VERSION=24 -DANDROID_PLATFORM=android-24 -DANDROID_ABI=arm64-v8a -DCMAKE_ANDROID_ARCH_ABI=arm64-v8a -DANDROID_NDK=/Users/transformhub/Library/Android/sdk/ndk/26.1.10909125 -DCMAKE_ANDROID_NDK=/Users/transformhub/Library/Android/sdk/ndk/26.1.10909125 -DCMAKE_TOOLCHAIN_FILE=/Users/transformhub/Library/Android/sdk/ndk/26.1.10909125/build/cmake/android.toolchain.cmake -DCMAKE_MAKE_PROGRAM=/Users/transformhub/Library/Android/sdk/cmake/3.22.1/bin/ninja -DCMAKE_LIBRARY_OUTPUT_DIRECTORY=/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/build/intermediates/cxx/Debug/406wr1e2/obj/arm64-v8a -DCMAKE_RUNTIME_OUTPUT_DIRECTORY=/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/build/intermediates/cxx/Debug/406wr1e2/obj/arm64-v8a -DCMAKE_BUILD_TYPE=Debug -B/Users/transformhub/Downloads/mycam/ffmpeg/MyAndroidapp/app/.cxx/Debug/406wr1e2/arm64-v8a -GNinja}&#xA;    at com.android.build.gradle.internal.process.GradleProcessResult.buildProcessException(GradleProcessResult.java:73)&#xA;    at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:48)&#xA;    at com.android.build.gradle.internal.cxx.process.ExecuteProcessKt.execute(ExecuteProcess.kt:277)&#xA;    ... 143 more&#xA;Caused by: org.gradle.process.internal.ExecException: Process &#x27;command &#x27;/Users/transformhub/Library/Android/sdk/cmake/3.22.1/bin/cmake&#x27;&#x27; finished with non-zero exit value 1&#xA;    at org.gradle.process.internal.DefaultExecHandle$ExecResultImpl.assertNormalExitValue(DefaultExecHandle.java:442)&#xA;    at com.android.build.gradle.internal.process.GradleProcessResult.assertNormalExitValue(GradleProcessResult.java:46)&#xA;    ... 144 more&#xA;

    &#xA;

    Here is the complete source code

    &#xA;