Recherche avancée

Médias (91)

Autres articles (57)

  • Pas question de marché, de cloud etc...

    10 avril 2011

    Le vocabulaire utilisé sur ce site essaie d’éviter toute référence à la mode qui fleurit allègrement
    sur le web 2.0 et dans les entreprises qui en vivent.
    Vous êtes donc invité à bannir l’utilisation des termes "Brand", "Cloud", "Marché" etc...
    Notre motivation est avant tout de créer un outil simple, accessible à pour tout le monde, favorisant
    le partage de créations sur Internet et permettant aux auteurs de garder une autonomie optimale.
    Aucun "contrat Gold ou Premium" n’est donc prévu, aucun (...)

  • Dépôt de média et thèmes par FTP

    31 mai 2013, par

    L’outil MédiaSPIP traite aussi les média transférés par la voie FTP. Si vous préférez déposer par cette voie, récupérez les identifiants d’accès vers votre site MédiaSPIP et utilisez votre client FTP favori.
    Vous trouverez dès le départ les dossiers suivants dans votre espace FTP : config/ : dossier de configuration du site IMG/ : dossier des média déjà traités et en ligne sur le site local/ : répertoire cache du site web themes/ : les thèmes ou les feuilles de style personnalisées tmp/ : dossier de travail (...)

  • Activation de l’inscription des visiteurs

    12 avril 2011, par

    Il est également possible d’activer l’inscription des visiteurs ce qui permettra à tout un chacun d’ouvrir soit même un compte sur le canal en question dans le cadre de projets ouverts par exemple.
    Pour ce faire, il suffit d’aller dans l’espace de configuration du site en choisissant le sous menus "Gestion des utilisateurs". Le premier formulaire visible correspond à cette fonctionnalité.
    Par défaut, MediaSPIP a créé lors de son initialisation un élément de menu dans le menu du haut de la page menant (...)

