Recherche avancée

Médias (2)

Mot : - Tags -/media

Autres articles (111)

  • Script d’installation automatique de MediaSPIP

    25 avril 2011, par

    Afin de palier aux difficultés d’installation dues principalement aux dépendances logicielles coté serveur, un script d’installation "tout en un" en bash a été créé afin de faciliter cette étape sur un serveur doté d’une distribution Linux compatible.
    Vous devez bénéficier d’un accès SSH à votre serveur et d’un compte "root" afin de l’utiliser, ce qui permettra d’installer les dépendances. Contactez votre hébergeur si vous ne disposez pas de cela.
    La documentation de l’utilisation du script d’installation (...)

  • Les notifications de la ferme

    1er décembre 2010, par

    Afin d’assurer une gestion correcte de la ferme, il est nécessaire de notifier plusieurs choses lors d’actions spécifiques à la fois à l’utilisateur mais également à l’ensemble des administrateurs de la ferme.
    Les notifications de changement de statut
    Lors d’un changement de statut d’une instance, l’ensemble des administrateurs de la ferme doivent être notifiés de cette modification ainsi que l’utilisateur administrateur de l’instance.
    À la demande d’un canal
    Passage au statut "publie"
    Passage au (...)

  • Initialisation de MediaSPIP (préconfiguration)

    20 février 2010, par

    Lors de l’installation de MediaSPIP, celui-ci est préconfiguré pour les usages les plus fréquents.
    Cette préconfiguration est réalisée par un plugin activé par défaut et non désactivable appelé MediaSPIP Init.
    Ce plugin sert à préconfigurer de manière correcte chaque instance de MediaSPIP. Il doit donc être placé dans le dossier plugins-dist/ du site ou de la ferme pour être installé par défaut avant de pouvoir utiliser le site.
    Dans un premier temps il active ou désactive des options de SPIP qui ne le (...)

