Recherche avancée

Médias (1)

Mot : - Tags -/intégration

Autres articles (91)

  • Keeping control of your media in your hands

    13 avril 2011, par

    The vocabulary used on this site and around MediaSPIP in general, aims to avoid reference to Web 2.0 and the companies that profit from media-sharing.
    While using MediaSPIP, you are invited to avoid using words like "Brand", "Cloud" and "Market".
    MediaSPIP is designed to facilitate the sharing of creative media online, while allowing authors to retain complete control of their work.
    MediaSPIP aims to be accessible to as many people as possible and development is based on expanding the (...)

  • MediaSPIP Init et Diogène : types de publications de MediaSPIP

    11 novembre 2010, par

    À l’installation d’un site MediaSPIP, le plugin MediaSPIP Init réalise certaines opérations dont la principale consiste à créer quatre rubriques principales dans le site et de créer cinq templates de formulaire pour Diogène.
    Ces quatre rubriques principales (aussi appelées secteurs) sont : Medias ; Sites ; Editos ; Actualités ;
    Pour chacune de ces rubriques est créé un template de formulaire spécifique éponyme. Pour la rubrique "Medias" un second template "catégorie" est créé permettant d’ajouter (...)

  • (Dés)Activation de fonctionnalités (plugins)

    18 février 2011, par

    Pour gérer l’ajout et la suppression de fonctionnalités supplémentaires (ou plugins), MediaSPIP utilise à partir de la version 0.2 SVP.
    SVP permet l’activation facile de plugins depuis l’espace de configuration de MediaSPIP.
    Pour y accéder, il suffit de se rendre dans l’espace de configuration puis de se rendre sur la page "Gestion des plugins".
    MediaSPIP est fourni par défaut avec l’ensemble des plugins dits "compatibles", ils ont été testés et intégrés afin de fonctionner parfaitement avec chaque (...)