Sur d’autres sites (6078)

  • Prepare mp4 videos for Media Source Extensions API using ffmpeg

    6 février 2018, par ler

    This command produce init.mp4 + bunch of m4s files, i’m trying to play them using MSE :

    ffmpeg -i <input file="file" /> -f hls -hls_segment_type fmp4 -c:v copy playlist.m3u8

    This is the client side code i’m using :

    var socket = io();
    var video = document.querySelector('video');
    var mimeCodec = 'video/mp4; codecs="avc1.64000d,mp4a.40.2"';
    if ('MediaSource' in window &amp;&amp; MediaSource.isTypeSupported(mimeCodec)) {
       var mediaSource = new MediaSource;
       video.src = URL.createObjectURL(mediaSource);
       mediaSource.addEventListener('sourceopen', sourceOpen);
    } else {
       console.error('Unsupported MIME type or codec: ', mimeCodec);
    }
    function sourceOpen (_) {
     var mediaSource = this;
     var sourceBuffer = mediaSource.addSourceBuffer(mimeCodec);
     sourceBuffer.mode = 'sequence';
     socket.on('broadcast', function (newPiece) {
         // here i'm getting the buffer of the video  == buffer
         sourceBuffer.addEventListener('updateend', function (_) {
           video.play().then(function() { }).catch(function(error) { });
         });
         sourceBuffer.appendBuffer(buffer); // when the seconde video comes i append it's buffer
     })
    };

    Everything works fine when i send init.mp4 file followed by playlist0.m4s, playlist1.m4s, playlist2.m4s, .....
    But when i try to play init.mp4 file followed immediately 6,7,8 not 0,1,2 meaning playlist6.m4s, playlist7.m4s, playlist8.m4s, ...., it didn’t work.
    I don’t know why, this supposed to be live video, the viewer that is watching the live from the beginning gets init.mp4, playlist0.m4s, playlist1.m4s, playlist2.m4s, .....
    Someone that came after 5 minutes gets something like this init.mp4, playlist32.m4s, playlist33.m4s, playlist34.m4s, .... and so on, but so far it works only for the viewer that get’s init.mp4, playlist0.m4s, playlist1.m4s, playlist2.m4s, ..... the video can’t play for the others

  • Why is a file unplayable in Windows Media Player ?

    21 février 2024, par zhang

    I have written some code to generate a MP4 video. This is a simplified version of the code :

    &#xA;

    #include <iostream>&#xA;#include <fstream>&#xA;#include <cstdio>&#xA;#include <string>&#xA;#include <list>&#xA;#include &#xA;&#xA;extern "C"&#xA;{&#xA;#include "libavformat/avformat.h"&#xA;#include "libavutil/frame.h"&#xA;#include "libavcodec/avcodec.h"&#xA;#include "libavutil/imgutils.h"&#xA;}&#xA;using namespace std;&#xA;&#xA;const int output_width = 180;&#xA;const int output_height = 320;&#xA;&#xA;int main(int argc, char **argv)&#xA;{&#xA;    AVCodec *output_avc = avcodec_find_encoder_by_name("libx264");&#xA;    if (!output_avc)&#xA;        abort();&#xA;    AVCodecContext *output_cc = avcodec_alloc_context3(output_avc);&#xA;    if (!output_cc)&#xA;        abort();&#xA;&#xA;    output_cc->time_base.num = output_cc->time_base.den = 1;&#xA;    output_cc->pix_fmt = AV_PIX_FMT_YUV420P;&#xA;&#xA;    output_cc->width = output_width;&#xA;    output_cc->height = output_height;&#xA;&#xA;    if (avcodec_is_open(output_cc) == 0)&#xA;    {&#xA;        if (avcodec_open2(output_cc, output_avc, 0) &lt; 0)&#xA;            abort();&#xA;    }&#xA;&#xA;    string outf = "res.mp4";&#xA;    AVFormatContext *output_ctx;&#xA;    avformat_alloc_output_context2(&amp;output_ctx, NULL, NULL, outf.c_str());&#xA;    AVStream *out_stream = avformat_new_stream(output_ctx, 0);&#xA;    out_stream->codecpar->codec_id = AV_CODEC_ID_H264;&#xA;    out_stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;&#xA;    out_stream->codecpar->codec_tag = 0;&#xA;    out_stream->codecpar->width = output_width;&#xA;    out_stream->codecpar->height = output_height;&#xA;    out_stream->codecpar->format = AV_PIX_FMT_YUV420P;&#xA;    av_dump_format(output_ctx, 0, outf.c_str(), 1);&#xA;    if (!(output_ctx->oformat->flags &amp; AVFMT_NOFILE))&#xA;    {&#xA;        if (avio_open(&amp;output_ctx->pb, outf.c_str(), AVIO_FLAG_WRITE) &lt; 0)&#xA;            abort();&#xA;    }&#xA;    if (avformat_write_header(output_ctx, NULL) &lt; 0)&#xA;        abort();&#xA;&#xA;    AVPacket packet;&#xA;    AVFrame *frame;&#xA;    int fileCount = 0;&#xA;&#xA;    for (int i = 0; i &lt; 100; i&#x2B;&#x2B;)&#xA;    {&#xA;        frame = av_frame_alloc();&#xA;        frame->width = output_width;&#xA;        frame->height = output_height;&#xA;        frame->format = AV_PIX_FMT_YUV420P;&#xA;        if (av_image_alloc(frame->data, frame->linesize, frame->width, frame->height, AV_PIX_FMT_YUV420P, 32) &lt; 0)&#xA;            abort();&#xA;        frame->pts = 60000 * i;&#xA;        frame->pkt_dts = 60000 * i;&#xA;        if (avcodec_send_frame(output_cc, frame) &lt; 0)&#xA;            abort();&#xA;        av_frame_free(&amp;frame);&#xA;&#xA;        av_new_packet(&amp;packet, 0);&#xA;        while (avcodec_receive_packet(output_cc, &amp;packet) >= 0)&#xA;        {&#xA;            packet.pos = -1;&#xA;            packet.dts = 4500 * fileCount;&#xA;            packet.pts = 4500 * fileCount;&#xA;            packet.duration = 4500;&#xA;            av_write_frame(output_ctx, &amp;packet);&#xA;            av_packet_unref(&amp;packet);&#xA;            av_new_packet(&amp;packet, 0);&#xA;            fileCount&#x2B;&#x2B;;&#xA;        }&#xA;        av_packet_unref(&amp;packet);&#xA;    }&#xA;    avcodec_free_context(&amp;output_cc);&#xA;&#xA;    av_write_trailer(output_ctx);&#xA;    if (output_ctx &amp;&amp; !(output_ctx->oformat->flags &amp; AVFMT_NOFILE))&#xA;        avio_close(output_ctx->pb);&#xA;    avformat_free_context(output_ctx);&#xA;}&#xA;</list></string></cstdio></fstream></iostream>

    &#xA;

    Then, I compiled it (with g&#x2B;&#x2B; encode.cpp -lavcodec -lavformat -lavutil -g and libraries are installed via Ubuntu 20.04 apt) and run it. This is the MP4 file I get (2872 bytes, base64 encoded) :

    &#xA;

    AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAB39tZGF0AAAAAWdkAAys&#xA;2UMCnn4QAAADABAAAAMAIPFCmWAAAAABaOvjyyLAAAABBgX//6rcRem95tlIt5Ys2CDZI&#x2B;7veDI2&#xA;NCAtIGNvcmUgMTU1IHIyOTE3IDBhODRkOTggLSBILjI2NC9NUEVHLTQgQVZDIGNvZGVjIC0gQ29w&#xA;eWxlZnQgMjAwMy0yMDE4IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcveDI2NC5odG1sIC0gb3B0&#xA;aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9MHgzOjB4MTEzIG1lPWhl&#xA;eCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVmPTEgbWVfcmFuZ2U9MTYg&#xA;Y2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6b25lPTIxLDExIGZhc3Rf&#xA;cHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9MTAgbG9va2FoZWFkX3RocmVhZHM9&#xA;MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2Nv&#xA;bXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9&#xA;MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50&#xA;PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVh&#xA;ZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5&#xA;IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAFliIQAF//&#x2B;7oK&#x2B;BTeKk2/DVSCr&#xA;MT4MeFdCVv4gBUyU0LeeB3T/sW2Y2XML/dzzR/1dfS/wWmJ&#x2B;KGm0PX/sHuGpnyAn2gs5wsYABhgA&#xA;WoTf&#x2B;9Y7PDk9QANDAAAAAUGaJGxBf/rtlHe1U64AATcAAAABQZ5CeILfbxYfLVgA1IEAAAABAZ5h&#xA;dEFfe7ECY2ABFwAAAAEBnmNqQV8AAAXdAAAAAUGaaEmoQWiZTAgv//7aplgACJkAAAABQZ6GRREs&#xA;Fv8AAAMDuwAAAAEBnqV0QV8AAAXdAAAAAQGep2pBXwAABdwAAAABQZqsSahBbJlMCCn/pl89fETi&#xA;z77HITCNid5IReE1K1v97aqMUAALuAAAAAFBnspFFSwj//KT/ryYOcNSN&#x2B;trDqIVVMoJuQAAAAEB&#xA;nul0QV/Y3j/sYkAS8AAAAAEBnutqQV/YnLf8lQQC4gAAAAFBmvBLqEIQWyFwE9QE8wCG/4899h7r&#xA;ur/hzq5kViiXU1N/7bVj0xCq2NuW3nBS6YfDQ992r2uqpbMofO1lE5tnQK9JUQ5YGQAAAAFBnw5F&#xA;FSxf9fg4AYHw/MtxZuh3cyjYZEvBAAAAAQGfLXRBX9j1VS/3qogFxQAAAAEBny9qQV/YoOAr/sYk&#xA;AS8AAAABQZs0S6hCEFsgjBdQXMAgp/&#x2B;h1f9/vbVRigABdwAAAAFBn1JFFSwj/wAFJQAAAAEBn3F0&#xA;QV/XxXD/9jEgCXgAAAABAZ9zakFf2CYBX/YxIAl4AAAAAUGbeEuoQhBbI8FVBUwCGf&#x2B;cVtZB6o&#x2B;w&#xA;AAd1AAAAAUGflkUVLF/5hTWAMD4fmW4s3Q7uZRsMiXgAAAABAZ&#x2B;1dEFf2PnD/9jEgCXhAAAAAQGf&#xA;t2pBX9ig4Cv&#x2B;xiQBLwAAAAFBm7xLqEIQWyHwTNBMUAgl/5uKXHNoSDz2kspLKh1/aGf97VTrgABL&#xA;wAAAAAFBn9pFFSwj/wAFJQAAAAEBn/l0QV/Y9mTr/eqiAXEAAAABAZ/7akFf2PyAa/9LVQC4gQAA&#xA;AAFBm&#x2B;BLqEIQWyGwGtQGswCF/40iq4lIKUsvpwcj71B5AACtgQAAAAFBnh5FFSxf&#x2B;YU3S0ZHIuL8&#xA;nYrTAtHfPEvAAAAAAQGePXRBX9guMnX&#x2B;9VEAuIAAAAABAZ4/akFf2KDgK/7GJAEvAAAAAUGaJEuo&#xA;QhBbIbCTQkUAgj&#x2B;ZGG6&#x2B;9qp1wAAl4AAAAAFBnkJFFSwj/wAFJQAAAAEBnmF0QV/Y9mTr/eqiAXEA&#xA;AAABAZ5jakFf2PyAa/9LVQC4gQAAAAFBmmhLqEIQWyFwN1A3MAhf/40jE99QeQAArYEAAAABQZ6G&#xA;RRUsX/X4OAGB8PzLcWbIzTkgw4Q&#x2B;YQAAAAEBnqV0QV/YLjJ1/vVRALiBAAAAAQGep2pBX9ig4Cv&#x2B;&#xA;xiQBLwAAAAFBmqxLqEIQWyGwk0JFAII/mRhuvvaqdcAAJeAAAAABQZ7KRRUsI/8ABSUAAAABAZ7p&#xA;dEFf2PZk6/3qogFxAAAAAQGe62pBX9j8gGv/S1UAuIAAAAABQZrwS6hCEFshcBTUBTMAhP&#x2B;CU2ym&#xA;36ypkZobj4/dQd9&#x2B;Isf9z8aAAKmBAAADkW1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA&#x2B;gAAAj8&#xA;AAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAA&#xA;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAK7dHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAA&#xA;AAAAAAj8AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAA&#xA;AAC0AAABQAAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAI/AAAAAAAAQAAAAACM21kaWEAAAAg&#xA;bWRoZAAAAAAAAAAAAAAAAAABX5AAAyiYVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAA&#xA;AAAAVmlkZW9IYW5kbGVyAAAAAd5taW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxk&#xA;cmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAGec3RibAAAAG5zdHNkAAAAAAAAAAEAAABeYXZjMQAA&#xA;AAAAAAABAAAAAAAAAAAAAAAAAAAAAAC0AUAASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA&#xA;AAAAAAAAAAAAAAAAAAAAABj//wAAAAhhdmNDAAAAGHN0dHMAAAAAAAAAAQAAAC4AABGUAAAAFHN0&#xA;c3MAAAAAAAAAAQAAAAEAAAAcc3RzYwAAAAAAAAABAAAAAQAAAC4AAAABAAAAzHN0c3oAAAAAAAAA&#xA;AAAAAC4AAAMzAAAAFAAAABIAAAARAAAADgAAABcAAAARAAAADgAAAA4AAAAsAAAAHgAAABIAAAAS&#xA;AAAASwAAAB0AAAATAAAAEwAAACAAAAAPAAAAEwAAABMAAAAeAAAAHQAAABMAAAATAAAALQAAAA8A&#xA;AAATAAAAFAAAACcAAAAdAAAAFAAAABMAAAAfAAAADwAAABMAAAAUAAAAHwAAAB0AAAAUAAAAEwAA&#xA;AB8AAAAPAAAAEwAAABQAAAAuAAAAFHN0Y28AAAAAAAAAAQAAADAAAABidWR0YQAAAFptZXRhAAAA&#xA;AAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAC1pbHN0AAAAJal0b28AAAAdZGF0&#xA;YQAAAAEAAAAATGF2ZjU4LjI5LjEwMA==&#xA;

    &#xA;

    And I try to play it in Media Player in Windows 11. It can not play at all and fails with a 0xC00D36C4 error.

    &#xA;

    Later I compiled and run the same code in Ubuntu 22.04. This time I got a 3161 byte file (base64 encoded) which can be correctly played in Media Player :

    &#xA;

    AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAACF5tZGF0AAAAGWdkAAys&#xA;2UMCnn4QAAADABAAAAMAIPFCmWAAAAAGaOvjyyLAAAACrgYF//&#x2B;q3EXpvebZSLeWLNgg2SPu73gy&#xA;NjQgLSBjb3JlIDE2MyByMzA2MCA1ZGI2YWE2IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENv&#xA;cHlsZWZ0IDIwMDMtMjAyMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9w&#xA;dGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1o&#xA;ZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2&#xA;IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0&#xA;X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEwIGxvb2thaGVhZF90aHJlYWRz&#xA;PTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9j&#xA;b21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0&#xA;PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWlu&#xA;dD0yNTAga2V5aW50X21pbj0xIHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhl&#xA;YWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02&#xA;OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAWmWIhAAV//7sz34FN2u2Mv14&#xA;OUV1GW52wf6mv09Y/&#x2B;Eq5ywBqFdjI7RiQruDqkHmD84Ah&#x2B;1pD&#x2B;u&#x2B;Ju9pbKoJmVnS6c&#x2B;DhXKzmU8A&#xA;AEJAA5Q0japbJSyuwAA24QAAAENBmiRsR/93Hj0GFYn&#x2B;ROeWur9cQ/zaceE37Gsw8XYMMBmtQahK&#xA;nnp6wFvNgAvbtn&#x2B;cxJ0Z91z2CA/nTap57PBeAAesAAAAC0GeQniN//WveLD/AAAACwGeYXRE//Lq&#xA;lyJeAAAACQGeY2pE/wAOWQAAAKRBmmhJqEFomUwIb/&#x2B;HBst5Vmv/hAk6mKwl1nhLEgC5JEPr5DCU&#xA;VnJmIORbRW23GIPDEuLFYpgAjTnwfchYIZFeHox/487bPMhsWqRfuupsl62bRlu2PFr1K57YcLnJ&#xA;b11Jv4VSXcVpsCeBYsxz7wYLcP8NN3T/QIszVyDj25ai291KJSbITxeer9CGz7TrMDp&#x2B;pqxqSvAl&#xA;U5fHF71S9I2H4oAccQAAAA1BnoZFESxv&#x2B;GoYwGVBAAAACQGepXRE/wAOWQAAAAsBnqdqRP/42vcB&#xA;ZQAAAEVBmqxJqEFsmUwIb//lIJwN4SH/2GHrfrkLLPBTCyfxRkCimcDT8zltZqnYDd2ZQPZxyWfN&#xA;ki4FupTgFvWOPfeoPoAAZ8AAAAAKQZ7KRRUsTwAOWQAAAAsBnul0S//ReV8XcAAAAAsBnutqS//W&#xA;sO0OmAAAACNBmvBJqEFsmUwIb//mvXwNPF1YZuydPMtlZpns/upv8AAM&#x2B;QAAACZBnw5FFSxP0Ikp&#xA;wuqTXmwEu&#x2B;OiB8CYQNYpaRkGb5/5RmPwl&#x2B;sYEQAAAAsBny10S//ReV8XcQAAAAkBny9qS/8AFJAA&#xA;AAAiQZs0SahBbJlMCGf/5Y/igCxy3DGPU&#x2B;M7b/99B91N&#x2B;gABxwAAAApBn1JFFSxPAA5ZAAAACwGf&#xA;cXRL/9F5XxdwAAAACwGfc2pL/9aw7Q6YAAAAJUGbeEmoQWyZTAhn/&#x2B;WP4oplmHh5dfVuNLjT8oT6&#xA;g/vUHsAAM&#x2B;EAAAAXQZ&#x2B;WRRUsT9JR1ZIMzs5XvDHwkvx&#x2B;sYEAAAAJAZ&#x2B;1dEv/ABSRAAAACwGft2pL&#xA;/9aw7Q6ZAAAAJkGbvEmoQWyZTAhn/&#x2B;WP4oxs8pNOGFNfSEOsZkgpGffuyAUAAOOAAAAAF0Gf2kUV&#xA;LE/SUWxSC3GeGyx8TNUf6xgRAAAACwGf&#x2B;XRL/9F5XxdwAAAACQGf&#x2B;2pL/wAUkQAAACZBm&#x2B;BJqEFs&#xA;mUwIX//goPeWk2SzeFEEGglcichS/FxJ/umLgABCwQAAAApBnh5FFSxPAA5YAAAACwGePXRL/9F5&#xA;XxdwAAAACwGeP2pL/9aw7Q6ZAAAAI0GaJEmoQWyZTAhf/&#x2B;Cg9mxhlMc0k8Yr1&#x2B;brXCEPvPx4AAz4&#xA;AAAAFkGeQkUVLE/SUWxSC3GeGyx5H0P1jAkAAAAJAZ5hdEv/ABSQAAAACwGeY2pL/9aw7Q6ZAAAA&#xA;JUGaaEmoQWyZTAhX/934FxaYaAYDmnHH4&#x2B;UwBaTcxW&#x2B;79/AAMWEAAAAWQZ6GRRUsT9JR1ZjbylIX&#xA;k3pEqIaFFQAAAAsBnqV0S//ReV8XcQAAAAkBnqdqS/8AFJAAAABHQZqsSahBbJlMCE//2hrhlW8w&#xA;qe7XMWJEx94kdXYQ9HRCQyVTdH4DhBK&#x2B;sOJ4AzLYtJsG08L95F&#x2B;uMqHODHeWVpY&#x2B;5tIAAQcAAAAV&#xA;QZ7KRRUsT9JRbFIKsqjUxE0DDQopAAAAIgGe6XRL/89KTt634hrgmPLOKW2Z10f5uKzr2C0EdNV3&#xA;4hYAAAALAZ7rakv/1rDtDpgAAAA0QZrwSahBbJlMCEf/2wXAE5vb0nGTGKtYx9JkEQt4dxtmo6f2&#xA;fWM6KXXZ/LgcMPb3AAAYsQAAA9Ntb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAI/AABAAAB&#xA;AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAA&#xA;AAAAAAAAAAAAAAAAAAAAAAACAAAC/XRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAI&#xA;/AAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAtAAA&#xA;AUAAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAACPwAAAAAAAEAAAAAAnVtZGlhAAAAIG1kaGQA&#xA;AAAAAAAAAAAAAAAAAV&#x2B;QAAMomFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZp&#xA;ZGVvSGFuZGxlcgAAAAIgbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAA&#xA;AAAAAAABAAAADHVybCAAAAABAAAB4HN0YmwAAACwc3RzZAAAAAAAAAABAAAAoGF2YzEAAAAAAAAA&#xA;AQAAAAAAAAAAAAAAAAAAAAAAtAFAAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&#xA;AAAAAAAAAAAAAAAY//8AAAA2YXZjQwFkAAz/4QAZZ2QADKzZQwKefhAAAAMAEAAAAwAg8UKZYAEA&#xA;Bmjr48siwP34&#x2B;AAAAAAUYnRydAAAAAAAABz&#x2B;AAAc/gAAABhzdHRzAAAAAAAAAAEAAAAuAAARlAAA&#xA;ABRzdHNzAAAAAAAAAAEAAAABAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAAuAAAAAQAAAMxzdHN6AAAA&#xA;AAAAAAAAAAAuAAADNwAAAEcAAAAPAAAADwAAAA0AAACoAAAAEQAAAA0AAAAPAAAASQAAAA4AAAAP&#xA;AAAADwAAACcAAAAqAAAADwAAAA0AAAAmAAAADgAAAA8AAAAPAAAAKQAAABsAAAANAAAADwAAACoA&#xA;AAAbAAAADwAAAA0AAAAqAAAADgAAAA8AAAAPAAAAJwAAABoAAAANAAAADwAAACkAAAAaAAAADwAA&#xA;AA0AAABLAAAAGQAAACYAAAAPAAAAOAAAABRzdGNvAAAAAAAAAAEAAAAwAAAAYnVkdGEAAABabWV0&#xA;YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAA&#xA;HWRhdGEAAAABAAAAAExhdmY1OC43Ni4xMDA=&#xA;

    &#xA;

  • Why is a file unplayable in Windows Media Player ?

    21 février 2024, par zhang

    I have written some code to generate a MP4 video. This is a simplified version of the code :

    &#xA;

    #include <iostream>&#xA;#include <fstream>&#xA;#include <cstdio>&#xA;#include <string>&#xA;#include <list>&#xA;#include &#xA;&#xA;extern "C"&#xA;{&#xA;#include "libavformat/avformat.h"&#xA;#include "libavutil/frame.h"&#xA;#include "libavcodec/avcodec.h"&#xA;#include "libavutil/imgutils.h"&#xA;}&#xA;using namespace std;&#xA;&#xA;const int output_width = 180;&#xA;const int output_height = 320;&#xA;&#xA;int main(int argc, char **argv)&#xA;{&#xA;    AVCodec *output_avc = avcodec_find_encoder_by_name("libx264");&#xA;    if (!output_avc)&#xA;        abort();&#xA;    AVCodecContext *output_cc = avcodec_alloc_context3(output_avc);&#xA;    if (!output_cc)&#xA;        abort();&#xA;&#xA;    output_cc->time_base.num = output_cc->time_base.den = 1;&#xA;    output_cc->pix_fmt = AV_PIX_FMT_YUV420P;&#xA;&#xA;    output_cc->width = output_width;&#xA;    output_cc->height = output_height;&#xA;&#xA;    if (avcodec_is_open(output_cc) == 0)&#xA;    {&#xA;        if (avcodec_open2(output_cc, output_avc, 0) &lt; 0)&#xA;            abort();&#xA;    }&#xA;&#xA;    string outf = "res.mp4";&#xA;    AVFormatContext *output_ctx;&#xA;    avformat_alloc_output_context2(&amp;output_ctx, NULL, NULL, outf.c_str());&#xA;    AVStream *out_stream = avformat_new_stream(output_ctx, 0);&#xA;    out_stream->codecpar->codec_id = AV_CODEC_ID_H264;&#xA;    out_stream->codecpar->codec_type = AVMEDIA_TYPE_VIDEO;&#xA;    out_stream->codecpar->codec_tag = 0;&#xA;    out_stream->codecpar->width = output_width;&#xA;    out_stream->codecpar->height = output_height;&#xA;    out_stream->codecpar->format = AV_PIX_FMT_YUV420P;&#xA;    av_dump_format(output_ctx, 0, outf.c_str(), 1);&#xA;    if (!(output_ctx->oformat->flags &amp; AVFMT_NOFILE))&#xA;    {&#xA;        if (avio_open(&amp;output_ctx->pb, outf.c_str(), AVIO_FLAG_WRITE) &lt; 0)&#xA;            abort();&#xA;    }&#xA;    if (avformat_write_header(output_ctx, NULL) &lt; 0)&#xA;        abort();&#xA;&#xA;    AVPacket packet;&#xA;    AVFrame *frame;&#xA;    int fileCount = 0;&#xA;&#xA;    for (int i = 0; i &lt; 100; i&#x2B;&#x2B;)&#xA;    {&#xA;        frame = av_frame_alloc();&#xA;        frame->width = output_width;&#xA;        frame->height = output_height;&#xA;        frame->format = AV_PIX_FMT_YUV420P;&#xA;        if (av_image_alloc(frame->data, frame->linesize, frame->width, frame->height, AV_PIX_FMT_YUV420P, 32) &lt; 0)&#xA;            abort();&#xA;        frame->pts = 60000 * i;&#xA;        frame->pkt_dts = 60000 * i;&#xA;        if (avcodec_send_frame(output_cc, frame) &lt; 0)&#xA;            abort();&#xA;        av_frame_free(&amp;frame);&#xA;&#xA;        av_new_packet(&amp;packet, 0);&#xA;        while (avcodec_receive_packet(output_cc, &amp;packet) >= 0)&#xA;        {&#xA;            packet.pos = -1;&#xA;            packet.dts = 4500 * fileCount;&#xA;            packet.pts = 4500 * fileCount;&#xA;            packet.duration = 4500;&#xA;            av_write_frame(output_ctx, &amp;packet);&#xA;            av_packet_unref(&amp;packet);&#xA;            av_new_packet(&amp;packet, 0);&#xA;            fileCount&#x2B;&#x2B;;&#xA;        }&#xA;        av_packet_unref(&amp;packet);&#xA;    }&#xA;    avcodec_free_context(&amp;output_cc);&#xA;&#xA;    av_write_trailer(output_ctx);&#xA;    if (output_ctx &amp;&amp; !(output_ctx->oformat->flags &amp; AVFMT_NOFILE))&#xA;        avio_close(output_ctx->pb);&#xA;    avformat_free_context(output_ctx);&#xA;}&#xA;</list></string></cstdio></fstream></iostream>

    &#xA;

    Then, I compiled it (with g&#x2B;&#x2B; encode.cpp -lavcodec -lavformat -lavutil -g and libraries are installed via Ubuntu 20.04 apt) and run it. This is the MP4 file I get (2872 bytes, base64 encoded) :

    &#xA;

    AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAAB39tZGF0AAAAAWdkAAys&#xA;2UMCnn4QAAADABAAAAMAIPFCmWAAAAABaOvjyyLAAAABBgX//6rcRem95tlIt5Ys2CDZI&#x2B;7veDI2&#xA;NCAtIGNvcmUgMTU1IHIyOTE3IDBhODRkOTggLSBILjI2NC9NUEVHLTQgQVZDIGNvZGVjIC0gQ29w&#xA;eWxlZnQgMjAwMy0yMDE4IC0gaHR0cDovL3d3dy52aWRlb2xhbi5vcmcveDI2NC5odG1sIC0gb3B0&#xA;aW9uczogY2FiYWM9MSByZWY9MyBkZWJsb2NrPTE6MDowIGFuYWx5c2U9MHgzOjB4MTEzIG1lPWhl&#xA;eCBzdWJtZT03IHBzeT0xIHBzeV9yZD0xLjAwOjAuMDAgbWl4ZWRfcmVmPTEgbWVfcmFuZ2U9MTYg&#xA;Y2hyb21hX21lPTEgdHJlbGxpcz0xIDh4OGRjdD0xIGNxbT0wIGRlYWR6b25lPTIxLDExIGZhc3Rf&#xA;cHNraXA9MSBjaHJvbWFfcXBfb2Zmc2V0PS0yIHRocmVhZHM9MTAgbG9va2FoZWFkX3RocmVhZHM9&#xA;MSBzbGljZWRfdGhyZWFkcz0wIG5yPTAgZGVjaW1hdGU9MSBpbnRlcmxhY2VkPTAgYmx1cmF5X2Nv&#xA;bXBhdD0wIGNvbnN0cmFpbmVkX2ludHJhPTAgYmZyYW1lcz0zIGJfcHlyYW1pZD0yIGJfYWRhcHQ9&#xA;MSBiX2JpYXM9MCBkaXJlY3Q9MSB3ZWlnaHRiPTEgb3Blbl9nb3A9MCB3ZWlnaHRwPTIga2V5aW50&#xA;PTI1MCBrZXlpbnRfbWluPTEgc2NlbmVjdXQ9NDAgaW50cmFfcmVmcmVzaD0wIHJjX2xvb2thaGVh&#xA;ZD00MCByYz1jcmYgbWJ0cmVlPTEgY3JmPTIzLjAgcWNvbXA9MC42MCBxcG1pbj0wIHFwbWF4PTY5&#xA;IHFwc3RlcD00IGlwX3JhdGlvPTEuNDAgYXE9MToxLjAwAIAAAAFliIQAF//&#x2B;7oK&#x2B;BTeKk2/DVSCr&#xA;MT4MeFdCVv4gBUyU0LeeB3T/sW2Y2XML/dzzR/1dfS/wWmJ&#x2B;KGm0PX/sHuGpnyAn2gs5wsYABhgA&#xA;WoTf&#x2B;9Y7PDk9QANDAAAAAUGaJGxBf/rtlHe1U64AATcAAAABQZ5CeILfbxYfLVgA1IEAAAABAZ5h&#xA;dEFfe7ECY2ABFwAAAAEBnmNqQV8AAAXdAAAAAUGaaEmoQWiZTAgv//7aplgACJkAAAABQZ6GRREs&#xA;Fv8AAAMDuwAAAAEBnqV0QV8AAAXdAAAAAQGep2pBXwAABdwAAAABQZqsSahBbJlMCCn/pl89fETi&#xA;z77HITCNid5IReE1K1v97aqMUAALuAAAAAFBnspFFSwj//KT/ryYOcNSN&#x2B;trDqIVVMoJuQAAAAEB&#xA;nul0QV/Y3j/sYkAS8AAAAAEBnutqQV/YnLf8lQQC4gAAAAFBmvBLqEIQWyFwE9QE8wCG/4899h7r&#xA;ur/hzq5kViiXU1N/7bVj0xCq2NuW3nBS6YfDQ992r2uqpbMofO1lE5tnQK9JUQ5YGQAAAAFBnw5F&#xA;FSxf9fg4AYHw/MtxZuh3cyjYZEvBAAAAAQGfLXRBX9j1VS/3qogFxQAAAAEBny9qQV/YoOAr/sYk&#xA;AS8AAAABQZs0S6hCEFsgjBdQXMAgp/&#x2B;h1f9/vbVRigABdwAAAAFBn1JFFSwj/wAFJQAAAAEBn3F0&#xA;QV/XxXD/9jEgCXgAAAABAZ9zakFf2CYBX/YxIAl4AAAAAUGbeEuoQhBbI8FVBUwCGf&#x2B;cVtZB6o&#x2B;w&#xA;AAd1AAAAAUGflkUVLF/5hTWAMD4fmW4s3Q7uZRsMiXgAAAABAZ&#x2B;1dEFf2PnD/9jEgCXhAAAAAQGf&#xA;t2pBX9ig4Cv&#x2B;xiQBLwAAAAFBm7xLqEIQWyHwTNBMUAgl/5uKXHNoSDz2kspLKh1/aGf97VTrgABL&#xA;wAAAAAFBn9pFFSwj/wAFJQAAAAEBn/l0QV/Y9mTr/eqiAXEAAAABAZ/7akFf2PyAa/9LVQC4gQAA&#xA;AAFBm&#x2B;BLqEIQWyGwGtQGswCF/40iq4lIKUsvpwcj71B5AACtgQAAAAFBnh5FFSxf&#x2B;YU3S0ZHIuL8&#xA;nYrTAtHfPEvAAAAAAQGePXRBX9guMnX&#x2B;9VEAuIAAAAABAZ4/akFf2KDgK/7GJAEvAAAAAUGaJEuo&#xA;QhBbIbCTQkUAgj&#x2B;ZGG6&#x2B;9qp1wAAl4AAAAAFBnkJFFSwj/wAFJQAAAAEBnmF0QV/Y9mTr/eqiAXEA&#xA;AAABAZ5jakFf2PyAa/9LVQC4gQAAAAFBmmhLqEIQWyFwN1A3MAhf/40jE99QeQAArYEAAAABQZ6G&#xA;RRUsX/X4OAGB8PzLcWbIzTkgw4Q&#x2B;YQAAAAEBnqV0QV/YLjJ1/vVRALiBAAAAAQGep2pBX9ig4Cv&#x2B;&#xA;xiQBLwAAAAFBmqxLqEIQWyGwk0JFAII/mRhuvvaqdcAAJeAAAAABQZ7KRRUsI/8ABSUAAAABAZ7p&#xA;dEFf2PZk6/3qogFxAAAAAQGe62pBX9j8gGv/S1UAuIAAAAABQZrwS6hCEFshcBTUBTMAhP&#x2B;CU2ym&#xA;36ypkZobj4/dQd9&#x2B;Isf9z8aAAKmBAAADkW1vb3YAAABsbXZoZAAAAAAAAAAAAAAAAAAAA&#x2B;gAAAj8&#xA;AAEAAAEAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAAAAAAAAAA&#xA;AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIAAAK7dHJhawAAAFx0a2hkAAAAAwAAAAAAAAAAAAAAAQAA&#xA;AAAAAAj8AAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAQAAA&#xA;AAC0AAABQAAAAAAAJGVkdHMAAAAcZWxzdAAAAAAAAAABAAAI/AAAAAAAAQAAAAACM21kaWEAAAAg&#xA;bWRoZAAAAAAAAAAAAAAAAAABX5AAAyiYVcQAAAAAAC1oZGxyAAAAAAAAAAB2aWRlAAAAAAAAAAAA&#xA;AAAAVmlkZW9IYW5kbGVyAAAAAd5taW5mAAAAFHZtaGQAAAABAAAAAAAAAAAAAAAkZGluZgAAABxk&#xA;cmVmAAAAAAAAAAEAAAAMdXJsIAAAAAEAAAGec3RibAAAAG5zdHNkAAAAAAAAAAEAAABeYXZjMQAA&#xA;AAAAAAABAAAAAAAAAAAAAAAAAAAAAAC0AUAASAAAAEgAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAA&#xA;AAAAAAAAAAAAAAAAAAAAABj//wAAAAhhdmNDAAAAGHN0dHMAAAAAAAAAAQAAAC4AABGUAAAAFHN0&#xA;c3MAAAAAAAAAAQAAAAEAAAAcc3RzYwAAAAAAAAABAAAAAQAAAC4AAAABAAAAzHN0c3oAAAAAAAAA&#xA;AAAAAC4AAAMzAAAAFAAAABIAAAARAAAADgAAABcAAAARAAAADgAAAA4AAAAsAAAAHgAAABIAAAAS&#xA;AAAASwAAAB0AAAATAAAAEwAAACAAAAAPAAAAEwAAABMAAAAeAAAAHQAAABMAAAATAAAALQAAAA8A&#xA;AAATAAAAFAAAACcAAAAdAAAAFAAAABMAAAAfAAAADwAAABMAAAAUAAAAHwAAAB0AAAAUAAAAEwAA&#xA;AB8AAAAPAAAAEwAAABQAAAAuAAAAFHN0Y28AAAAAAAAAAQAAADAAAABidWR0YQAAAFptZXRhAAAA&#xA;AAAAACFoZGxyAAAAAAAAAABtZGlyYXBwbAAAAAAAAAAAAAAAAC1pbHN0AAAAJal0b28AAAAdZGF0&#xA;YQAAAAEAAAAATGF2ZjU4LjI5LjEwMA==&#xA;

    &#xA;

    And I try to play it in Media Player in Windows 11. It can not play at all and fails with a 0xC00D36C4 error.

    &#xA;

    Later I compiled and run the same code in Ubuntu 22.04. This time I got a 3161 byte file (base64 encoded) which can be correctly played in Media Player :

    &#xA;

    AAAAIGZ0eXBpc29tAAACAGlzb21pc28yYXZjMW1wNDEAAAAIZnJlZQAACF5tZGF0AAAAGWdkAAys&#xA;2UMCnn4QAAADABAAAAMAIPFCmWAAAAAGaOvjyyLAAAACrgYF//&#x2B;q3EXpvebZSLeWLNgg2SPu73gy&#xA;NjQgLSBjb3JlIDE2MyByMzA2MCA1ZGI2YWE2IC0gSC4yNjQvTVBFRy00IEFWQyBjb2RlYyAtIENv&#xA;cHlsZWZ0IDIwMDMtMjAyMSAtIGh0dHA6Ly93d3cudmlkZW9sYW4ub3JnL3gyNjQuaHRtbCAtIG9w&#xA;dGlvbnM6IGNhYmFjPTEgcmVmPTMgZGVibG9jaz0xOjA6MCBhbmFseXNlPTB4MzoweDExMyBtZT1o&#xA;ZXggc3VibWU9NyBwc3k9MSBwc3lfcmQ9MS4wMDowLjAwIG1peGVkX3JlZj0xIG1lX3JhbmdlPTE2&#xA;IGNocm9tYV9tZT0xIHRyZWxsaXM9MSA4eDhkY3Q9MSBjcW09MCBkZWFkem9uZT0yMSwxMSBmYXN0&#xA;X3Bza2lwPTEgY2hyb21hX3FwX29mZnNldD0tMiB0aHJlYWRzPTEwIGxvb2thaGVhZF90aHJlYWRz&#xA;PTEgc2xpY2VkX3RocmVhZHM9MCBucj0wIGRlY2ltYXRlPTEgaW50ZXJsYWNlZD0wIGJsdXJheV9j&#xA;b21wYXQ9MCBjb25zdHJhaW5lZF9pbnRyYT0wIGJmcmFtZXM9MyBiX3B5cmFtaWQ9MiBiX2FkYXB0&#xA;PTEgYl9iaWFzPTAgZGlyZWN0PTEgd2VpZ2h0Yj0xIG9wZW5fZ29wPTAgd2VpZ2h0cD0yIGtleWlu&#xA;dD0yNTAga2V5aW50X21pbj0xIHNjZW5lY3V0PTQwIGludHJhX3JlZnJlc2g9MCByY19sb29rYWhl&#xA;YWQ9NDAgcmM9Y3JmIG1idHJlZT0xIGNyZj0yMy4wIHFjb21wPTAuNjAgcXBtaW49MCBxcG1heD02&#xA;OSBxcHN0ZXA9NCBpcF9yYXRpbz0xLjQwIGFxPTE6MS4wMACAAAAAWmWIhAAV//7sz34FN2u2Mv14&#xA;OUV1GW52wf6mv09Y/&#x2B;Eq5ywBqFdjI7RiQruDqkHmD84Ah&#x2B;1pD&#x2B;u&#x2B;Ju9pbKoJmVnS6c&#x2B;DhXKzmU8A&#xA;AEJAA5Q0japbJSyuwAA24QAAAENBmiRsR/93Hj0GFYn&#x2B;ROeWur9cQ/zaceE37Gsw8XYMMBmtQahK&#xA;nnp6wFvNgAvbtn&#x2B;cxJ0Z91z2CA/nTap57PBeAAesAAAAC0GeQniN//WveLD/AAAACwGeYXRE//Lq&#xA;lyJeAAAACQGeY2pE/wAOWQAAAKRBmmhJqEFomUwIb/&#x2B;HBst5Vmv/hAk6mKwl1nhLEgC5JEPr5DCU&#xA;VnJmIORbRW23GIPDEuLFYpgAjTnwfchYIZFeHox/487bPMhsWqRfuupsl62bRlu2PFr1K57YcLnJ&#xA;b11Jv4VSXcVpsCeBYsxz7wYLcP8NN3T/QIszVyDj25ai291KJSbITxeer9CGz7TrMDp&#x2B;pqxqSvAl&#xA;U5fHF71S9I2H4oAccQAAAA1BnoZFESxv&#x2B;GoYwGVBAAAACQGepXRE/wAOWQAAAAsBnqdqRP/42vcB&#xA;ZQAAAEVBmqxJqEFsmUwIb//lIJwN4SH/2GHrfrkLLPBTCyfxRkCimcDT8zltZqnYDd2ZQPZxyWfN&#xA;ki4FupTgFvWOPfeoPoAAZ8AAAAAKQZ7KRRUsTwAOWQAAAAsBnul0S//ReV8XcAAAAAsBnutqS//W&#xA;sO0OmAAAACNBmvBJqEFsmUwIb//mvXwNPF1YZuydPMtlZpns/upv8AAM&#x2B;QAAACZBnw5FFSxP0Ikp&#xA;wuqTXmwEu&#x2B;OiB8CYQNYpaRkGb5/5RmPwl&#x2B;sYEQAAAAsBny10S//ReV8XcQAAAAkBny9qS/8AFJAA&#xA;AAAiQZs0SahBbJlMCGf/5Y/igCxy3DGPU&#x2B;M7b/99B91N&#x2B;gABxwAAAApBn1JFFSxPAA5ZAAAACwGf&#xA;cXRL/9F5XxdwAAAACwGfc2pL/9aw7Q6YAAAAJUGbeEmoQWyZTAhn/&#x2B;WP4oplmHh5dfVuNLjT8oT6&#xA;g/vUHsAAM&#x2B;EAAAAXQZ&#x2B;WRRUsT9JR1ZIMzs5XvDHwkvx&#x2B;sYEAAAAJAZ&#x2B;1dEv/ABSRAAAACwGft2pL&#xA;/9aw7Q6ZAAAAJkGbvEmoQWyZTAhn/&#x2B;WP4oxs8pNOGFNfSEOsZkgpGffuyAUAAOOAAAAAF0Gf2kUV&#xA;LE/SUWxSC3GeGyx8TNUf6xgRAAAACwGf&#x2B;XRL/9F5XxdwAAAACQGf&#x2B;2pL/wAUkQAAACZBm&#x2B;BJqEFs&#xA;mUwIX//goPeWk2SzeFEEGglcichS/FxJ/umLgABCwQAAAApBnh5FFSxPAA5YAAAACwGePXRL/9F5&#xA;XxdwAAAACwGeP2pL/9aw7Q6ZAAAAI0GaJEmoQWyZTAhf/&#x2B;Cg9mxhlMc0k8Yr1&#x2B;brXCEPvPx4AAz4&#xA;AAAAFkGeQkUVLE/SUWxSC3GeGyx5H0P1jAkAAAAJAZ5hdEv/ABSQAAAACwGeY2pL/9aw7Q6ZAAAA&#xA;JUGaaEmoQWyZTAhX/934FxaYaAYDmnHH4&#x2B;UwBaTcxW&#x2B;79/AAMWEAAAAWQZ6GRRUsT9JR1ZjbylIX&#xA;k3pEqIaFFQAAAAsBnqV0S//ReV8XcQAAAAkBnqdqS/8AFJAAAABHQZqsSahBbJlMCE//2hrhlW8w&#xA;qe7XMWJEx94kdXYQ9HRCQyVTdH4DhBK&#x2B;sOJ4AzLYtJsG08L95F&#x2B;uMqHODHeWVpY&#x2B;5tIAAQcAAAAV&#xA;QZ7KRRUsT9JRbFIKsqjUxE0DDQopAAAAIgGe6XRL/89KTt634hrgmPLOKW2Z10f5uKzr2C0EdNV3&#xA;4hYAAAALAZ7rakv/1rDtDpgAAAA0QZrwSahBbJlMCEf/2wXAE5vb0nGTGKtYx9JkEQt4dxtmo6f2&#xA;fWM6KXXZ/LgcMPb3AAAYsQAAA9Ntb292AAAAbG12aGQAAAAAAAAAAAAAAAAAAAPoAAAI/AABAAAB&#xA;AAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAA&#xA;AAAAAAAAAAAAAAAAAAAAAAACAAAC/XRyYWsAAABcdGtoZAAAAAMAAAAAAAAAAAAAAAEAAAAAAAAI&#xA;/AAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAEAAAAAAAAAAAAAAAAAAEAAAAAAtAAA&#xA;AUAAAAAAACRlZHRzAAAAHGVsc3QAAAAAAAAAAQAACPwAAAAAAAEAAAAAAnVtZGlhAAAAIG1kaGQA&#xA;AAAAAAAAAAAAAAAAAV&#x2B;QAAMomFXEAAAAAAAtaGRscgAAAAAAAAAAdmlkZQAAAAAAAAAAAAAAAFZp&#xA;ZGVvSGFuZGxlcgAAAAIgbWluZgAAABR2bWhkAAAAAQAAAAAAAAAAAAAAJGRpbmYAAAAcZHJlZgAA&#xA;AAAAAAABAAAADHVybCAAAAABAAAB4HN0YmwAAACwc3RzZAAAAAAAAAABAAAAoGF2YzEAAAAAAAAA&#xA;AQAAAAAAAAAAAAAAAAAAAAAAtAFAAEgAAABIAAAAAAAAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA&#xA;AAAAAAAAAAAAAAAY//8AAAA2YXZjQwFkAAz/4QAZZ2QADKzZQwKefhAAAAMAEAAAAwAg8UKZYAEA&#xA;Bmjr48siwP34&#x2B;AAAAAAUYnRydAAAAAAAABz&#x2B;AAAc/gAAABhzdHRzAAAAAAAAAAEAAAAuAAARlAAA&#xA;ABRzdHNzAAAAAAAAAAEAAAABAAAAHHN0c2MAAAAAAAAAAQAAAAEAAAAuAAAAAQAAAMxzdHN6AAAA&#xA;AAAAAAAAAAAuAAADNwAAAEcAAAAPAAAADwAAAA0AAACoAAAAEQAAAA0AAAAPAAAASQAAAA4AAAAP&#xA;AAAADwAAACcAAAAqAAAADwAAAA0AAAAmAAAADgAAAA8AAAAPAAAAKQAAABsAAAANAAAADwAAACoA&#xA;AAAbAAAADwAAAA0AAAAqAAAADgAAAA8AAAAPAAAAJwAAABoAAAANAAAADwAAACkAAAAaAAAADwAA&#xA;AA0AAABLAAAAGQAAACYAAAAPAAAAOAAAABRzdGNvAAAAAAAAAAEAAAAwAAAAYnVkdGEAAABabWV0&#xA;YQAAAAAAAAAhaGRscgAAAAAAAAAAbWRpcmFwcGwAAAAAAAAAAAAAAAAtaWxzdAAAACWpdG9vAAAA&#xA;HWRhdGEAAAABAAAAAExhdmY1OC43Ni4xMDA=&#xA;

    &#xA;