Recherche avancée

Médias (91)

Autres articles (77)

  • Support audio et vidéo HTML5

    10 avril 2011

    MediaSPIP utilise les balises HTML5 video et audio pour la lecture de documents multimedia en profitant des dernières innovations du W3C supportées par les navigateurs modernes.
    Pour les navigateurs plus anciens, le lecteur flash Flowplayer est utilisé.
    Le lecteur HTML5 utilisé a été spécifiquement créé pour MediaSPIP : il est complètement modifiable graphiquement pour correspondre à un thème choisi.
    Ces technologies permettent de distribuer vidéo et son à la fois sur des ordinateurs conventionnels (...)

  • Problèmes fréquents

    10 mars 2010, par

    PHP et safe_mode activé
    Une des principales sources de problèmes relève de la configuration de PHP et notamment de l’activation du safe_mode
    La solution consiterait à soit désactiver le safe_mode soit placer le script dans un répertoire accessible par apache pour le site

  • Mediabox : ouvrir les images dans l’espace maximal pour l’utilisateur

    8 février 2011, par

    La visualisation des images est restreinte par la largeur accordée par le design du site (dépendant du thème utilisé). Elles sont donc visibles sous un format réduit. Afin de profiter de l’ensemble de la place disponible sur l’écran de l’utilisateur, il est possible d’ajouter une fonctionnalité d’affichage de l’image dans une boite multimedia apparaissant au dessus du reste du contenu.
    Pour ce faire il est nécessaire d’installer le plugin "Mediabox".
    Configuration de la boite multimédia
    Dès (...)

Sur d’autres sites (5405)

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

    


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

  • 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