Recherche avancée

Médias (91)

Autres articles (70)

  • Le profil des utilisateurs

    12 avril 2011, par

    Chaque utilisateur dispose d’une page de profil lui permettant de modifier ses informations personnelle. Dans le menu de haut de page par défaut, un élément de menu est automatiquement créé à l’initialisation de MediaSPIP, visible uniquement si le visiteur est identifié sur le site.
    L’utilisateur a accès à la modification de profil depuis sa page auteur, un lien dans la navigation "Modifier votre profil" est (...)

  • Configurer la prise en compte des langues

    15 novembre 2010, par

    Accéder à la configuration et ajouter des langues prises en compte
    Afin de configurer la prise en compte de nouvelles langues, il est nécessaire de se rendre dans la partie "Administrer" du site.
    De là, dans le menu de navigation, vous pouvez accéder à une partie "Gestion des langues" permettant d’activer la prise en compte de nouvelles langues.
    Chaque nouvelle langue ajoutée reste désactivable tant qu’aucun objet n’est créé dans cette langue. Dans ce cas, elle devient grisée dans la configuration et (...)

  • XMP PHP

    13 mai 2011, par

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

Sur d’autres sites (9304)

  • ffmpeg/libx264 C API : frames dropped from end of short MP4

    19 juillet 2017, par Blake McConnell

    In my C++ application, I am taking a series of JPEG images, manipulating their data using FreeImage, and then encoding the bitmaps as H264 using the ffmpeg/libx264 C API. The output is an MP4 which shows the series of 22 images at 12fps. My code is adapted from the "muxing" example that comes with ffmpeg C source code.

    My problem : no matter how I tune the codec parameters, a certain number of frames at the end of the sequence which are passed to the encoder do not appear in the final output. I’ve set the AVCodecContext parameters like this :

    //set context params
    ctx->codec_id = AV_CODEC_ID_H264;
    ctx->bit_rate = 4000 * 1000;
    ctx->width = _width;
    ctx->height = _height;
    ost->st->time_base = AVRational{ 1, 12 };
    ctx->time_base = ost->st->time_base;
    ctx->gop_size = 1;
    ctx->pix_fmt = AV_PIX_FMT_YUV420P;

    I have found that the higher the gop_size the more frames are dropped from the end of the video. I can also see from the output that, with this gop size (where I’m essentially directing that all output frames be I frames) that only 9 frames are written.

    I’m not sure why this is occurring. I experimented with encoding duplicate frames and making a much longer video. This resulted in no frames being dropped. I know with the ffmpeg command line tool there is a concatenation command that accomplishes what I am trying to do, but I’m not sure how to accomplish the same goal using the C API.

    Here’s the output I’m getting from the console :

    [libx264 @ 026d81c0] using cpu capabilities : MMX2 SSE2Fast SSSE3
    SSE4.2 AVX FMA3 BMI2 AVX2 [libx264 @ 026d81c0] profile High, level
    3.1 [libx264 @ 026d81c0] 264 - core 152 r2851 ba24899 - H.264/MPEG-4 AVC codec - Cop yleft 2003-2017 - http://www.videolan.org/x264.html -
    options : cabac=1 ref=1 deb lock=1:0:0 analyse=0x3:0x113 me=hex subme=7
    psy=1 psy_rd=1.00:0.00 mixed_ref=0 m e_range=16 chroma_me=1 trellis=1
    8x8dct=1 cqm=0 deadzone=21,11 fast_pskip=1 chro ma_qp_offset=-2
    threads=12 lookahead_threads=2 sliced_threads=0 nr=0 decimate=1
    interlaced=0 bluray_compat=0 constrained_intra=0 bframes=0 weightp=0
    keyint=1 ke yint_min=1 scenecut=40 intra_refresh=0 rc=abr mbtree=0
    bitrate=4000 ratetol=1.0 qcomp=0.60 qpmin=0 qpmax=69 qpstep=4
    ip_ratio=1.40 aq=1:1.00 Output #0, mp4, to
    ’....\images\c411a991-46f6-400c-8bb0-77af3738559a.mp4’ :
    Stream #0:0 : Video : h264, yuv420p, 700x700, q=2-31, 4000 kb/s, 12 tbn

    [libx264 @ 026d81c0] frame I:9 Avg QP:17.83 size:111058 [libx264
    @ 026d81c0] mb I I16..4 : 1.9% 47.7% 50.5% [libx264 @ 026d81c0] final
    ratefactor : 19.14 [libx264 @ 026d81c0] 8x8 transform intra:47.7%
    [libx264 @ 026d81c0] coded y,uvDC,uvAC intra : 98.4% 96.9% 89.5%
    [libx264 @ 026d81c0] i16 v,h,dc,p : 64% 6% 2% 28% [libx264 @
    026d81c0] i8 v,h,dc,ddl,ddr,vr,hd,vl,hu : 32% 15% 9% 5% 5% 6% 8%
    10% 10% [libx264 @ 026d81c0] i4 v,h,dc,ddl,ddr,vr,hd,vl,hu : 28% 18%
    7% 6% 8% 8% 8% 9% 8% [libx264 @ 026d81c0] i8c dc,h,v,p : 43% 22%
    25% 10% [libx264 @ 026d81c0] kb/s:10661.53

    Code included below :

    MP4Writer.h

    #ifndef MPEG_WRITER
    #define MPEG_WRITER

    #include <iostream>
    #include <string>
    #include <vector>
    #include
    extern "C" {
       #include <libavformat></libavformat>avformat.h>
       #include <libswscale></libswscale>swscale.h>
       #include <libswresample></libswresample>swresample.h>
       #include <libswscale></libswscale>swscale.h>
    }

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

    class MP4Writer {
       public:
           MP4Writer();
           void Init();
           int16_t SetOutput( const std::string &amp; path );
           int16_t AddFrame( uint8_t * imgData );
           int16_t Write( std::vector<imgdata> &amp; imgData );
           int16_t Finalize();
           void SetHeight( const int height ) { _height = _width = height; } //assuming 1:1 aspect ratio

       private:
           int16_t AddStream( OutputStream * ost, AVFormatContext * formatCtx, AVCodec ** codec, enum AVCodecID codecId );
           int16_t OpenVideo( AVFormatContext * formatCtx, AVCodec *codec, OutputStream * ost, AVDictionary * optArg );
           static AVFrame * AllocPicture( enum AVPixelFormat pixFmt, int width, int height );
           static AVFrame * GetVideoFrame( uint8_t * imgData, OutputStream * ost, const int width, const int height );
           static int WriteFrame( AVFormatContext * formatCtx, const AVRational * timeBase, AVStream * stream, AVPacket * packet );

           int _width;
           int _height;
           OutputStream _ost;
           AVFormatContext * _formatCtx;
           AVDictionary * _dict;
    };

    #endif //MPEG_WRITER
    </imgdata></vector></string></iostream>

    MP4Writer.cpp

    #include
    #include <algorithm>

    MP4Writer::MP4Writer()
    {
       _width = 0;
       _height = 0;
    }

    void MP4Writer::Init()
    {
       av_register_all();
    }

    /**
    sets up output stream for the specified path.
    note that the output format is deduced automatically from the file extension passed
    @param path: output file path
    @returns: -1 = output could not be deduced, -2 = invalid codec, -3 = error opening output file,
              -4 = error writing header
    */
    int16_t MP4Writer::SetOutput( const std::string &amp; path )
    {
       int error;
       AVCodec * codec;
       AVOutputFormat * format;

       _ost = OutputStream{}; //TODO reset state in a more focused way?

       //allocate output media context
       avformat_alloc_output_context2( &amp;_formatCtx, NULL, NULL, path.c_str() );
       if ( !_formatCtx ) {
           std::cout &lt;&lt; "could not deduce output format from file extension.  aborting" &lt;&lt; std::endl;
           return -1;
       }
       //set format
       format = _formatCtx->oformat;
       if ( format->video_codec != AV_CODEC_ID_NONE ) {
           AddStream( &amp;_ost, _formatCtx, &amp;codec, format->video_codec );
       }
       else {
           std::cout &lt;&lt; "there is no video codec set.  aborting" &lt;&lt; std::endl;
           return -2;
       }

       OpenVideo( _formatCtx, codec, &amp;_ost, _dict );

       av_dump_format( _formatCtx, 0, path.c_str(), 1 );

       //open output file
       if ( !( format->flags &amp; AVFMT_NOFILE )) {
           error = avio_open( &amp;_formatCtx->pb, path.c_str(), AVIO_FLAG_WRITE );
           if ( error &lt; 0 ) {
               std::cout &lt;&lt; "there was an error opening output file " &lt;&lt; path &lt;&lt; ".  aborting" &lt;&lt; std::endl;
               return -3;
           }
       }

       //write header
       error = avformat_write_header( _formatCtx, &amp;_dict );
       if ( error &lt; 0 ) {
           std::cout &lt;&lt; "an error occurred writing header. aborting" &lt;&lt; std::endl;
           return -4;
       }

       return 0;
    }

    /**
    initialize the output stream
    @param ost: the output stream
    @param formatCtx: the context format
    @param codec: the output codec
    @param codec: the ffmpeg enumerated id of the codec
    @returns: -1 = encoder not found, -2 = stream could not be allocated, -3 = encoding context could not be allocated
    */
    int16_t MP4Writer::AddStream( OutputStream * ost, AVFormatContext * formatCtx, AVCodec ** codec, enum AVCodecID codecId )
    {
       AVCodecContext * ctx; //TODO not sure why this is here, could just set ost->enc directly
       int i;

       //detect the encoder
       *codec = avcodec_find_encoder( codecId );
       if ( (*codec) == NULL ) {
           std::cout &lt;&lt; "could not find encoder.  aborting" &lt;&lt; std::endl;
           return -1;
       }

       //allocate stream
       ost->st = avformat_new_stream( formatCtx, NULL );
       if ( ost->st == NULL ) {
           std::cout &lt;&lt; "could not allocate stream.  aborting" &lt;&lt; std::endl;
           return -2;
       }

       //allocate encoding context
       ost->st->id = formatCtx->nb_streams - 1;
       ctx = avcodec_alloc_context3( *codec );
       if ( ctx == NULL ) {
           std::cout &lt;&lt; "could not allocate encoding context.  aborting" &lt;&lt; std::endl;
           return -3;
       }

       ost->enc = ctx;

       //set context params
       ctx->codec_id = AV_CODEC_ID_H264;
       ctx->bit_rate = 4000 * 1000;
       ctx->width = _width;
       ctx->height = _height;
       ost->st->time_base = AVRational{ 1, 12 };
       ctx->time_base = ost->st->time_base;
       ctx->gop_size = 1;
       ctx->pix_fmt = AV_PIX_FMT_YUV420P;

       //if neccesary, set stream headers and formats separately
       if ( formatCtx->oformat->flags &amp; AVFMT_GLOBALHEADER ) {
           std::cout &lt;&lt; "setting stream and headers to be separate" &lt;&lt; std::endl;
           ctx->flags |= AV_CODEC_FLAG_GLOBAL_HEADER;
       }

       return 0;
    }

    /**
    open the video for writing
    @param formatCtx: the format context
    @param codec: output codec
    @param ost: output stream
    @param optArg: dictionary
    @return: -1 = error opening codec, -2 = allocate new frame, -3 = copy stream params
    */
    int16_t MP4Writer::OpenVideo( AVFormatContext * formatCtx, AVCodec *codec, OutputStream * ost, AVDictionary * optArg )
    {
       int error;
       AVCodecContext * ctx = ost->enc;
       AVDictionary * dict = NULL;
       av_dict_copy( &amp;dict, optArg, 0 );

       //open codec
       error = avcodec_open2( ctx, codec, &amp;dict );
       av_dict_free( &amp;dict );
       if ( error &lt; 0 ) {
           std::cout &lt;&lt; "there was an error opening the codec.  aborting" &lt;&lt; std::endl;
           return -1;
       }

       //allocate new frame
       ost->frame = AllocPicture( ctx->pix_fmt, ctx->width, ctx->height );
       if ( ost->frame == NULL ) {
           std::cout &lt;&lt; "there was an error allocating a new frame.  aborting" &lt;&lt; std::endl;
           return -2;
       }

       //copy steam params
       error = avcodec_parameters_from_context( ost->st->codecpar, ctx );
       if ( error &lt; 0 ) {
           std::cout &lt;&lt; "could not copy stream parameters.  aborting" &lt;&lt; std::endl;
           return -3;
       }

       return 0;
    }

    /**
    allocate a new frame
    @param pixFmt: ffmpeg enumerated pixel format
    @param width: output width
    @param height: output height
    @returns: an inititalized frame
    */
    AVFrame * MP4Writer::AllocPicture( enum AVPixelFormat pixFmt, int width, int height )
    {
       AVFrame * picture;
       int error;

       //allocate the frame
       picture = av_frame_alloc();
       if ( picture == NULL ) {
           std::cout &lt;&lt; "there was an error allocating the picture" &lt;&lt; std::endl;
           return NULL;
       }

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

       //allocate the frame's data buffer
       error = av_frame_get_buffer( picture, 32 );
       if ( error &lt; 0 ) {
           std::cout &lt;&lt; "could not allocate frame data" &lt;&lt; std::endl;
           return NULL;
       }
       picture->pts = 0;
       return picture;
    }

    /**
    convert raw RGB buffer to YUV frame
    @return: frame that contains image data
    */
    AVFrame * MP4Writer::GetVideoFrame( uint8_t * imgData, OutputStream * ost, const int width, const int height )
    {
       int error;
       AVCodecContext * ctx = ost->enc;

       //prepare the frame
       error = av_frame_make_writable( ost->frame );
       if ( error &lt; 0 ) {
           std::cout &lt;&lt; "could not make frame writeable" &lt;&lt; std::endl;
           return NULL;
       }

       //TODO set this context one time per run, or even better, one time at init
       //convert RGB to YUV
       struct SwsContext* fooContext = sws_getContext( width, height, AV_PIX_FMT_BGR24,
           width, height, AV_PIX_FMT_YUV420P, SWS_BICUBIC, NULL, NULL, NULL );
       int inLinesize[1] = { 3 * width }; // RGB stride
       uint8_t * inData[1] = { imgData };
       int sliceHeight = sws_scale( fooContext, inData, inLinesize, 0, height, ost->frame->data, ost->frame->linesize );
       sws_freeContext( fooContext );

       ost->frame->pts = ost->next_pts++;
       //TODO does the frame need to be returned here as it is available at the class level?
       return ost->frame;
    }

    /**
    write frame to file
    @param formatCtx: the output format context
    @param timeBase: the framerate
    @param stream: output stream
    @param packet: data packet
    @returns: see return values for av_interleaved_write_frame
    */
    int MP4Writer::WriteFrame( AVFormatContext * formatCtx, const AVRational * timeBase, AVStream * stream, AVPacket * packet )
    {
       av_packet_rescale_ts( packet, *timeBase, stream->time_base );
       packet->stream_index = stream->index;

       //write compressed file to media file
       return av_interleaved_write_frame( formatCtx, packet );
    }

    int16_t MP4Writer::Write( std::vector<imgdata> &amp; imgData )
    {
       int16_t errorCount = 0;
       int16_t retVal = 0;
       bool countingUp = true;
       size_t i = 0;
       while ( true ) {
           //don't show first frame again when counting back down
           if ( !countingUp &amp;&amp; i == 0 ) {
               break;
           }
           uint8_t * pixels = imgData[i].GetBits( imgData[i].mp4Input );
           AddFrame( pixels );

           //handle inc/dec without repeating last frame
           if ( countingUp ) {
               if ( i == imgData.size() -1 ) {
                   countingUp = false;
                   i--;
               }
               else {
                   i++;
               }
           }
           else {
               i--;
           }
       }
       Finalize();
       return 0; //TODO return error code
    }

    /**
    add another frame to output video
    @param imgData: the raw image data
    @returns -1 = error encoding video frame, -2 = error writing frame
    */
    int16_t MP4Writer::AddFrame( uint8_t * imgData )
    {
       int error;
       AVCodecContext * ctx;
       AVFrame * frame;
       int gotPacket = 0;
       AVPacket pkt = { 0 };

       ctx = _ost.enc;
       av_init_packet( &amp;pkt );

       frame = GetVideoFrame( imgData, &amp;_ost, _width, _height );

       //encode the image
       error = avcodec_encode_video2( ctx, &amp;pkt, frame, &amp;gotPacket );
       if ( error &lt; 0 ) {
           std::cout &lt;&lt; "there was an error encoding the video frame" &lt;&lt; std::endl;
           return -1;
       }

       //write the frame.  NOTE: this doesn't kick in until the encoder has received a certain number of frames
       if ( gotPacket ) {
           error = WriteFrame( _formatCtx, &amp;ctx->time_base, _ost.st, &amp;pkt );
           if ( error &lt; 0 ) {
               std::cout &lt;&lt; "the video frame could not be written" &lt;&lt; std::endl;
               return -2;
           }
       }
       return 0;
    }

    /**
    finalize output video and cleanup
    */
    int16_t MP4Writer::Finalize()
    {
       av_write_trailer( _formatCtx );
       avcodec_free_context( &amp;_ost.enc );
       av_frame_free( &amp;_ost.frame);
       av_frame_free( &amp;_ost.tmp_frame );
       avio_closep( &amp;_formatCtx->pb );
       avformat_free_context( _formatCtx );
       sws_freeContext( _ost.sws_ctx );
       swr_free( &amp;_ost.swr_ctx);
       return 0;
    }
    </imgdata></algorithm>

    usage

    #include
    #include
    #include <vector>

    struct ImgData
    {
       unsigned int width;
       unsigned int height;
       std::string path;
       FIBITMAP * mp4Input;

       uint8_t * GetBits( FIBITMAP * bmp ) { return FreeImage_GetBits( bmp ); }
    };

    int main()
    {
        std::vector<imgdata> imgDataVec;
        //load images and push to imgDataVec
        MP4Writer mp4Writer;
        mp4Writer.SetHeight( 1200 ); //assumes 1:1 aspect ratio
        mp4Writer.Init();
        mp4Writer.SetOutput( "test.mp4" );
        mp4Writer.Write( imgDataVec );
    }
    </imgdata></vector>
  • Why X.Org's X Server has stopped working on Google Colab ?

    20 février 2021, par Rahul

    I am Using X server for the virtual screen on Google Colab and capturing that screen with ffmpeg to record it and live stream it to twitch. (for the reinforcement learning project)

    &#xA;

    &#xA;

    The above process was completely working till my last use of my Colab notebook (on mid-January 2021), but now (on 19th February 2021) I am using the same notebook and the streaming code has stopped working.

    &#xA;

    &#xA;

    I am adding config and log file data below. (I have never seen these files before because it was working, now it's not so I don't have any idea what wrong)

    &#xA;

    The config file stored at /etc/X11/xorg.conf have the following data :

    &#xA;

    # nvidia-xconfig: X configuration file generated by nvidia-xconfig&#xA;# nvidia-xconfig:  version 418.67&#xA;&#xA;Section "ServerLayout"&#xA;    Identifier     "Layout0"&#xA;    Screen      0  "Screen0"&#xA;    InputDevice    "Keyboard0" "CoreKeyboard"&#xA;    InputDevice    "Mouse0" "CorePointer"&#xA;EndSection&#xA;&#xA;Section "Files"&#xA;EndSection&#xA;&#xA;Section "InputDevice"&#xA;    # generated from default&#xA;    Identifier     "Mouse0"&#xA;    Driver         "mouse"&#xA;    Option         "Protocol" "auto"&#xA;    Option         "Device" "/dev/mouse"&#xA;    Option         "Emulate3Buttons" "no"&#xA;    Option         "ZAxisMapping" "4 5"&#xA;EndSection&#xA;&#xA;Section "InputDevice"&#xA;    # generated from default&#xA;    Identifier     "Keyboard0"&#xA;    Driver         "kbd"&#xA;EndSection&#xA;&#xA;Section "Monitor"&#xA;    Identifier     "Monitor0"&#xA;    VendorName     "Unknown"&#xA;    ModelName      "Unknown"&#xA;    HorizSync       28.0 - 33.0&#xA;    VertRefresh     43.0 - 72.0&#xA;    Option         "DPMS"&#xA;EndSection&#xA;&#xA;Section "Device"&#xA;    Identifier     "Device0"&#xA;    Driver         "nvidia"&#xA;    VendorName     "NVIDIA Corporation"&#xA;    BoardName      "Tesla T4"&#xA;    BusID          "PCI:0:4:0"&#xA;    MatchSeat      "seat-1"&#xA;EndSection&#xA;&#xA;Section "Screen"&#xA;    Identifier     "Screen0"&#xA;    Device         "Device0"&#xA;    Monitor        "Monitor0"&#xA;    DefaultDepth    24&#xA;    Option         "AllowEmptyInitialConfiguration" "True"&#xA;    SubSection     "Display"&#xA;        Virtual     1920 1080&#xA;        Depth       24&#xA;    EndSubSection&#xA;EndSection&#xA;

    &#xA;

    The log file stored at /var/log/Xorg.0.log have the following data :

    &#xA;

    [   464.605] &#xA;X.Org X Server 1.19.6&#xA;Release Date: 2017-12-20&#xA;[   464.605] X Protocol Version 11, Revision 0&#xA;[   464.605] Build Operating System: Linux 4.15.0-124-generic x86_64 Ubuntu&#xA;[   464.605] Current Operating System: Linux 9d3fe3949671 4.19.112&#x2B; #1 SMP Thu Jul 23 08:00:38 PDT 2020 x86_64&#xA;[   464.605] Kernel command line: BOOT_IMAGE=/syslinux/vmlinuz.A init=/usr/lib/systemd/systemd boot=local rootwait ro noresume noswap loglevel=7 noinitrd console=ttyS0 security=apparmor virtio_net.napi_tx=1 systemd.unified_cgroup_hierarchy=false systemd.legacy_systemd_cgroup_controller=false csm.disabled=1 dm_verity.error_behavior=3 dm_verity.max_bios=-1 dm_verity.dev_wait=1 i915.modeset=1 cros_efi loadpin.enabled=0 root=/dev/dm-0 "dm=1 vroot none ro 1,0 4077568 verity payload=PARTUUID=555BDB75-CBD7-CD4A-B24E-29B13D7AC0DF hashtree=PARTUUID=555BDB75-CBD7-CD4A-B24E-29B13D7AC0DF hashstart=4077568 alg=sha256 root_hexdigest=42104d547ac104fb7061529e78f53e4f3e8c3d3cbb040dc6e0f84aad68491347 salt=9dc7f3acc4e2ce65be16356e960c2b21b51a917fa31d2e891fd295490c991e41" mitigations=off&#xA;[   464.605] Build Date: 30 November 2020  08:01:56PM&#xA;[   464.605] xorg-server 2:1.19.6-1ubuntu4.8 (For technical support please see http://www.ubuntu.com/support) &#xA;[   464.605] Current version of pixman: 0.34.0&#xA;[   464.605]    Before reporting problems, check http://wiki.x.org&#xA;    to make sure that you have the latest version.&#xA;[   464.605] Markers: (--) probed, (**) from config file, (==) default setting,&#xA;    (&#x2B;&#x2B;) from command line, (!!) notice, (II) informational,&#xA;    (WW) warning, (EE) error, (NI) not implemented, (??) unknown.&#xA;[   464.605] (==) Log file: "/var/log/Xorg.0.log", Time: Sat Feb 20 03:10:44 2021&#xA;[   464.606] (==) Using config file: "/etc/X11/xorg.conf"&#xA;[   464.606] (==) Using system config directory "/usr/share/X11/xorg.conf.d"&#xA;[   464.607] (==) ServerLayout "Layout0"&#xA;[   464.607] (**) |-->Screen "Screen0" (0)&#xA;[   464.607] (**) |   |-->Monitor "Monitor0"&#xA;[   464.607] (**) |   |-->Device "Device0"&#xA;[   464.607] (**) |-->Input Device "Keyboard0"&#xA;[   464.607] (**) |-->Input Device "Mouse0"&#xA;[   464.607] (==) Automatically adding devices&#xA;[   464.607] (==) Automatically enabling devices&#xA;[   464.607] (==) Automatically adding GPU devices&#xA;[   464.607] (==) Automatically binding GPU devices&#xA;[   464.607] (==) Max clients allowed: 256, resource mask: 0x1fffff&#xA;[   464.607] (WW) The directory "/usr/share/fonts/X11/cyrillic" does not exist.&#xA;[   464.607]    Entry deleted from font path.&#xA;[   464.607] (WW) The directory "/usr/share/fonts/X11/100dpi/" does not exist.&#xA;[   464.607]    Entry deleted from font path.&#xA;[   464.607] (WW) The directory "/usr/share/fonts/X11/75dpi/" does not exist.&#xA;[   464.607]    Entry deleted from font path.&#xA;[   464.607] (WW) The directory "/usr/share/fonts/X11/Type1" does not exist.&#xA;[   464.607]    Entry deleted from font path.&#xA;[   464.607] (WW) The directory "/usr/share/fonts/X11/100dpi" does not exist.&#xA;[   464.607]    Entry deleted from font path.&#xA;[   464.607] (WW) The directory "/usr/share/fonts/X11/75dpi" does not exist.&#xA;[   464.607]    Entry deleted from font path.&#xA;[   464.607] (==) FontPath set to:&#xA;    /usr/share/fonts/X11/misc,&#xA;    built-ins&#xA;[   464.607] (==) ModulePath set to "/usr/lib/xorg/modules"&#xA;[   464.607] (WW) Hotplugging is on, devices using drivers &#x27;kbd&#x27;, &#x27;mouse&#x27; or &#x27;vmmouse&#x27; will be disabled.&#xA;[   464.607] (WW) Disabling Keyboard0&#xA;[   464.607] (WW) Disabling Mouse0&#xA;[   464.607] (II) Loader magic: 0x556eb77b8020&#xA;[   464.607] (II) Module ABI versions:&#xA;[   464.607]    X.Org ANSI C Emulation: 0.4&#xA;[   464.607]    X.Org Video Driver: 23.0&#xA;[   464.607]    X.Org XInput driver : 24.1&#xA;[   464.607]    X.Org Server Extension : 10.0&#xA;[   464.607] (EE) dbus-core: error connecting to system bus: org.freedesktop.DBus.Error.FileNotFound (Failed to connect to socket /var/run/dbus/system_bus_socket: No such file or directory)&#xA;[   464.609] (--) PCI: (0:0:4:0) 10de:1eb8:10de:12a2 rev 161, Mem @ 0xc0000000/16777216, 0x380000000/268435456, 0x390000000/33554432&#xA;[   464.609] (II) no primary bus or device found&#xA;[   464.609] (II) LoadModule: "glx"&#xA;[   464.609] (II) Loading /usr/lib/xorg/modules/extensions/libglx.so&#xA;[   464.610] (II) Module glx: vendor="X.Org Foundation"&#xA;[   464.610]    compiled for 1.19.6, module version = 1.0.0&#xA;[   464.610]    ABI class: X.Org Server Extension, version 10.0&#xA;[   464.610] (II) LoadModule: "nvidia"&#xA;[   464.610] (II) Loading /usr/lib/xorg/modules/drivers/nvidia_drv.so&#xA;[   464.610] (II) Module nvidia: vendor="NVIDIA Corporation"&#xA;[   464.610]    compiled for 4.0.2, module version = 1.0.0&#xA;[   464.610]    Module class: X.Org Video Driver&#xA;[   464.610] (II) NVIDIA dlloader X Driver  418.67  Sat Apr  6 02:51:17 CDT 2019&#xA;[   464.610] (II) NVIDIA Unified Driver for all Supported NVIDIA GPUs&#xA;[   464.610] xf86EnableIOPorts: failed to set IOPL for I/O (Operation not permitted)&#xA;[   464.610] (II) Loading sub module "fb"&#xA;[   464.610] (II) LoadModule: "fb"&#xA;[   464.611] (II) Loading /usr/lib/xorg/modules/libfb.so&#xA;[   464.611] (II) Module fb: vendor="X.Org Foundation"&#xA;[   464.611]    compiled for 1.19.6, module version = 1.0.0&#xA;[   464.611]    ABI class: X.Org ANSI C Emulation, version 0.4&#xA;[   464.611] (II) Loading sub module "wfb"&#xA;[   464.611] (II) LoadModule: "wfb"&#xA;[   464.611] (II) Loading /usr/lib/xorg/modules/libwfb.so&#xA;[   464.611] (II) Module wfb: vendor="X.Org Foundation"&#xA;[   464.611]    compiled for 1.19.6, module version = 1.0.0&#xA;[   464.611]    ABI class: X.Org ANSI C Emulation, version 0.4&#xA;[   464.611] (II) Loading sub module "ramdac"&#xA;[   464.611] (II) LoadModule: "ramdac"&#xA;[   464.611] (II) Module "ramdac" already built-in&#xA;[   464.637] (EE) NVIDIA: Failed to initialize the NVIDIA kernel module. Please see the&#xA;[   464.637] (EE) NVIDIA:     system&#x27;s kernel log for additional error messages and&#xA;[   464.637] (EE) NVIDIA:     consult the NVIDIA README for details.&#xA;[   464.662] (EE) NVIDIA: Failed to initialize the NVIDIA kernel module. Please see the&#xA;[   464.662] (EE) NVIDIA:     system&#x27;s kernel log for additional error messages and&#xA;[   464.662] (EE) NVIDIA:     consult the NVIDIA README for details.&#xA;[   464.662] (EE) No devices detected.&#xA;[   464.662] (==) Matched modesetting as autoconfigured driver 0&#xA;[   464.662] (==) Matched fbdev as autoconfigured driver 1&#xA;[   464.662] (==) Matched vesa as autoconfigured driver 2&#xA;[   464.662] (==) Assigned the driver to the xf86ConfigLayout&#xA;[   464.662] (II) LoadModule: "modesetting"&#xA;[   464.662] (II) Loading /usr/lib/xorg/modules/drivers/modesetting_drv.so&#xA;[   464.663] (II) Module modesetting: vendor="X.Org Foundation"&#xA;[   464.663]    compiled for 1.19.6, module version = 1.19.6&#xA;[   464.663]    Module class: X.Org Video Driver&#xA;[   464.663]    ABI class: X.Org Video Driver, version 23.0&#xA;[   464.663] (II) LoadModule: "fbdev"&#xA;[   464.663] (II) Loading /usr/lib/xorg/modules/drivers/fbdev_drv.so&#xA;[   464.663] (II) Module fbdev: vendor="X.Org Foundation"&#xA;[   464.663]    compiled for 1.19.3, module version = 0.4.4&#xA;[   464.663]    Module class: X.Org Video Driver&#xA;[   464.663]    ABI class: X.Org Video Driver, version 23.0&#xA;[   464.663] (II) LoadModule: "vesa"&#xA;[   464.663] (II) Loading /usr/lib/xorg/modules/drivers/vesa_drv.so&#xA;[   464.663] (II) Module vesa: vendor="X.Org Foundation"&#xA;[   464.663]    compiled for 1.19.3, module version = 2.3.4&#xA;[   464.663]    Module class: X.Org Video Driver&#xA;[   464.663]    ABI class: X.Org Video Driver, version 23.0&#xA;[   464.663] (II) NVIDIA dlloader X Driver  418.67  Sat Apr  6 02:51:17 CDT 2019&#xA;[   464.663] (II) NVIDIA Unified Driver for all Supported NVIDIA GPUs&#xA;[   464.663] (II) modesetting: Driver for Modesetting Kernel Drivers: kms&#xA;[   464.663] (II) FBDEV: driver for framebuffer: fbdev&#xA;[   464.663] (II) VESA: driver for VESA chipsets: vesa&#xA;[   464.663] xf86EnableIOPorts: failed to set IOPL for I/O (Operation not permitted)&#xA;[   464.663] (EE) open /dev/dri/card0: No such file or directory&#xA;[   464.663] (WW) Falling back to old probe method for modesetting&#xA;[   464.663] (EE) open /dev/dri/card0: No such file or directory&#xA;[   464.663] (WW) Falling back to old probe method for fbdev&#xA;[   464.663] (II) Loading sub module "fbdevhw"&#xA;[   464.663] (II) LoadModule: "fbdevhw"&#xA;[   464.663] (II) Loading /usr/lib/xorg/modules/libfbdevhw.so&#xA;[   464.663] (II) Module fbdevhw: vendor="X.Org Foundation"&#xA;[   464.663]    compiled for 1.19.6, module version = 0.0.2&#xA;[   464.663]    ABI class: X.Org Video Driver, version 23.0&#xA;[   464.664] (EE) open /dev/fb0: No such file or directory&#xA;[   464.664] (WW) Falling back to old probe method for vesa&#xA;[   464.664] (WW) VGA arbiter: cannot open kernel arbiter, no multi-card support&#xA;[   464.664] (EE) Screen 0 deleted because of no matching config section.&#xA;[   464.664] (II) UnloadModule: "modesetting"&#xA;[   464.664] (EE) Device(s) detected, but none match those in the config file.&#xA;[   464.664] (EE) &#xA;Fatal server error:&#xA;[   464.664] (EE) no screens found(EE) &#xA;[   464.664] (EE) &#xA;Please consult the The X.Org Foundation support &#xA;     at http://wiki.x.org&#xA; for help. &#xA;[   464.664] (EE) Please also check the log file at "/var/log/Xorg.0.log" for additional information.&#xA;[   464.664] (EE) &#xA;[   464.664] (EE) Server terminated with error (1). Closing log file.&#xA;&#xA;

    &#xA;

    I am using this github repo to setup the video-streamer

    &#xA;

    If anyone wants the colab notebook for the example then I will add it over here.

    &#xA;

    For this problem I am really not sure where to file an issue for this so that's why I am writing this here.

    &#xA;

  • Introducing the Data Warehouse Connector feature

    30 janvier, par Matomo Core Team

    Matomo is built on a simple truth : your data belongs to you, and you should have complete control over it. That’s why we’re excited to launch our new Data Warehouse Connector feature for Matomo Cloud, giving you even more ways to work with your analytics data. 

    Until now, getting raw data from Matomo Cloud required APIs and custom scripts, or waiting for engineering help.  

    Our new Data Warehouse Connector feature removes those barriers. You can now access your raw, unaggregated data and schedule regular exports straight to your data warehouse. 

    The feature works with all major data warehouses including (but not limited to) : 

    • Google BigQuery 
    • Amazon Redshift 
    • Snowflake 
    • Azure Synapse Analytics 
    • Apache Hive 
    • Teradata 

    You can schedule exports, combine your Matomo data with other data sources in your data warehouse, and easily query data with SQL-like queries. 

    Direct raw data access for greater data portability 

    Waiting for engineering support can delay your work. Managing API connections and writing scripts can be time-consuming. This keeps you from focusing on what you do best—analysing data. 

    BigQuery create-table-menu

    With the Data Warehouse Connector feature, you get direct access to your raw Matomo data without the technical setup. So, you can spend more time analysing data and finding insights that matter. 

    Bringing your data together 

    Answering business questions often requires data from multiple sources. A single customer interaction might span your CRM, web analytics, sales systems, and more. Piecing this data together manually is time-consuming—what starts as a seemingly simple question from stakeholders can turn into hours of work collecting and comparing data across different tools. 

    This feature lets you combine your Matomo data with data from other business systems in your data warehouse. Instead of switching between tools or manually comparing spreadsheets, you can analyse all your data in one place to better understand how customers interact with your business. 

    Easy, custom analysis with SQL-like queries 

    Standard, pre-built reports often don’t address the specific, detailed questions that analysts need to answer.  

    When you use the Data Warehouse Connector feature, you can use SQL-like queries in your data warehouse to do detailed, customised analysis. This flexibility allows you to explore your data in depth and uncover specific insights that aren’t possible with pre-built reports. 

    Here is an example of how you might use SQL-like query to compare the behaviours of paying vs. non-paying users : 

    				
                                            <xmp>SELECT  

    custom_dimension_value AS user_type, -- Assuming 'user_type' is stored in a custom dimension

    COUNT(*) AS total_visits,  

    AVG(visit_total_time) AS avg_duration,

    SUM(conversion.revenue) AS total_spent  

    FROM  

    `your_project.your_dataset.matomo_log_visit` AS visit

    LEFT JOIN  

    `your_project.your_dataset.matomo_log_conversion` AS conversion  

    ON  

    visit.idvisit = conversion.idvisit  

    GROUP BY  

    custom_dimension_value; </xmp>
                                   

    This query helps you compare metrics such as the number of visits, average session duration, and total amount spent between paying and non-paying users. It provides a full view of behavioural differences between these groups. 

    Advanced data manipulation and visualisation 

    When you need to create detailed reports or dive deep into data analysis, working within the constraints of a fixed user interface (UI) can limit your ability to draw insights. 

    Exporting your Matomo data to a data warehouse like BigQuery provides greater flexibility for in-depth manipulation and advanced visualisations, enabling you to uncover deeper insights and tailor your reports more effectively. 

    Getting started 

    To set up data warehouse exports in your Matomo : 

    1. Go to System Admin (cog icon in the top right corner) 
    2. Select ‘Export’ from the left-hand menu 
    3. Choose ‘Data Warehouse Connector’ 

    You’ll find detailed instructions in our data warehouse exports guide 

    Please note, enabling this feature will cost an additional 10% of your current subscription. You can view the exact cost by following the steps above. 

    New to Matomo ? Start your 21-day free trial now (no credit card required), or request a demo.