Sur d’autres sites (6680)

  • Matomo analytics for wordpress

    15 octobre 2019, par Matomo Core Team — Community

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

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

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

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

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

    Download now and check it out !

    What do you get ?

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

    We need your feedback !

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

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

    How do you get Matomo Analytics for WordPress ?

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

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

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

    In perfect harmony : Matomo and WordPress

    Matomo Analytics for WordPress

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

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

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

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

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

    Share on facebook
    Share on twitter
    Share on linkedin

    FAQs

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

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

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

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

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

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

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

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

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

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

    Matomo Analytics for WordPress newsletter

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

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

    22 janvier 2020, par Optic_Ray

    I am making video mp4 file from couple of jpg image files with different sizes present as sample< number >.jpg (sample1.jpg, sample2.jpg, etc) in a folder. I modified ffmpeg muxing.c example to make it create mp4 file from these set of jpg images(for frames) and also modified it to create only video stream(no audio stream). It is able to create mp4 file with n video frames from n different jpg image files, but mp4 file it outputs when n=2 isn’t as expected. I have tried from n=1 to n=7 so far. When n=2 mp4 file is created but I could see only first jpg image as frame in the entire video. It appears as if first frame(first jpg image) is duplicated and used as second frame too, as I just can’t find image of second jpg image file when I play the video. When I make video with 2 frames from 2 different jpg files, I want first frame to be first jpg image and second frame to be second jpg image. How do I achieve that ?

    ffmpeg configuration :

    ffmpeg version 3.4.6-0ubuntu0.18.04.1 Copyright (c) 2000-2019 the FFmpeg developers
     built with gcc 7 (Ubuntu 7.3.0-16ubuntu3)
     configuration: --prefix=/usr --extra-version=0ubuntu0.18.04.1 --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --enable-gpl --disable-stripping --enable-avresample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librubberband --enable-librsvg --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libopencv --enable-libx264 --enable-shared
     libavutil      55. 78.100 / 55. 78.100
     libavcodec     57.107.100 / 57.107.100
     libavformat    57. 83.100 / 57. 83.100
     libavdevice    57. 10.100 / 57. 10.100
     libavfilter     6.107.100 /  6.107.100
     libavresample   3.  7.  0 /  3.  7.  0
     libswscale      4.  8.100 /  4.  8.100
     libswresample   2.  9.100 /  2.  9.100
     libpostproc    54.  7.100 / 54.  7.100
    Hyper fast Audio and Video encoder

    Number of frames in video can be set in #define STREAM_FRAME_RATE n//n=number of frames. Following is the entire code :

    #include
    #include <libavutil></libavutil>avassert.h>
    #include <libavutil></libavutil>channel_layout.h>
    #include <libavutil></libavutil>opt.h>
    #include <libavutil></libavutil>mathematics.h>
    #include <libavutil></libavutil>imgutils.h>
    #include <libavutil></libavutil>timestamp.h>
    #include <libavformat></libavformat>avformat.h>
    #include <libswscale></libswscale>swscale.h>
    #include <libswresample></libswresample>swresample.h>

    #define STREAM_DURATION   1
    #define STREAM_FRAME_RATE 2 /* 2 image/s */
    #define STREAM_PIX_FMT    AV_PIX_FMT_YUV420P /* default pix_fmt */

    #define SCALE_FLAGS SWS_BICUBIC

    // a wrapper around a single output AVStream
    typedef struct OutputStream {
       AVStream *st;
       AVCodecContext *enc;

       /* pts of the next frame that will be generated */
       int64_t next_pts;
       int samples_count;

       AVFrame *frame;
       AVFrame *tmp_frame;

       float t, tincr, tincr2;

       struct SwsContext *sws_ctx;
       struct SwrContext *swr_ctx;
    } OutputStream;

    static void log_packet(const AVFormatContext *fmt_ctx, const AVPacket *pkt)
    {
       AVRational *time_base = &amp;fmt_ctx->streams[pkt->stream_index]->time_base;

       printf("pts:%s pts_time:%s dts:%s dts_time:%s duration:%s duration_time:%s stream_index:%d\n",
              av_ts2str(pkt->pts), av_ts2timestr(pkt->pts, time_base),
              av_ts2str(pkt->dts), av_ts2timestr(pkt->dts, time_base),
              av_ts2str(pkt->duration), av_ts2timestr(pkt->duration, time_base),
              pkt->stream_index);
    }

    static int write_frame(AVFormatContext *fmt_ctx, const AVRational *time_base, AVStream *st, AVPacket *pkt)
    {
       /* rescale output packet timestamp values from codec to stream timebase */
       av_packet_rescale_ts(pkt, *time_base, st->time_base);
       pkt->stream_index = st->index;
       /* Write the compressed frame to the media file. */
       log_packet(fmt_ctx, pkt);
       return av_interleaved_write_frame(fmt_ctx, pkt);
    }

    /* Add an output stream. */
    static void add_stream(OutputStream *ost, AVFormatContext *oc,
                          AVCodec **codec,
                          enum AVCodecID codec_id)
    {
       AVCodecContext *c;
       int i;
       /* find the encoder */
       *codec = avcodec_find_encoder(codec_id);
       if (!(*codec)) {
           fprintf(stderr, "Could not find encoder for '%s'\n",
                   avcodec_get_name(codec_id));
           exit(1);
       }

       ost->st = avformat_new_stream(oc, NULL);
       if (!ost->st) {
           fprintf(stderr, "Could not allocate stream\n");
           exit(1);
       }
       ost->st->id = oc->nb_streams-1;
       c = avcodec_alloc_context3(*codec);
       if (!c) {
           fprintf(stderr, "Could not alloc an encoding context\n");
           exit(1);
       }
       ost->enc = c;

       switch ((*codec)->type) {
       case AVMEDIA_TYPE_AUDIO:
       printf("######################2 audio add stream\n");
           c->sample_fmt  = (*codec)->sample_fmts ?
               (*codec)->sample_fmts[0] : AV_SAMPLE_FMT_FLTP;
           c->bit_rate    = 64000;
           c->sample_rate = 44100;
           if ((*codec)->supported_samplerates) {
               c->sample_rate = (*codec)->supported_samplerates[0];
               for (i = 0; (*codec)->supported_samplerates[i]; i++) {
                   if ((*codec)->supported_samplerates[i] == 44100)
                       c->sample_rate = 44100;
               }
           }
           c->channels        = av_get_channel_layout_nb_channels(c->channel_layout);
           c->channel_layout = AV_CH_LAYOUT_STEREO;
           if ((*codec)->channel_layouts) {
               c->channel_layout = (*codec)->channel_layouts[0];
               for (i = 0; (*codec)->channel_layouts[i]; i++) {
                   if ((*codec)->channel_layouts[i] == AV_CH_LAYOUT_STEREO)
                       c->channel_layout = AV_CH_LAYOUT_STEREO;
               }
           }
           c->channels        = av_get_channel_layout_nb_channels(c->channel_layout);
           ost->st->time_base = (AVRational){ 1, c->sample_rate };
           break;

       case AVMEDIA_TYPE_VIDEO:
       printf("###################### video add stream\n");
           c->codec_id = codec_id;

           c->bit_rate = 400000;
           /* Resolution must be a multiple of two. */
           c->width    = 352;
           c->height   = 288;
           /* timebase: This is the fundamental unit of time (in seconds) in terms
            * of which frame timestamps are represented. For fixed-fps content,
            * timebase should be 1/framerate and timestamp increments should be
            * identical to 1. */
           ost->st->time_base = (AVRational){ 1, STREAM_FRAME_RATE };
           c->time_base       = ost->st->time_base;

           c->gop_size      = 12; /* emit one intra frame every twelve frames at most */
           c->pix_fmt       = STREAM_PIX_FMT;
           if (c->codec_id == AV_CODEC_ID_MPEG2VIDEO) {
               /* just for testing, we also add B-frames */
               c->max_b_frames = 2;//2
           }
           if (c->codec_id == AV_CODEC_ID_MPEG1VIDEO) {
               /* Needed to avoid using macroblocks in which some coeffs overflow.
                * This does not happen with normal video, it just happens here as
                * the motion of the chroma plane does not match the luma plane. */
               c->mb_decision = 2;//2
           }
       break;

       default:
           break;
       }

       /* Some formats want stream headers to be separate. */
       if (oc->oformat->flags &amp; AVFMT_GLOBALHEADER)
           c->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
    }


    /**************************************************************/
    /* video output */

    static AVFrame *alloc_picture(enum AVPixelFormat pix_fmt, int width, int height)
    {
       AVFrame *picture;
       int ret;

       picture = av_frame_alloc();
       if (!picture)
           return NULL;

       picture->format = pix_fmt;
       picture->width  = width;
       picture->height = height;

       /* allocate the buffers for the frame data */
       ret = av_frame_get_buffer(picture, 32);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not allocate frame data.\n");
           exit(1);
       }

       return picture;
    }

    static void open_video(AVFormatContext *oc, AVCodec *codec, OutputStream *ost, AVDictionary *opt_arg)
    {
       int ret;
       AVCodecContext *c = ost->enc;
       AVDictionary *opt = NULL;

       av_dict_copy(&amp;opt, opt_arg, 0);
       printf("In open video\n");
       /* open the codec */
       ret = avcodec_open2(c, codec, &amp;opt);
       av_dict_free(&amp;opt);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not open video codec: %s\n", av_err2str(ret));
           exit(1);
       }

       /* allocate and init a re-usable frame */
       ost->frame = alloc_picture(c->pix_fmt, c->width, c->height);
       if (!ost->frame) {
           fprintf(stderr, "Could not allocate video frame\n");
           exit(1);
       }

       /* If the output format is not YUV420P, then a temporary YUV420P
        * picture is needed too. It is then converted to the required
        * output format. */
       ost->tmp_frame = NULL;
       if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
           ost->tmp_frame = alloc_picture(AV_PIX_FMT_YUV420P, c->width, c->height);
           if (!ost->tmp_frame) {
               fprintf(stderr, "Could not allocate temporary picture\n");
               exit(1);
           }
       }

       /* copy the stream parameters to the muxer */
       ret = avcodec_parameters_from_context(ost->st->codecpar, c);
       if (ret &lt; 0) {
           fprintf(stderr, "Could not copy the stream parameters\n");
           exit(1);
       }
    }

    int open_image(const char* imageFileName,int width,int height,AVFrame *pict)
    {
       AVFormatContext *pFormatContext = avformat_alloc_context();
           if (!pFormatContext)
           {
               printf("ERROR could not allocate memory for Format Context");
               return 0;
           }
       //av_register_all();
       if (avformat_open_input(&amp;pFormatContext, imageFileName, NULL, NULL) != 0)
           {
           printf("ERROR could not open the file");
           return 0;
           }
       printf("format %s, duration %ld us, bit_rate %ld", pFormatContext->iformat->name, pFormatContext->duration, pFormatContext->bit_rate);
       if (avformat_find_stream_info(pFormatContext,  NULL) &lt; 0)
           {
           printf("ERROR could not get the stream info");
           return 0;
           }
       AVCodecParameters *pCodecParameters = pFormatContext->streams[0]->codecpar;
       printf("%d",pFormatContext->nb_streams);
       AVCodec *pCodec = avcodec_find_decoder(AV_CODEC_ID_MJPEG);
       if (pCodec==NULL) {
           printf("ERROR unsupported codecopenimage!");
           printf("---------------------------------------11");
           return 0;
           }
       AVCodecContext *pCodecCtx =avcodec_alloc_context3(pCodec);
       if (!pCodecCtx)
           {
               printf("failed to allocated memory for AVCodecContext");
               return 0;
           }
           pCodecCtx->width = pCodecParameters->width;
           pCodecCtx->height = pCodecParameters->height;
           pCodecCtx->pix_fmt = AV_PIX_FMT_YUV420P;
       if(pCodecCtx->color_range==AVCOL_RANGE_JPEG) printf("\nAVCOL_RANGE_JPEG\n");
       if (avcodec_parameters_to_context(pCodecCtx, pCodecParameters) &lt; 0)
           {
               printf("failed to copy codec params to codec context");
               return 0;
           }
       // Open codec
           if(avcodec_open2(pCodecCtx, pCodec,NULL)&lt;0)
               {
               printf("Could not open codec");
               return 0;
               }

           AVFrame *pFrame = av_frame_alloc();
           if (!pFrame)
               {
               printf("Can't allocate memory for AVFrame\n");
               return 0;
               }

           AVPacket *packet= av_packet_alloc();

           int temp=av_read_frame(pFormatContext, packet);
           while (temp >= 0)
               {
               if(packet->stream_index != 0){
                       continue;}
               int ret = avcodec_send_packet(pCodecCtx,packet);
               if (ret &lt; 0)
                   {
               printf("Error while sending a packet to the decoder: %s", av_err2str(ret));
                   return 0;
                   }
           ret = avcodec_receive_frame(pCodecCtx,pFrame);
               if (ret = 0 || ret != AVERROR(EAGAIN) || ret != AVERROR_EOF)
                   {
                       pFrame->quality = 1;
                   av_packet_unref(packet);
                   struct SwsContext *resize;
                   resize = sws_getContext(pCodecParameters->width, pCodecParameters->height,
                                             AV_PIX_FMT_YUVJ420P,
                                             width, height,
                                             AV_PIX_FMT_YUV420P,
                                             SCALE_FLAGS, NULL, NULL, NULL);
                   sws_scale(resize,(const uint8_t * const *)pFrame->data, pFrame->linesize,
                     0, pCodecParameters->height, pict->data, pict->linesize);
               av_packet_free(&amp;packet);
               avcodec_free_context(&amp;pCodecCtx);
               avformat_close_input(&amp;pFormatContext);
                       return 1;
                   }
               else {
                       printf("Error [%d] while decoding frame: %s\n", ret,
               strerror(AVERROR(ret)));
               return 0;
                   }
               }
       avcodec_free_context(&amp;pCodecCtx);
       avformat_close_input(&amp;pFormatContext);
       return 0;
       }

    static void fill_yuv_image(AVFrame *pict, int frame_index,
                              int width, int height)
    {
       int ret;
       /* when we pass a frame to the encoder, it may keep a reference to it
        * internally;
        * make sure we do not overwrite it here*/

       ret = av_frame_make_writable(pict);
       if (ret &lt; 0)
           exit(1);

       char filename[256];
       sprintf(filename, "sample%d.jpg", frame_index+1);

       if(open_image(filename,width,height,pict)!=1) exit(1);
    }

    static AVFrame *get_video_frame(OutputStream *ost)
    {
       AVCodecContext *c = ost->enc;
       /* check if we want to generate more frames */
       if (av_compare_ts(ost->next_pts, c->time_base,
                         STREAM_DURATION, (AVRational){ 1, 1 }) >= 0)
           return NULL;

       if (c->pix_fmt != AV_PIX_FMT_YUV420P) {
           /* as we only generate a YUV420P picture, we must convert it
            * to the codec pixel format if needed */
           if (!ost->sws_ctx) {
               ost->sws_ctx = sws_getContext(c->width, c->height,
                                             AV_PIX_FMT_YUV420P,
                                             c->width, c->height,
                                             c->pix_fmt,
                                             SCALE_FLAGS, NULL, NULL, NULL);
               if (!ost->sws_ctx) {
                   fprintf(stderr,
                           "Could not initialize the conversion context\n");
                   exit(1);
               }
           }
           fill_yuv_image(ost->tmp_frame, ost->next_pts, c->width, c->height);
           sws_scale(ost->sws_ctx,
                     (const uint8_t * const *)ost->tmp_frame->data, ost->tmp_frame->linesize,
                     0, c->height, ost->frame->data, ost->frame->linesize);
       } else {
           fill_yuv_image(ost->frame, ost->next_pts, c->width, c->height);
       }

       ost->frame->pts = ost->next_pts++;

       return ost->frame;
    }

    /*
    * encode one video frame and send it to the muxer
    * return 1 when encoding is finished, 0 otherwise
    */
    static int write_video_frame(AVFormatContext *oc, OutputStream *ost)
    {
       int ret;
       AVCodecContext *c;
       AVFrame *frame;
       int got_packet = 0;
       AVPacket pkt = { 0 };

       c = ost->enc;
       printf("In write_video_frame\n");
       frame = get_video_frame(ost);

       av_init_packet(&amp;pkt);

       /* encode the image */
       ret = avcodec_encode_video2(c, &amp;pkt, frame, &amp;got_packet);
       if (ret &lt; 0) {
           fprintf(stderr, "Error encoding video frame: %s\n", av_err2str(ret));
           exit(1);
       }
       if (got_packet) {
           ret = write_frame(oc, &amp;c->time_base, ost->st, &amp;pkt);
       } else {
           ret = 0;
       }
       if (ret &lt; 0) {
           fprintf(stderr, "Error while writing video frame: %s\n", av_err2str(ret));
           exit(1);
       }

       return (frame || got_packet) ? 0 : 1;
    }

    static void close_stream(AVFormatContext *oc, OutputStream *ost)
    {
       avcodec_free_context(&amp;ost->enc);
       av_frame_free(&amp;ost->frame);
       av_frame_free(&amp;ost->tmp_frame);
       sws_freeContext(ost->sws_ctx);
       swr_free(&amp;ost->swr_ctx);
    }

    /**************************************************************/
    /* media file output */

    int main(int argc, char **argv)
    {
       OutputStream video_st = { 0 };
       const char *filename;
       AVOutputFormat *fmt;
       AVFormatContext *oc;
       AVCodec *video_codec;
       int ret;
       int have_video = 0;
       int encode_video = 0;
       AVDictionary *opt = NULL;
       int i;

       /* Initialize libavcodec, and register all codecs and formats. */
       av_register_all();

       if (argc &lt; 2) {
           printf("usage: %s output_file\n"
                  "API example program to output a media file with libavformat.\n"
                  "This program generates a synthetic audio and video stream, encodes and\n"
                  "muxes them into a file named output_file.\n"
                  "The output format is automatically guessed according to the file extension.\n"
                  "Raw images can also be output by using '%%d' in the filename.\n"
                  "\n", argv[0]);
           return 1;
       }

       filename = argv[1];
       for (i = 2; i+1 &lt; argc; i+=2) {
           if (!strcmp(argv[i], "-flags") || !strcmp(argv[i], "-fflags"))
               av_dict_set(&amp;opt, argv[i]+1, argv[i+1], 0);
       }

       /* allocate the output media context */
       avformat_alloc_output_context2(&amp;oc, NULL, NULL, filename);
       if (!oc) {
           printf("Could not deduce output format from file extension: using MPEG.\n");
           avformat_alloc_output_context2(&amp;oc, NULL, "mpeg", filename);
       }
       if (!oc)
           return 1;

       fmt = oc->oformat;

       /* Add the audio and video streams using the default format codecs
        * and initialize the codecs. */
       if (fmt->video_codec != AV_CODEC_ID_NONE) {
           add_stream(&amp;video_st, oc, &amp;video_codec, fmt->video_codec);
           have_video = 1;
           encode_video = 1;
       }

       /* Now that all the parameters are set, we can open the audio and
        * video codecs and allocate the necessary encode buffers. */
       if (have_video)
           open_video(oc, video_codec, &amp;video_st, opt);

       av_dump_format(oc, 0, filename, 1);

       /* open the output file, if needed */
       if (!(fmt->flags &amp; AVFMT_NOFILE)) {
           ret = avio_open(&amp;oc->pb, filename, AVIO_FLAG_WRITE);
           if (ret &lt; 0) {
               fprintf(stderr, "Could not open '%s': %s\n", filename,
                       av_err2str(ret));
               return 1;
           }
       }

       /* Write the stream header, if any. */
       ret = avformat_write_header(oc, &amp;opt);
       if (ret &lt; 0) {
           fprintf(stderr, "Error occurred when opening output file: %s\n",
                   av_err2str(ret));
           return 1;
       }
       while (encode_video) {
           /* select the stream to encode */
       printf("######################\n");
           if (encode_video &amp;&amp;
               (av_compare_ts(video_st.next_pts, video_st.enc->time_base,STREAM_DURATION, (AVRational){ 1, 1 }) &lt;= 0)) {
               encode_video = !write_video_frame(oc, &amp;video_st);
           }
       }

       av_write_trailer(oc);

       /* Close each codec. */
       if (have_video)
           close_stream(oc, &amp;video_st);

       if (!(fmt->flags &amp; AVFMT_NOFILE))
           /* Close the output file. */
           avio_closep(&amp;oc->pb);

       /* free the stream */
       avformat_free_context(oc);

       return 0;
    }```
  • Cannot play local RTP stream

    24 janvier 2020, par gdogg371

    I have been struggling along with this issue now for a while, but am making good progress. I now have a 4k transport stream running using the below command line arguments for VLC :

    vlc --ffmpeg-hw --avcodec-hw=any dshow:// :dshow-vdev="Video (00 Pro Capture HDMI 4K+)" :dshow-adev="Audio (2- 00 Pro Capture HDMI 4K+)" :dshow-threads=8 :dshow-aspect-ratio=16\:9 :dshow-size="3840x2160" :dshow-pixel_format=yuv444p16le :dshow-tune=film :dshow-preset=lossless :dshow-profile=main10 show-vcodec=hevc_nvenc :dshow-fps=50 :dshow-crf=0 :dshow-acodec=mp4a :dshow-stereo-mode=5 :dshow-force-surround-sound=0 :dshow-ab=128 :dshow-samplerate=44100 :no-dshow-config :live-caching=3000 --sout "#transcode{venc=ffmpeg,vcodec=mpgv,threads=8,aspect=16:9,width=3840,height=2160,fps=50,acodec=a52,ab=1500,channels=6,samplerate=48000,soverlay}:rtp{dst=239.255.0.1,port=5004,mux=ts}"

    I can access the rtp stream on the same PC as I am running the stream from with the below :

    vlc -vvv rtp://@239.255.0.1:5004

    However, if I try the same commands on a different computer, connected via Ethernet to the same network, the client VLC session just hangs. I have included the log below with the verbosity set to debug. Can anyone spot anything in here suggesting why the stream won’t play ?

    -- logger module started --
    main debug: VLC media player - 3.0.8 Vetinari
    main debug: Copyright © 1996-2019 the VideoLAN team
    main debug: revision 3.0.8-0-gf350b6b5a7
    main debug: configured with ../extras/package/win32/../../../configure  '--enable-update-check' '--enable-lua' '--enable-faad' '--enable-flac' '--enable-theora' '--enable-avcodec' '--enable-merge-ffmpeg' '--enable-dca' '--enable-mpc' '--enable-libass' '--enable-schroedinger' '--enable-realrtsp' '--enable-live555' '--enable-dvdread' '--enable-shout' '--enable-goom' '--enable-caca' '--enable-qt' '--enable-skins2' '--enable-sse' '--enable-mmx' '--enable-libcddb' '--enable-zvbi' '--disable-telx' '--enable-nls' '--host=x86_64-w64-mingw32' '--with-breakpad=https://win.crashes.videolan.org' 'host_alias=x86_64-w64-mingw32' 'PKG_CONFIG_LIBDIR=/home/jenkins/workspace/vlc-release/windows/vlc-release-win32-x64/contrib/x86_64-w64-mingw32/lib/pkgconfig'
    main debug: using multimedia timers as clock source
    main debug:  min period: 1 ms, max period: 1000000 ms
    main debug: searching plug-in modules
    main debug: loading plugins cache file D:\VLC\plugins\plugins.dat
    main debug: recursively browsing `D:\VLC\plugins'
    main error: stale plugins cache: modified D:\VLC\plugins\access\libaccess_concat_plugin.dll
    main error: stale plugins cache: modified D:\VLC\plugins\access\libaccess_imem_plugin.dll
    ....
    ....
    ....
    main error: stale plugins cache: modified D:\VLC\plugins\visualization\libgoom_plugin.dll
    main error: stale plugins cache: modified D:\VLC\plugins\visualization\libprojectm_plugin.dll
    main error: stale plugins cache: modified D:\VLC\plugins\visualization\libvisual_plugin.dll
    main debug: plug-ins loaded: 494 modules
    main debug: opening config file (C:\Users\cg371\AppData\Roaming\vlc\vlcrc)
    main debug: looking for logger module matching "any": 2 candidates
    file debug: opening logfile `D:\VLC\Log.txt'
    main debug: using logger module "file"
    main debug: translation test: code is "en_GB"
    main debug: looking for keystore module matching "memory": 3 candidates
    main debug: using keystore module "memory"
    main debug: CPU has capabilities MMX MMXEXT SSE SSE2 SSE3 SSSE3 SSE4.1 SSE4.2 FPU
    main debug: Creating an input for 'Media Library'
    main debug: Input is a meta file: disabling unneeded options
    main debug: using timeshift granularity of 50 MiB
    main debug: using timeshift path: C:\Users\cg371\AppData\Local\Temp
    main debug: `file/directory:///C:/Users/cg371/AppData/Roaming/vlc/ml.xspf' gives access `file' demux `directory' path `/C:/Users/cg371/AppData/Roaming/vlc/ml.xspf'
    main debug: creating demux: access='file' demux='directory' location='/C:/Users/cg371/AppData/Roaming/vlc/ml.xspf' file='C:\Users\cg371\AppData\Roaming\vlc\ml.xspf'
    main debug: looking for access_demux module matching "file": 15 candidates
    main debug: no access_demux modules matched
    main debug: creating access: file:///C:/Users/cg371/AppData/Roaming/vlc/ml.xspf
    main debug:  (path: C:\Users\cg371\AppData\Roaming\vlc\ml.xspf)
    main debug: looking for access module matching "file": 26 candidates
    main debug: using access module "filesystem"
    main debug: looking for stream_filter module matching "prefetch,cache_read": 24 candidates
    cache_read debug: Using stream method for AStream*
    cache_read debug: starting pre-buffering
    cache_read debug: received first data after 1 ms
    cache_read debug: pre-buffering done 304 bytes in 0s - 296 KiB/s
    main debug: using stream_filter module "cache_read"
    main debug: looking for stream_filter module matching "any": 24 candidates
    playlist debug: using XSPF playlist reader
    main debug: using stream_filter module "playlist"
    main debug: stream filter added to 00000266f6927700
    main debug: looking for stream_filter module matching "any": 24 candidates
    main debug: no stream_filter modules matched
    main debug: looking for stream_directory module matching "any": 1 candidates
    main debug: no stream_directory modules matched
    main debug: attachment of directory-extractor failed for file:///C:/Users/cg371/AppData/Roaming/vlc/ml.xspf
    main debug: looking for stream_filter module matching "record": 24 candidates
    main debug: using stream_filter module "record"
    main debug: creating demux: access='file' demux='directory' location='/C:/Users/cg371/AppData/Roaming/vlc/ml.xspf' file='C:\Users\cg371\AppData\Roaming\vlc\ml.xspf'
    main debug: looking for demux module matching "directory": 55 candidates
    main debug: using demux module "directory"
    main debug: looking for meta reader module matching "any": 2 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\reader
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\reader
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\reader\filename.luac
    main debug: no meta reader modules matched
    main debug: `file/directory:///C:/Users/cg371/AppData/Roaming/vlc/ml.xspf' successfully opened
    main debug: looking for xml reader module matching "any": 1 candidates
    main debug: using xml reader module "xml"
    main debug: EOF reached
    main debug: removing module "directory"
    main debug: removing module "record"
    main debug: removing module "playlist"
    main debug: removing module "cache_read"
    main debug: removing module "filesystem"
    main debug: creating audio output
    main debug: looking for audio output module matching "any": 6 candidates
    mmdevice debug: using default device
    mmdevice debug: display name changed: VLC media player (LibVLC 3.0.8)
    mmdevice debug: version 2 session control unavailable
    mmdevice debug: volume from -65.250000 dB to +0.000000 dB with 0.031250 dB increments
    main debug: using audio output module "mmdevice"
    main debug: keeping audio output
    main debug: looking for interface module matching "hotkeys,none": 16 candidates
    main debug: using interface module "hotkeys"
    main debug: looking for interface module matching "globalhotkeys,none": 16 candidates
    main debug: using interface module "win32"
    main: Running vlc with the default interface. Use 'cvlc' to use vlc without interface.
    main debug: looking for interface module matching "any": 16 candidates
    main debug: looking for extension module matching "any": 1 candidates
    lua debug: Opening Lua Extension module
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\extensions
    lua debug: Trying Lua scripts in D:\VLC\lua\extensions
    lua debug: Trying Lua playlist script D:\VLC\lua\extensions\VLSub.luac
    lua debug: Scanning Lua script D:\VLC\lua\extensions\VLSub.luac
    lua debug: Script D:\VLC\lua\extensions\VLSub.luac has the following capability flags: 0x5
    main debug: using extension module "lua"
    main debug: using interface module "qt"
    main debug: processing request item: null, node: Playlist, skip: 0
    main debug: rebuilding array of current - root Playlist
    main debug: rebuild done - 1 items, index -1
    main debug: starting playback of new item
    main debug: resyncing on rtp://239.255.0.1:5004
    main debug: rtp://239.255.0.1:5004 is at 0
    main debug: creating new input thread
    main debug: Creating an input for 'rtp://239.255.0.1:5004'
    main debug: requesting art for new input thread
    main debug: using timeshift granularity of 50 MiB
    main debug: using timeshift path: C:\Users\cg371\AppData\Local\Temp
    main debug: `rtp://@239.255.0.1:5004' gives access `rtp' demux `any' path `@239.255.0.1:5004'
    main debug: creating demux: access='rtp' demux='any' location='@239.255.0.1:5004' file='\\@239.255.0.1:5004'
    main debug: looking for access_demux module matching "rtp": 15 candidates
    main debug: net: opening 239.255.0.1 datagram port 5004
    qt debug: IM: Setting an input
    main debug: looking for meta fetcher module matching "any": 1 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\fetcher
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\fetcher
    main debug: no meta fetcher modules matched
    main debug: looking for art finder module matching "any": 2 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\art
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\art
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\00_musicbrainz.luac
    lua debug: skipping script (unmatched scope) D:\VLC\lua\meta\art\00_musicbrainz.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\01_googleimage.luac
    lua debug: skipping script (unmatched scope) D:\VLC\lua\meta\art\01_googleimage.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\02_frenchtv.luac
    lua debug: skipping script (unmatched scope) D:\VLC\lua\meta\art\02_frenchtv.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\03_lastfm.luac
    main debug: using access_demux module "rtp"
    main debug: looking for meta reader module matching "any": 2 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\reader
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\reader
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\reader\filename.luac
    lua debug: skipping script (unmatched scope) D:\VLC\lua\meta\art\03_lastfm.luac
    main debug: no art finder modules matched
    main debug: no meta reader modules matched
    main debug: `rtp://@239.255.0.1:5004' successfully opened
    main debug: looking for meta fetcher module matching "any": 1 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\fetcher
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\fetcher
    main debug: no meta fetcher modules matched
    main debug: looking for art finder module matching "any": 2 candidates
    lua debug: Trying Lua scripts in C:\Users\cg371\AppData\Roaming\vlc\lua\meta\art
    lua debug: Trying Lua scripts in D:\VLC\lua\meta\art
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\00_musicbrainz.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\01_googleimage.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\02_frenchtv.luac
    lua debug: Trying Lua playlist script D:\VLC\lua\meta\art\03_lastfm.luac
    main debug: no art finder modules matched
    main debug: exiting
    main debug: exiting
    main debug: no exit handler
    main debug: removing all interfaces
    main debug: removing module "qt"
    main debug: deactivating the playlist
    main debug: incoming request - stopping current input
    main debug: removing module "rtp"
    main debug: dead input
    main debug: nothing to play
    main debug: removing module "mmdevice"
    qt debug: requesting exit...
    qt debug: waiting for UI thread...
    qt debug: IM: Deleting the input
    qt debug: QApp exec() finished
    qt debug: Video is not needed anymore
    qt debug: Killing extension dialog provider
    qt debug: ExtensionsDialogProvider is quitting...
    main debug: removing module "lua"
    main debug: removing module "win32"
    main debug: removing module "hotkeys"
    main debug: destroying
    main debug: saving media library to file C:\Users\cg371\AppData\Roaming\vlc\ml.xspf.tmp14968
    main debug: looking for playlist export module matching "export-xspf": 4 candidates
    main debug: using playlist export module "export"
    main debug: removing module "export"
    main debug: deleting item `Media Library'
    main debug: deleting item `rtp://239.255.0.1:5004'
    main debug: deleting item `Playlist'
    main debug: removing module "memory"
    -- logger module stopped --