Sur d’autres sites (12071)

  • How to Check Website Traffic As Accurately As Possible

    18 août 2023, par Erin — Analytics Tips

    If you want to learn about the health of your website and the success of your digital marketing initiatives, there are few better ways than checking your website traffic. 

    It’s a great way to get a quick dopamine hit when things are up, but you can also use traffic levels to identify issues, learn more about your users or benchmark your performance. That means you need a reliable and easy way to check your website traffic over time — as well as a way to check out your competitors’ traffic levels, too. 

    In this article, we’ll show you how to do just that. You’ll learn how to check website traffic for both your and your competitor’s sites and discover why some methods of checking website traffic are better than others. 

    Why check website traffic ? 

    Dopamine hits aside, it’s important to constantly monitor your website’s traffic for several reasons.

    There are five reasons to check website traffic

    Benchmark site performance

    Keeping regular tabs on your traffic levels is a great way to track your website’s performance over time. It can help you plan for the future or identify problems. 

    For instance, growing traffic levels may mean expanding your business’s offering or investing in more inventory. On the flip side, decreasing traffic levels may suggest it’s time to revamp your marketing strategies or look into issues impacting your SEO. 

    Analyse user behaviour

    Checking website traffic and user behaviour lets marketing managers understand how users interact with your website. Which pages are they visiting ? Which CTAs do they click on ? What can you do to encourage users to take the actions you want ? You can also identify issues that lead to high bounce rates and other problems. 

    The better you understand user behaviour, the easier it will be to give them what they want. For example, you may find that users spend more time on your landing pages than they do your blog pages. You could use that information to revise how you create blog posts or focus on creating more landing pages. 

    Improve the user experience

    Once you understand how users behave on your website, you can use that information to fix errors, update your content and improve the user experience for the site. 

    You can even personalise the experience for customers, leading to significant growth. Research shows companies that grow faster derive 40% more of their revenue from personalisation. 

    That could come in the form of sweeping personalisations — like rearranging your website’s navigation bar based on user behaviour — or individual personalisation that uses analytics to transform sections or entire pages of your site based on user behaviour. 

    Optimise marketing strategies

    You can use website traffic reports to understand where users are coming from and optimise your marketing plan accordingly. You may want to double down on organic traffic, for instance, or invest more in PPC advertising. Knowing current traffic estimates and how these traffic levels have trended over time can help you benchmark your campaigns and prioritise your efforts. 

    Increasing traffic levels from other countries can also help you identify new marketing opportunities. If you start seeing significant traffic levels from a neighbouring country or a large market, it could be time to take your business international and launch a cross-border campaign. 

    Filter unwanted traffic

    A not-insignificant portion of your site’s traffic may be coming from bots and other unwanted sources. These can compromise the quality of your analytics and make it harder to draw insights. You may not be able to get rid of this traffic, but you can use analytics tools to remove it from your stats. 

    How to check website traffic on Matomo

    If you want to check your website’s traffic, you’d be forgiven for heading to Google Analytics first. It’s the most popular analytics tool on the market, after all. But if you want a more reliable assessment of your website’s traffic, then we recommend using Matomo alongside Google Analytics. 

    The Matomo web analytics platform is an open-source solution that helps you collect accurate data about your website’s traffic and make more informed decisions as a result — all while enhancing the customer experience and ensuring GDPR compliance and user privacy. 

    Matomo also offers multiple ways to check website traffic :

    Let’s look at all of them one by one. 

    The visits log report is a unique rundown of all of the individual visitors to your site. This offers a much more granular view than other tools that just show the total number of visitors for a given period. 

    The Visits log report is a unique rundown of your site's visitors

    You can access the visits log report by clicking on the reporting menu, then clicking Visitor and Visits Log. From there, you’ll be able to scroll through every user session and see the following information :

    • The location of the user
    • The total number of actions they took
    • The length of time on site
    • How they arrived at your site
    • And the device they used to access your site 

    This may be overwhelming if your site receives thousands of visitors at a time. But it’s a great way to understand users at an individual level and appreciate the lifetime activity of specific users. 

    The Real-time visitor map is a visual display of users’ location for a given timeframe. If you have an international website, it’s a fantastic way to see exactly where in the world your traffic comes from.

    Use the Real-time Map to see the location of users over a given timeframe

    You can access the Real-time Visitor Map by clicking Visitor in the main navigation menu and then Real-time Map. The map itself is colour-coded. Larger orange bubbles represent recent visits, and smaller dark orange and grey bubbles represent older visits. The map will refresh every five seconds, and new users appear with a flashing effect. 

    If you run TV or radio adverts, Matomo’s Real-time Map provides an immediate read on the effectiveness of your campaign. If your map lights up in the minutes following your ad, you know it’s been effective. It can also help you identify the source of bot attacks, too. 

    Finally, the Visits in Real-time report provides a snapshot of who is browsing your website. You can access this report under Visitors > Real-time and add it to your custom dashboards as a widget. 

    Open the report, and you’ll see the real-time flow of your site’s users and counters for visits and pageviews over the last 30 minutes and 24 hours. The report refreshes every five seconds with new users added to the top of the report with a fade-in effect.

    Use the Visits in Real-Time report to get a snapshot of your site's most recent visitors

    The report provides a snapshot of each visitor, including :

    • Whether they are new or a returning 
    • Their country
    • Their browser
    • Their operating system
    • The number of actions they took
    • The time they spent on the site
    • The channel they came in from
    • Whether the visitor converted a goal

    3 other ways to check website traffic

    You don’t need to use Matomo to check your website traffic. Here are three other tools you can use instead. 

    How to check website traffic on Google Analytics

    Google Analytics is usually the first starting point for anyone looking to check their website traffic. It’s free to use, incredibly popular and offers a wide range of traffic reports. 

    Google Analytics lets you break down historical traffic data almost any way you wish. You can split traffic by acquisition channel (organic, social media, direct, etc.) by country, device or demographic.

    Google Analytics can split website traffic by channel

    It also provides real-time traffic reports that give you a snapshot of users on your site right now and over the last 30 minutes. 

    Google Analytics 4 shows the number of users over the last 30 minutes

    Google Analytics may be one of the most popular ways to check website traffic, but it could be better. Google Analytics 4 is difficult to use compared to its predecessor, and it also limits the amount of data you can track in accordance with privacy laws. If users refuse your cookie consent, Google Analytics won’t record these visits. In other words, you aren’t getting a complete view of your traffic by using Google Analytics alone. 

    That’s why it’s important to use Google Analytics alongside other web analytics tools (like Matomo) that don’t suffer from the same privacy issues. That way, you can make sure you track every single user who visits your site. 

    How to check website traffic on Google Search Console

    Google Search Console is a free tool from Google that lets you analyse the search traffic that your site gets from Google. 

    The top-line report shows you how many times your website has appeared in Google Search, how many clicks it has received, the average clickthrough rate and the average position of your website in the search results. 

    Google Search Console is a great way to understand what you rank for and how much traffic your organic rankings generate. It will also show you which pages are indexed in Google and whether there are any crawling errors. 

    Unfortunately, Google Search Console is limited if you want to get a complete view of your traffic. While you can analyse search traffic in a huge amount of detail, it will not tell you how users who access your website directly or via social media behave. 

    How to check website traffic on Similarweb

    Similarweb is a website analysis tool that estimates the total traffic of any site on the internet. It is one of the best tools for estimating how much traffic your competitors receive. 

    What’s great about Similarweb is that it estimates total traffic, not just traffic from search engines like many SEO tools. It even breaks down traffic by different channels, allowing you to see how your website compares against your competitors. 

    As you can see from the image above, Similarweb provides an estimate of total visits, bounce rate, the average number of pages users view per visit and the average duration on the site. The company also has a free browser extension that lets you check website traffic estimates as you browse the web. 

    You can use Similarweb for free to a point. But to really get the most out of this tool, you’ll need to upgrade to a premium plan which starts at $125 per user per month. 

    The price isn’t the only downside of using Similarweb to check the traffic of your own and your competitor’s websites. Ultimately, Similarweb is only an estimate — even if it’s a reasonably accurate one — and it’s no match for a comprehensive analytics tool. 

    7 website traffic metrics to track

    Now that you know how to check your website’s traffic, you can start to analyse it. You can use plenty of metrics to assess the quality of your website traffic, but here are some of the most important metrics to track. 

    • New visitors : These are users who have never visited your website before. They are a great sign that your marketing efforts are working and your site is reaching more people. But it’s also important to track how they behave on the website to ensure your site caters effectively to new visitors. 
    • Returning visitors : Returning visitors are coming back to your site for a reason : either they like the content you’re creating or they want to make a purchase. Both instances are great. The more returning visitors, the better. 
    • Bounce rate : This is a measure of how many users leave your website without taking action. Different analytics tools measure this metric differently.
    • Session duration : This is the length of time users spend on your website, and it can be a great gauge of whether they find your site engaging. Especially when combined with the metric below. 
    • Pages per session : This measures how many different pages users visit on average. The more pages they visit and the longer users spend on your website, the more engaging it is. 
    • Traffic source : Traffic can come from a variety of sources (organic, direct, social media, referral, etc.) Tracking which sources generate the most traffic can help you analyse and prioritise your marketing efforts. 
    • User demographics : This broad metric tells you more about who the users are that visit your website, what device they use, what country they come from, etc. While the bulk of your website traffic will come from the countries you target, an influx of new users from other countries can open the door to new opportunities.

    Why do my traffic reports differ ?

    If you use more than one of the methods above to check your website traffic, you’ll quickly realise that every traffic report differs. In some cases, the reasons are obvious. Any tool that estimates your traffic without adding code to your website is just that : an estimate. Tools like Similarweb will never offer the accuracy of analytics platforms like Matomo and Google Analytics. 

    But what about the differences between these analytics platforms themselves ? While each platform has a different way of recording user behaviour, significant differences in website traffic reports between analytics platforms are usually a result of how each platform handles user privacy. 

    A platform like Google Analytics requires users to accept a cookie consent banner to track them. If they accept, great. Google collects all of the data that any other analytics platform does. It may even collect more. If users reject cookie consent banners, however, then Google Analytics can’t track these visitors at all. They simply won’t show up in your traffic reports. 

    That doesn’t happen with all analytics platforms, however. A privacy-focused alternative like Matomo doesn’t require cookie consent banners (apart from in the United Kingdom and Germany) and can therefore continue to track visitors even after they have rejected a cookie consent screen from Google Analytics. This means that virtually all of your website traffic will be tracked regardless of whether users accept a cookie consent banner or not. And it’s why traffic reports in Matomo are often much higher than they are in Google Analytics.

    Matomo doesn't need cookie consent, so you see a complete view of your traffic

    Given that around half (47.32%) of adults in the European Union refuse to allow the use of personal data tracking for advertising purposes and that 95% of people will reject additional cookies when it is easy to do so, this means you could have vastly different traffic reports — and be missing out on a significant amount of user data. 

    If you’re serious about using web analytics to improve your website and optimise your marketing campaigns, then it is essential to use another analytics platform alongside Google Analytics. 

    Get more accurate traffic reports with Matomo

    There are several methods to check website traffic. Some, like Similarweb, can provide estimates on your competitors’ traffic levels. Others, like Google Analytics, are free. But data doesn’t lie. Only privacy-focused analytics solutions like Matomo can provide accurate reports that account for every visitor. 

    Join over one million organisations using Matomo to accurately check their website traffic. Try it for free alongside GA today. No credit card required. 

  • ffmpeg : libavformat/libswresample to transcode and resample at same time

    21 février 2024, par whatdoido

    I want to transcode and down/re-sample the audio for output using ffmpeg's libav*/libswresample - I am using ffmpeg's (4.x) transcode_aac.c and resample_audio.c as reference - but the code produces audio with glitches that is clearly not what ffmpeg itself would produce (ie ffmpeg -i foo.wav -ar 22050 foo.m4a)

    


    Based on the ffmpeg examples, to resample audio it appears that I need to set the output AVAudioContext and SwrContext sample_rate to what I desire and ensure the swr_convert() is provided with the correct number of output samples based av_rescale_rnd( swr_delay(), ...) once I have an decoded input audio. I've taken care to ensure all the relevant calculations of samples for output are taken into account in the merged code (below) :

    


      

    • open_output_file() - AVCodecContext.sample_rate (avctx variable) set to our target (down sampled) sample_rate
    • 


    • read_decode_convert_and_store() is where the work happens : input audio is decoded to an AVFrame and this input frame is converted before being encoded.

        

      • init_converted_samples() and av_samples_alloc() uses the input frame's nb_samples
      • 


      • ADDED : calc the number of output samples via av_rescale_rnd() and swr_delay()
      • 


      • UPDATED : convert_samples() and swr_convert() uses the input frame's samples and our calculated output samples as parameters
      • 


      


    • 


    


    However the resulting audio file is produced with audio glitches. Does the community know of any references for how transcode AND resample should be done or what is missing in this example ?

    


        /* compile and run:&#xA;         gcc -I/usr/include/ffmpeg  transcode-swr-aac.c  -lavformat -lavutil -lavcodec -lswresample -lm&#xA;         ./a.out foo.wav foo.m4a&#xA;    */&#xA;&#xA;/*&#xA; * Copyright (c) 2013-2018 Andreas Unterweger&#xA; *  &#xA; * This file is part of FFmpeg.                                                 &#xA; ...                                                                       ...&#xA; *   &#xA; * @example transcode_aac.c                                                    &#xA; * Convert an input audio file to AAC in an MP4 container using FFmpeg.         &#xA; * Formats other than MP4 are supported based on the output file extension.                            &#xA; * @author Andreas Unterweger (xxxx@xxxxx.com)&#xA; */  &#xA;    #include &#xA; &#xA;&#xA;    #include "libavformat/avformat.h"&#xA;    #include "libavformat/avio.h"&#xA;    &#xA;    #include "libavcodec/avcodec.h"&#xA;    &#xA;    #include "libavutil/audio_fifo.h"&#xA;    #include "libavutil/avassert.h"&#xA;    #include "libavutil/avstring.h"&#xA;    #include "libavutil/channel_layout.h"&#xA;    #include "libavutil/frame.h"&#xA;    #include "libavutil/opt.h"&#xA;    &#xA;    #include "libswresample/swresample.h"&#xA;    &#xA;    #define OUTPUT_BIT_RATE 128000&#xA;    #define OUTPUT_CHANNELS 2&#xA;    &#xA;    static int open_input_file(const char *filename,&#xA;                               AVFormatContext **input_format_context,&#xA;                               AVCodecContext **input_codec_context)&#xA;    {&#xA;        AVCodecContext *avctx;&#xA;        const AVCodec *input_codec;&#xA;        const AVStream *stream;&#xA;        int error;&#xA;    &#xA;        if ((error = avformat_open_input(input_format_context, filename, NULL,&#xA;                                         NULL)) &lt; 0) {&#xA;            fprintf(stderr, "Could not open input file &#x27;%s&#x27; (error &#x27;%s&#x27;)\n",&#xA;                    filename, av_err2str(error));&#xA;            *input_format_context = NULL;&#xA;            return error;&#xA;        }&#xA;    &#xA;&#xA;        if ((error = avformat_find_stream_info(*input_format_context, NULL)) &lt; 0) {&#xA;            fprintf(stderr, "Could not open find stream info (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            avformat_close_input(input_format_context);&#xA;            return error;&#xA;        }&#xA;    &#xA;        if ((*input_format_context)->nb_streams != 1) {&#xA;            fprintf(stderr, "Expected one audio input stream, but found %d\n",&#xA;                    (*input_format_context)->nb_streams);&#xA;            avformat_close_input(input_format_context);&#xA;            return AVERROR_EXIT;&#xA;        }&#xA;    &#xA;        stream = (*input_format_context)->streams[0];&#xA;    &#xA;        if (!(input_codec = avcodec_find_decoder(stream->codecpar->codec_id))) {&#xA;            fprintf(stderr, "Could not find input codec\n");&#xA;            avformat_close_input(input_format_context);&#xA;            return AVERROR_EXIT;&#xA;        }&#xA;    &#xA;        avctx = avcodec_alloc_context3(input_codec);&#xA;        if (!avctx) {&#xA;            fprintf(stderr, "Could not allocate a decoding context\n");&#xA;            avformat_close_input(input_format_context);&#xA;            return AVERROR(ENOMEM);&#xA;        }&#xA;    &#xA;        /* Initialize the stream parameters with demuxer information. */&#xA;        error = avcodec_parameters_to_context(avctx, stream->codecpar);&#xA;        if (error &lt; 0) {&#xA;            avformat_close_input(input_format_context);&#xA;            avcodec_free_context(&amp;avctx);&#xA;            return error;&#xA;        }&#xA;    &#xA;        /* Open the decoder for the audio stream to use it later. */&#xA;        if ((error = avcodec_open2(avctx, input_codec, NULL)) &lt; 0) {&#xA;            fprintf(stderr, "Could not open input codec (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            avcodec_free_context(&amp;avctx);&#xA;            avformat_close_input(input_format_context);&#xA;            return error;&#xA;        }&#xA;    &#xA;        /* Set the packet timebase for the decoder. */&#xA;        avctx->pkt_timebase = stream->time_base;&#xA;    &#xA;        /* Save the decoder context for easier access later. */&#xA;        *input_codec_context = avctx;&#xA;    &#xA;        return 0;&#xA;    }&#xA;    &#xA;    static int open_output_file(const char *filename,&#xA;                                AVCodecContext *input_codec_context,&#xA;                                AVFormatContext **output_format_context,&#xA;                                AVCodecContext **output_codec_context)&#xA;    {&#xA;        AVCodecContext *avctx          = NULL;&#xA;        AVIOContext *output_io_context = NULL;&#xA;        AVStream *stream               = NULL;&#xA;        const AVCodec *output_codec    = NULL;&#xA;        int error;&#xA;    &#xA;&#xA;        if ((error = avio_open(&amp;output_io_context, filename,&#xA;                               AVIO_FLAG_WRITE)) &lt; 0) {&#xA;            fprintf(stderr, "Could not open output file &#x27;%s&#x27; (error &#x27;%s&#x27;)\n",&#xA;                    filename, av_err2str(error));&#xA;            return error;&#xA;        }&#xA;    &#xA;&#xA;        if (!(*output_format_context = avformat_alloc_context())) {&#xA;            fprintf(stderr, "Could not allocate output format context\n");&#xA;            return AVERROR(ENOMEM);&#xA;        }&#xA;    &#xA;&#xA;        (*output_format_context)->pb = output_io_context;&#xA;    &#xA;&#xA;        if (!((*output_format_context)->oformat = av_guess_format(NULL, filename,&#xA;                                                                  NULL))) {&#xA;            fprintf(stderr, "Could not find output file format\n");&#xA;            goto cleanup;&#xA;        }&#xA;    &#xA;        if (!((*output_format_context)->url = av_strdup(filename))) {&#xA;            fprintf(stderr, "Could not allocate url.\n");&#xA;            error = AVERROR(ENOMEM);&#xA;            goto cleanup;&#xA;        }&#xA;    &#xA;&#xA;        if (!(output_codec = avcodec_find_encoder(AV_CODEC_ID_AAC))) {&#xA;            fprintf(stderr, "Could not find an AAC encoder.\n");&#xA;            goto cleanup;&#xA;        }&#xA;    &#xA;        /* Create a new audio stream in the output file container. */&#xA;        if (!(stream = avformat_new_stream(*output_format_context, NULL))) {&#xA;            fprintf(stderr, "Could not create new stream\n");&#xA;            error = AVERROR(ENOMEM);&#xA;            goto cleanup;&#xA;        }&#xA;    &#xA;        avctx = avcodec_alloc_context3(output_codec);&#xA;        if (!avctx) {&#xA;            fprintf(stderr, "Could not allocate an encoding context\n");&#xA;            error = AVERROR(ENOMEM);&#xA;            goto cleanup;&#xA;        }&#xA;    &#xA;   /* Set the basic encoder parameters.&#xA;    * SET OUR DESIRED output sample_rate here&#xA;    */&#xA;        avctx->channels       = OUTPUT_CHANNELS;&#xA;        avctx->channel_layout = av_get_default_channel_layout(OUTPUT_CHANNELS);&#xA;        // avctx->sample_rate    = input_codec_context->sample_rate;&#xA;        avctx->sample_rate    = 22050;&#xA;        avctx->sample_fmt     = output_codec->sample_fmts[0];&#xA;        avctx->bit_rate       = OUTPUT_BIT_RATE;&#xA;    &#xA;        avctx->strict_std_compliance = FF_COMPLIANCE_EXPERIMENTAL;&#xA;    &#xA;        /* Set the sample rate for the container. */&#xA;        stream->time_base.den = avctx->sample_rate;&#xA;        stream->time_base.num = 1;&#xA;    &#xA;        if ((*output_format_context)->oformat->flags &amp; AVFMT_GLOBALHEADER)&#xA;            avctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;&#xA;    &#xA;        if ((error = avcodec_open2(avctx, output_codec, NULL)) &lt; 0) {&#xA;            fprintf(stderr, "Could not open output codec (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            goto cleanup;&#xA;        }&#xA;    &#xA;        error = avcodec_parameters_from_context(stream->codecpar, avctx);&#xA;        if (error &lt; 0) {&#xA;            fprintf(stderr, "Could not initialize stream parameters\n");&#xA;            goto cleanup;&#xA;        }&#xA;    &#xA;        /* Save the encoder context for easier access later. */&#xA;        *output_codec_context = avctx;&#xA;    &#xA;        return 0;&#xA;    &#xA;    cleanup:&#xA;        avcodec_free_context(&amp;avctx);&#xA;        avio_closep(&amp;(*output_format_context)->pb);&#xA;        avformat_free_context(*output_format_context);&#xA;        *output_format_context = NULL;&#xA;        return error &lt; 0 ? error : AVERROR_EXIT;&#xA;    }&#xA;    &#xA;    /**&#xA;     * Initialize one data packet for reading or writing.&#xA;     */&#xA;    static int init_packet(AVPacket **packet)&#xA;    {&#xA;        if (!(*packet = av_packet_alloc())) {&#xA;            fprintf(stderr, "Could not allocate packet\n");&#xA;            return AVERROR(ENOMEM);&#xA;        }&#xA;        return 0;&#xA;    }&#xA;    &#xA;    static int init_input_frame(AVFrame **frame)&#xA;    {&#xA;        if (!(*frame = av_frame_alloc())) {&#xA;            fprintf(stderr, "Could not allocate input frame\n");&#xA;            return AVERROR(ENOMEM);&#xA;        }&#xA;        return 0;&#xA;    }&#xA;    &#xA;    static int init_resampler(AVCodecContext *input_codec_context,&#xA;                              AVCodecContext *output_codec_context,&#xA;                              SwrContext **resample_context)&#xA;    {&#xA;            int error;&#xA;&#xA;  /**&#xA;   * create the resample, including ref to the desired output sample rate&#xA;   */&#xA;            *resample_context = swr_alloc_set_opts(NULL,&#xA;                                                  av_get_default_channel_layout(output_codec_context->channels),&#xA;                                                  output_codec_context->sample_fmt,&#xA;                                                  output_codec_context->sample_rate,&#xA;                              av_get_default_channel_layout(input_codec_context->channels),&#xA;                                                  input_codec_context->sample_fmt,&#xA;                                                  input_codec_context->sample_rate,&#xA;                                                  0, NULL);&#xA;            if (!*resample_context &lt; 0) {&#xA;                fprintf(stderr, "Could not allocate resample context\n");&#xA;            return AVERROR(ENOMEM);&#xA;            }&#xA;    &#xA;            if ((error = swr_init(*resample_context)) &lt; 0) {&#xA;                fprintf(stderr, "Could not open resample context\n");&#xA;                swr_free(resample_context);&#xA;                return error;&#xA;            }&#xA;        return 0;&#xA;    }&#xA;    &#xA;    static int init_fifo(AVAudioFifo **fifo, AVCodecContext *output_codec_context)&#xA;    {&#xA;        if (!(*fifo = av_audio_fifo_alloc(output_codec_context->sample_fmt,&#xA;                                          output_codec_context->channels, 1))) {&#xA;            fprintf(stderr, "Could not allocate FIFO\n");&#xA;            return AVERROR(ENOMEM);&#xA;        }&#xA;        return 0;&#xA;    }&#xA;    &#xA;    static int write_output_file_header(AVFormatContext *output_format_context)&#xA;    {&#xA;        int error;&#xA;        if ((error = avformat_write_header(output_format_context, NULL)) &lt; 0) {&#xA;            fprintf(stderr, "Could not write output file header (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            return error;&#xA;        }&#xA;        return 0;&#xA;    }&#xA;    &#xA;    static int decode_audio_frame(AVFrame *frame,&#xA;                                  AVFormatContext *input_format_context,&#xA;                                  AVCodecContext *input_codec_context,&#xA;                                  int *data_present, int *finished)&#xA;    {&#xA;        AVPacket *input_packet;&#xA;        int error;&#xA;    &#xA;        error = init_packet(&amp;input_packet);&#xA;        if (error &lt; 0)&#xA;            return error;&#xA;    &#xA;        *data_present = 0;&#xA;        *finished = 0;&#xA;&#xA;        if ((error = av_read_frame(input_format_context, input_packet)) &lt; 0) {&#xA;            if (error == AVERROR_EOF)&#xA;                *finished = 1;&#xA;            else {&#xA;                fprintf(stderr, "Could not read frame (error &#x27;%s&#x27;)\n",&#xA;                        av_err2str(error));&#xA;                goto cleanup;&#xA;            }&#xA;        }&#xA;    &#xA;        if ((error = avcodec_send_packet(input_codec_context, input_packet)) &lt; 0) {&#xA;            fprintf(stderr, "Could not send packet for decoding (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            goto cleanup;&#xA;        }&#xA;    &#xA;        error = avcodec_receive_frame(input_codec_context, frame);&#xA;        if (error == AVERROR(EAGAIN)) {&#xA;            error = 0;&#xA;            goto cleanup;&#xA;        } else if (error == AVERROR_EOF) {&#xA;            *finished = 1;&#xA;            error = 0;&#xA;            goto cleanup;&#xA;        } else if (error &lt; 0) {&#xA;            fprintf(stderr, "Could not decode frame (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            goto cleanup;&#xA;        } else {&#xA;            *data_present = 1;&#xA;            goto cleanup;&#xA;        }&#xA;    &#xA;    cleanup:&#xA;        av_packet_free(&amp;input_packet);&#xA;        return error;&#xA;    }&#xA;    &#xA;    static int init_converted_samples(uint8_t ***converted_input_samples,&#xA;                                      AVCodecContext *output_codec_context,&#xA;                                      int frame_size)&#xA;    {&#xA;        int error;&#xA;    &#xA;        if (!(*converted_input_samples = calloc(output_codec_context->channels,&#xA;                                                sizeof(**converted_input_samples)))) {&#xA;            fprintf(stderr, "Could not allocate converted input sample pointers\n");&#xA;            return AVERROR(ENOMEM);&#xA;        }&#xA;    &#xA;&#xA;        if ((error = av_samples_alloc(*converted_input_samples, NULL,&#xA;                                      output_codec_context->channels,&#xA;                                      frame_size,&#xA;                                      output_codec_context->sample_fmt, 0)) &lt; 0) {&#xA;            fprintf(stderr,&#xA;                    "Could not allocate converted input samples (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            av_freep(&amp;(*converted_input_samples)[0]);&#xA;            free(*converted_input_samples);&#xA;            return error;&#xA;        }&#xA;        return 0;&#xA;    }&#xA;    &#xA;    static int convert_samples(const uint8_t **input_data, const int input_nb_samples,&#xA;                               uint8_t **converted_data, const int output_nb_samples,&#xA;                               SwrContext *resample_context)&#xA;    {&#xA;        int error;&#xA;    &#xA;        if ((error = swr_convert(resample_context,&#xA;                                 converted_data, output_nb_samples,&#xA;                                 input_data    , input_nb_samples)) &lt; 0) {&#xA;            fprintf(stderr, "Could not convert input samples (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            return error;&#xA;        }&#xA;    &#xA;        return 0;&#xA;    }&#xA;    &#xA;    static int add_samples_to_fifo(AVAudioFifo *fifo,&#xA;                                   uint8_t **converted_input_samples,&#xA;                                   const int frame_size)&#xA;    {&#xA;        int error;&#xA;    &#xA;        if ((error = av_audio_fifo_realloc(fifo, av_audio_fifo_size(fifo) &#x2B; frame_size)) &lt; 0) {&#xA;            fprintf(stderr, "Could not reallocate FIFO\n");&#xA;            return error;&#xA;        }&#xA;    &#xA;        if (av_audio_fifo_write(fifo, (void **)converted_input_samples,&#xA;                                frame_size) &lt; frame_size) {&#xA;            fprintf(stderr, "Could not write data to FIFO\n");&#xA;            return AVERROR_EXIT;&#xA;        }&#xA;        return 0;&#xA;    }&#xA;    &#xA;    static int read_decode_convert_and_store(AVAudioFifo *fifo,&#xA;                                             AVFormatContext *input_format_context,&#xA;                                             AVCodecContext *input_codec_context,&#xA;                                             AVCodecContext *output_codec_context,&#xA;                                             SwrContext *resampler_context,&#xA;                                             int *finished)&#xA;    {&#xA;        AVFrame *input_frame = NULL;&#xA;        uint8_t **converted_input_samples = NULL;&#xA;        int data_present;&#xA;        int ret = AVERROR_EXIT;&#xA;    &#xA;&#xA;        if (init_input_frame(&amp;input_frame))&#xA;            goto cleanup;&#xA;&#xA;        if (decode_audio_frame(input_frame, input_format_context,&#xA;                               input_codec_context, &amp;data_present, finished))&#xA;            goto cleanup;&#xA;&#xA;        if (*finished) {&#xA;            ret = 0;&#xA;            goto cleanup;&#xA;        }&#xA;&#xA;        if (data_present) {&#xA;            /* Initialize the temporary storage for the converted input samples. */&#xA;            if (init_converted_samples(&amp;converted_input_samples, output_codec_context,&#xA;                                       input_frame->nb_samples))&#xA;                goto cleanup;&#xA; &#xA;    /* figure out how many samples are required for target sample_rate incl&#xA;     * any items left in the swr buffer&#xA;     */   &#xA;            int  output_nb_samples = av_rescale_rnd(&#xA;                                       swr_get_delay(resampler_context, input_codec_context->sample_rate) &#x2B; input_frame->nb_samples,&#xA;                                       output_codec_context->sample_rate, &#xA;                                        input_codec_context->sample_rate,&#xA;                                       AV_ROUND_UP);&#xA; &#xA;            /* ignore, just to ensure we&#x27;ve got enough buffer alloc&#x27;d for conversion buffer */&#xA;            av_assert1(input_frame->nb_samples > output_nb_samples);&#xA;   &#xA;    /* Convert the input samples to the desired output sample format, via swr_convert().&#xA;     */&#xA;            if (convert_samples((const uint8_t**)input_frame->extended_data, input_frame->nb_samples,&#xA;                        converted_input_samples, output_nb_samples,&#xA;                    resampler_context))&#xA;                goto cleanup;&#xA;    &#xA;            /* Add the converted input samples to the FIFO buffer for later processing. */&#xA;            if (add_samples_to_fifo(fifo, converted_input_samples,&#xA;                                    output_nb_samples))&#xA;                goto cleanup;&#xA;            ret = 0;&#xA;        }&#xA;        ret = 0;&#xA;    &#xA;    cleanup:&#xA;        if (converted_input_samples) {&#xA;            av_freep(&amp;converted_input_samples[0]);&#xA;            free(converted_input_samples);&#xA;        }&#xA;        av_frame_free(&amp;input_frame);&#xA;    &#xA;        return ret;&#xA;    }&#xA;    &#xA;    static int init_output_frame(AVFrame **frame,&#xA;                                 AVCodecContext *output_codec_context,&#xA;                                 int frame_size)&#xA;    {&#xA;        int error;&#xA;    &#xA;        if (!(*frame = av_frame_alloc())) {&#xA;            fprintf(stderr, "Could not allocate output frame\n");&#xA;            return AVERROR_EXIT;&#xA;        }&#xA;    &#xA;        /* Set the frame&#x27;s parameters, especially its size and format.&#xA;         * av_frame_get_buffer needs this to allocate memory for the&#xA;         * audio samples of the frame.&#xA;         * Default channel layouts based on the number of channels&#xA;         * are assumed for simplicity. */&#xA;        (*frame)->nb_samples     = frame_size;&#xA;        (*frame)->channel_layout = output_codec_context->channel_layout;&#xA;        (*frame)->format         = output_codec_context->sample_fmt;&#xA;        (*frame)->sample_rate    = output_codec_context->sample_rate;&#xA;    &#xA;        /* Allocate the samples of the created frame. This call will make&#xA;         * sure that the audio frame can hold as many samples as specified. */&#xA;        if ((error = av_frame_get_buffer(*frame, 0)) &lt; 0) {&#xA;            fprintf(stderr, "Could not allocate output frame samples (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            av_frame_free(frame);&#xA;            return error;&#xA;        }&#xA;    &#xA;        return 0;&#xA;    }&#xA;    &#xA;    /* Global timestamp for the audio frames. */&#xA;    static int64_t pts = 0;&#xA;    &#xA;    /**&#xA;     * Encode one frame worth of audio to the output file.&#xA;     */&#xA;    static int encode_audio_frame(AVFrame *frame,&#xA;                                  AVFormatContext *output_format_context,&#xA;                                  AVCodecContext *output_codec_context,&#xA;                                  int *data_present)&#xA;    {&#xA;        AVPacket *output_packet;&#xA;        int error;&#xA;    &#xA;        error = init_packet(&amp;output_packet);&#xA;        if (error &lt; 0)&#xA;            return error;&#xA;    &#xA;        /* Set a timestamp based on the sample rate for the container. */&#xA;        if (frame) {&#xA;            frame->pts = pts;&#xA;            pts &#x2B;= frame->nb_samples;&#xA;        }&#xA;    &#xA;        *data_present = 0;&#xA;        error = avcodec_send_frame(output_codec_context, frame);&#xA;        if (error &lt; 0 &amp;&amp; error != AVERROR_EOF) {&#xA;          fprintf(stderr, "Could not send packet for encoding (error &#x27;%s&#x27;)\n",&#xA;                  av_err2str(error));&#xA;          goto cleanup;&#xA;        }&#xA;    &#xA;&#xA;        error = avcodec_receive_packet(output_codec_context, output_packet);&#xA;        if (error == AVERROR(EAGAIN)) {&#xA;            error = 0;&#xA;            goto cleanup;&#xA;        } else if (error == AVERROR_EOF) {&#xA;            error = 0;&#xA;            goto cleanup;&#xA;        } else if (error &lt; 0) {&#xA;            fprintf(stderr, "Could not encode frame (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            goto cleanup;&#xA;        } else {&#xA;            *data_present = 1;&#xA;        }&#xA;    &#xA;        /* Write one audio frame from the temporary packet to the output file. */&#xA;        if (*data_present &amp;&amp;&#xA;            (error = av_write_frame(output_format_context, output_packet)) &lt; 0) {&#xA;            fprintf(stderr, "Could not write frame (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            goto cleanup;&#xA;        }&#xA;    &#xA;    cleanup:&#xA;        av_packet_free(&amp;output_packet);&#xA;        return error;&#xA;    }&#xA;    &#xA;    /**&#xA;     * Load one audio frame from the FIFO buffer, encode and write it to the&#xA;     * output file.&#xA;     */&#xA;    static int load_encode_and_write(AVAudioFifo *fifo,&#xA;                                     AVFormatContext *output_format_context,&#xA;                                     AVCodecContext *output_codec_context)&#xA;    {&#xA;        AVFrame *output_frame;&#xA;        /* Use the maximum number of possible samples per frame.&#xA;         * If there is less than the maximum possible frame size in the FIFO&#xA;         * buffer use this number. Otherwise, use the maximum possible frame size. */&#xA;        const int frame_size = FFMIN(av_audio_fifo_size(fifo),&#xA;                                     output_codec_context->frame_size);&#xA;        int data_written;&#xA;    &#xA;        if (init_output_frame(&amp;output_frame, output_codec_context, frame_size))&#xA;            return AVERROR_EXIT;&#xA;    &#xA;        /* Read as many samples from the FIFO buffer as required to fill the frame.&#xA;         * The samples are stored in the frame temporarily. */&#xA;        if (av_audio_fifo_read(fifo, (void **)output_frame->data, frame_size) &lt; frame_size) {&#xA;            fprintf(stderr, "Could not read data from FIFO\n");&#xA;            av_frame_free(&amp;output_frame);&#xA;            return AVERROR_EXIT;&#xA;        }&#xA;    &#xA;        /* Encode one frame worth of audio samples. */&#xA;        if (encode_audio_frame(output_frame, output_format_context,&#xA;                               output_codec_context, &amp;data_written)) {&#xA;            av_frame_free(&amp;output_frame);&#xA;            return AVERROR_EXIT;&#xA;        }&#xA;        av_frame_free(&amp;output_frame);&#xA;        return 0;&#xA;    }&#xA;    &#xA;    /**&#xA;     * Write the trailer of the output file container.&#xA;     */&#xA;    static int write_output_file_trailer(AVFormatContext *output_format_context)&#xA;    {&#xA;        int error;&#xA;        if ((error = av_write_trailer(output_format_context)) &lt; 0) {&#xA;            fprintf(stderr, "Could not write output file trailer (error &#x27;%s&#x27;)\n",&#xA;                    av_err2str(error));&#xA;            return error;&#xA;        }&#xA;        return 0;&#xA;    }&#xA;    &#xA;    int main(int argc, char **argv)&#xA;    {&#xA;        AVFormatContext *input_format_context = NULL, *output_format_context = NULL;&#xA;        AVCodecContext *input_codec_context = NULL, *output_codec_context = NULL;&#xA;        SwrContext *resample_context = NULL;&#xA;        AVAudioFifo *fifo = NULL;&#xA;        int ret = AVERROR_EXIT;&#xA;    &#xA;        if (argc != 3) {&#xA;            fprintf(stderr, "Usage: %s <input file="file" /> <output file="file">\n", argv[0]);&#xA;            exit(1);&#xA;        }&#xA;    &#xA;&#xA;        if (open_input_file(argv[1], &amp;input_format_context,&#xA;                            &amp;input_codec_context))&#xA;            goto cleanup;&#xA;&#xA;        if (open_output_file(argv[2], input_codec_context,&#xA;                             &amp;output_format_context, &amp;output_codec_context))&#xA;            goto cleanup;&#xA;&#xA;        if (init_resampler(input_codec_context, output_codec_context,&#xA;                           &amp;resample_context))&#xA;            goto cleanup;&#xA;&#xA;        if (init_fifo(&amp;fifo, output_codec_context))&#xA;            goto cleanup;&#xA;&#xA;        if (write_output_file_header(output_format_context))&#xA;            goto cleanup;&#xA;    &#xA;        while (1) {&#xA;            /* Use the encoder&#x27;s desired frame size for processing. */&#xA;            const int output_frame_size = output_codec_context->frame_size;&#xA;            int finished                = 0;&#xA;    &#xA;            while (av_audio_fifo_size(fifo) &lt; output_frame_size) {&#xA;                /* Decode one frame worth of audio samples, convert it to the&#xA;                 * output sample format and put it into the FIFO buffer. */&#xA;                if (read_decode_convert_and_store(fifo, input_format_context,&#xA;                                                  input_codec_context,&#xA;                                                  output_codec_context,&#xA;                                                  resample_context, &amp;finished))&#xA;                    goto cleanup;&#xA;    &#xA;                if (finished)&#xA;                    break;&#xA;            }&#xA;    &#xA;            while (av_audio_fifo_size(fifo) >= output_frame_size ||&#xA;                   (finished &amp;&amp; av_audio_fifo_size(fifo) > 0))&#xA;                if (load_encode_and_write(fifo, output_format_context,&#xA;                                          output_codec_context))&#xA;                    goto cleanup;&#xA;    &#xA;            if (finished) {&#xA;                int data_written;&#xA;                do {&#xA;                    if (encode_audio_frame(NULL, output_format_context,&#xA;                                           output_codec_context, &amp;data_written))&#xA;                        goto cleanup;&#xA;                } while (data_written);&#xA;                break;&#xA;            }&#xA;        }&#xA;    &#xA;        if (write_output_file_trailer(output_format_context))&#xA;            goto cleanup;&#xA;        ret = 0;&#xA;    &#xA;    cleanup:&#xA;        if (fifo)&#xA;            av_audio_fifo_free(fifo);&#xA;        swr_free(&amp;resample_context);&#xA;        if (output_codec_context)&#xA;            avcodec_free_context(&amp;output_codec_context);&#xA;        if (output_format_context) {&#xA;            avio_closep(&amp;output_format_context->pb);&#xA;            avformat_free_context(output_format_context);&#xA;        }&#xA;        if (input_codec_context)&#xA;            avcodec_free_context(&amp;input_codec_context);&#xA;        if (input_format_context)&#xA;            avformat_close_input(&amp;input_format_context);&#xA;    &#xA;        return ret;&#xA;    }&#xA;</output>

    &#xA;

  • Converting RGB images into lossless video with avconv / ffmpeg [migrated]

    19 mai 2013, par despens

    I am trying to convert a series of PNG24 images containing a screen animation to a lossless video, so that every pixel is reproduced exactly as it was in the original. But avconv (and ffmpeg) both produce the same, unsatisfying results, which seem to stem from a colospace conversion going wrong.

    This is the version of avconv I am using :

    avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
     built on Apr  2 2013 17:02:36 with gcc 4.6.3

    Each of the images is 1280×800 pixels in size. They do not contain any photographic motives, but specially dithered patterns.

    I used the qtrle codec because apparently this is a lossless codec that works very much like animated GIFs or animated PNGs. However, during the conversion to video there seems to happen a color space conversion ("filter") that is messing with the pixels.

    This is the avconv output :

    $ avconv -f image2 -r 30 -i frames.png/wth-%08d.png -vcodec qtrle -pix_fmt rgb24 -t 15 qtrle-30fps-rgb.mov
    avconv version 0.8.6-4:0.8.6-0ubuntu0.12.04.1, Copyright (c) 2000-2013 the Libav developers
     built on Apr  2 2013 17:02:36 with gcc 4.6.3
    Input #0, image2, from &#39;frames.png/wth-%08d.png&#39;:
     Duration: 00:11:17.96, start: 0.000000, bitrate: N/A
       Stream #0.0: Video: png, bgra, 1280x800, 30 fps, 30 tbr, 30 tbn, 30 tbc
    File &#39;qtrle-30fps-rgb.mov&#39; already exists. Overwrite ? [y/N] y
    [buffer @ 0x740a00] w:1280 h:800 pixfmt:bgra
    [avsink @ 0x742ac0] auto-inserting filter &#39;auto-inserted scaler 0&#39; between the filter &#39;src&#39; and the filter &#39;out&#39;
    [scale @ 0x743680] w:1280 h:800 fmt:bgra -> w:1280 h:800 fmt:rgb24 flags:0x4
    Output #0, mov, to &#39;qtrle-30fps-rgb.mov&#39;:
     Metadata:
       encoder         : Lavf53.21.1
       Stream #0.0: Video: qtrle, rgb24, 1280x800, q=2-31, 200 kb/s, 30 tbn, 30 tbc
    Stream mapping:
     Stream #0:0 -> #0:0 (png -> qtrle)
    Press ctrl-c to stop encoding
    frame=  450 fps= 22 q=0.0 Lsize=  126056kB time=15.00 bitrate=68843.4kbits/s    
    video:126052kB audio:0kB global headers:0kB muxing overhead 0.003441%

    This is an original PNG image file :

    enter image description here

    This is a screenshot of the video being replayed :

    Screenshot of the video being replayed

    Please note that you need to see these images in their original 1280×800 resolution to notice the differences.

    Here is a side-by-side comparison, with the left picture being the original and the right one the outcome after video encoding :

    enter image description here

    Is there any way I can produce a truly lossless, pixel-perfect video file from a series of PNGs ?