Recherche avancée

Médias (91)

Autres articles (78)

  • 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 (...)

  • Des sites réalisés avec MediaSPIP

    2 mai 2011, par

    Cette page présente quelques-uns des sites fonctionnant sous MediaSPIP.
    Vous pouvez bien entendu ajouter le votre grâce au formulaire en bas de page.

  • 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 (...)

Sur d’autres sites (8201)

  • Custom buffer for FFMPEG

    3 décembre 2015, par nmarevic

    I have a question regarding buffer read with ffmpeg.
    Idea is as it follows : an outside module (can not change it) is providing me video stream in chunks of data and it is giving me input data and it’s size in bytes ("framfunction" function input parameters). I have to copy input data to a buffer and read it with ffmpeg (Zeranoe) and extract video frames. Each time I receive new data, my function "framfunction" will be called. All unprocessed data from a first run will be moved at the beginning of the buffer followed by a new data on the second run and so on. It is essentially based on source and Dranger tutorials. My current attempt is like this and just look at comments (I’ve left only ones regarding current buffer function) in code to get a picture what I want to do(I know it is messy and it works - sort of ; skipping some frames. Any suggestions around ffmpeg code and buffer design are welcome) :

    #include <iostream>
    #include <string>

    extern "C"
    {
    #include <libavformat></libavformat>avformat.h>
    #include <libavcodec></libavcodec>avcodec.h>
    #include <libswscale></libswscale>swscale.h>
    #include <libavformat></libavformat>avio.h>
    #include <libavutil></libavutil>file.h>
    }
    struct buffer_data {
      uint8_t *ptr;
      size_t size;
    };

    static int read_packet(void *opaque, uint8_t *buf, int buf_size)
    {
      struct buffer_data *bd = (struct buffer_data *)opaque;
      buf_size = FFMIN(buf_size, bd->size);
      memcpy(buf, bd->ptr, buf_size);
      bd->ptr += buf_size;
      bd->size -= buf_size;
      return buf_size;
    }

    class videoclass
    {
    private:
      uint8_t* inputdatabuffer;
      size_t offset;

    public:
      videoclass();
      ~videoclass();
      int framfunction(uint8_t* inputbytes, int inputbytessize);
    };

    videoclass::videoclass()
      : inputdatabuffer(nullptr)
      , offset(0)
    {
      inputdatabuffer = new uint8_t[8388608]; //buffer where the input data will be stored
    }

    videoclass::~videoclass()
    {
      delete[] inputdatabuffer;
    }


    int videoclass::framfunction(uint8_t* inputbytes, int inputbytessize)
    {
      int i, videoStream, numBytes, frameFinished;
      AVFormatContext *pFormatCtx = NULL;
      AVCodecContext *pCodecCtx = NULL;
      AVIOContext   *avio_ctx = NULL;
      AVCodec   *pCodec = NULL;
      AVFrame   *pFrame = NULL;
      AVFrame   *pFrameRGB = NULL;
      AVPacket packet;
      uint8_t   *buffer = NULL;
      uint8_t   *avio_ctx_buffer = NULL;
      size_t   avio_ctx_buffer_size = 4096;
      size_t   bytes_processed = 0;
      struct buffer_data bd = { 0 };

      //if (av_file_map("sample.ts", &amp;inputbytes, &amp;inputbytessize, 0, NULL) &lt; 0)//
      //   return -1;

      memcpy(inputdatabuffer + offset, inputbytes, inputbytessize);//copy new data to buffer inputdatabuffer with offset calculated at the end of previous function run. In other words - cope new data after unprocessed data from a previous call
      offset += inputbytessize; //total number of bytes in buffer. Size of an unprocessed data from the last run + size of new data (inputbytessize)

      bd.ptr = inputdatabuffer;
      bd.size = offset;

      if (!(pFormatCtx = avformat_alloc_context()))
         return -1;
      avio_ctx_buffer = (uint8_t *)av_malloc(avio_ctx_buffer_size);
      avio_ctx = avio_alloc_context(avio_ctx_buffer, avio_ctx_buffer_size,0, &amp;bd, &amp;read_packet, NULL, NULL);
      pFormatCtx->pb = avio_ctx;

      av_register_all();
      avcodec_register_all();

      pFrame = av_frame_alloc();
      pFrameRGB = av_frame_alloc();

      if (avformat_open_input(&amp;pFormatCtx, NULL, NULL, NULL) != 0)
         return -2;
      if (avformat_find_stream_info(pFormatCtx, NULL) &lt; 0)
         return -3;

      videoStream = -1;
      for (i = 0; i &lt; pFormatCtx->nb_streams; i++)
         if (pFormatCtx->streams[i]->codec->codec_type == AVMEDIA_TYPE_VIDEO) {
            videoStream = i;
            break;
         }
      if (videoStream == -1)
         return -4;

      pCodecCtx = pFormatCtx->streams[videoStream]->codec;

      pCodec = avcodec_find_decoder(pCodecCtx->codec_id);
      if (pCodec == NULL){
         std::cout &lt;&lt; "Unsupported codec" &lt;&lt; std::endl;
         return -5;
      }

      if (avcodec_open2(pCodecCtx, pCodec, NULL) &lt; 0)
         return -6;

      numBytes = avpicture_get_size(PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);
      buffer = (uint8_t *)av_malloc(numBytes*sizeof(uint8_t));

      avpicture_fill((AVPicture *)pFrameRGB, buffer, PIX_FMT_BGR24, pCodecCtx->width, pCodecCtx->height);

      while (av_read_frame(pFormatCtx, &amp;packet) >= 0){
         if (packet.stream_index == videoStream){
            avcodec_decode_video2(pCodecCtx, pFrame, &amp;frameFinished, &amp;packet);
            if (frameFinished){
               std::cout &lt;&lt; "Yaay, frame found" &lt;&lt; std::endl;
               }

         }
         av_free_packet(&amp;packet);

         bytes_processed = (size_t)pFormatCtx->pb->pos; //data which is processed so far (x bytes out of inputbytessize)??????????????????????????????
      }

      offset -= bytes_processed; //size of unprocessed data

      av_free(buffer);
      av_free(pFrameRGB);
      av_free(pFrame);

      avcodec_close(pCodecCtx);

      av_freep(&amp;avio_ctx->buffer);
      av_freep(&amp;avio_ctx);


      avformat_close_input(&amp;pFormatCtx);


      memmove(inputdatabuffer, inputdatabuffer + bytes_processed, offset);//move unprocessed data to begining of the main buffer

         return 0;
    }
    </string></iostream>

    Call of my function would be something like this

    WHILE(VIDEO_INPUT)
    {
       READ VIDEO DATA FROM INPUT BUFFER
       STORE DATA FROM INPUT BUFFER AND SIZE OP THAT DATA TO VARIABLES NEW_DATA AND NEW_DATA_SIZE
       CALL FUNCTION FRAMMUNCTION AND PASS NEW_DATA AND NEW_DATA_FUNCTION
       DO OTHER THINGS
    }

    What I would like to know is what is exact size of unprocessed data. Comments in code are showing my attempt but I think it is not good enough so I need some help with that issue.

    EDIT : magic question is how to get correct "bytes_processed" size. I’ve also made an pdf with explanation how my buffer should work pdf file
    Thanks

  • Unable to open audio file on Heroku using Librosa

    15 mars 2020, par Rohan Bojja

    I have a feature extraction REST API written in Python using the Librosa library (Extracting audio features), it receives an audio file through HTTP POST and responds with a list of features(such as MFCC,etc).

    Since librosa depends on SoundFile (libsndfile1 / libsndfile-dev), it doesn’t support all the formats, I’m converting the audio file using ffmpeg-python wrapper (https://kkroening.github.io/ffmpeg-python/) .

    It works just fine on my Windows 10 machine with Conda, but when I deploy it on Heroku, the librosa.load() functions returns an unknown format error, no matter what format I convert it to. I have tried FLAC, AIFF and WAV.

    My first guess is that the converted format isn’t supported by libsndfile1, but it works on my local server (plus, their documentation says AIFF and WAV are supported), so I’m a little lost.

    I have attached all the relevant snippets of code below, I can provide anything extra if necessary. Any help is highly appreciated. Thanks.

    UPDATE1 :

    I am using pipes instead of writing and reading from disk, worth a mention as the question could be misleading otherwise.

    The log :

    File "/app/app.py", line 31, in upload
    x , sr = librosa.load(audioFile,mono=True,duration=5)
    File "/app/.heroku/python/lib/python3.6/site-packages/librosa/core/audio.py", line 164, in load
    six.reraise(*sys.exc_info())
    File "/app/.heroku/python/lib/python3.6/site-packages/six.py", line 703, in reraise
    raise value
    File "/app/.heroku/python/lib/python3.6/site-packages/librosa/core/audio.py", line 129, in load
    with sf.SoundFile(path) as sf_desc:
    File "/app/.heroku/python/lib/python3.6/site-packages/soundfile.py", line 629, in __init__
    self._file = self._open(file, mode_int, closefd)
    File "/app/.heroku/python/lib/python3.6/site-packages/soundfile.py", line 1184, in _open
    "Error opening {0!r}: ".format(self.name))
    File "/app/.heroku/python/lib/python3.6/site-packages/soundfile.py", line 1357, in _error_check
    raise RuntimeError(prefix + _ffi.string(err_str).decode('utf-8', 'replace'))
    RuntimeError: Error opening &lt;_io.BytesIO object at 0x7f46ad28beb8>: File contains data in an unknown format.
    10.69.244.94 - - [15/Mar/2020:12:37:28 +0000] "POST /receiveWav HTTP/1.1" 500 290 "-" "curl/7.55.1"

    Flask/Librosa code deployed on Heroku (app.py) :

    from flask import Flask, jsonify, request
    import scipy.optimize
    import os,pickle
    import numpy as np
    from sklearn.preprocessing import StandardScaler
    import librosa
    import logging
    import soundfile as sf
    from pydub import AudioSegment
    import subprocess as sp
    import ffmpeg
    from io import BytesIO

    logging.basicConfig(level=logging.DEBUG)

    app = Flask(__name__)

    @app.route('/receiveWav',methods = ['POST'])
    def upload():
       if(request.method == 'POST'):
           f = request.files['file']
           app.logger.info(f'AUDIO FORMAT\n\n\n\n\n\n\n\n\n\n: {f}')
           proc = (
               ffmpeg.input('pipe:')
               .output('pipe:', format='aiff')
               .run_async(pipe_stdin=True,pipe_stdout=True, pipe_stderr=True)
           )
           audioFile,err = proc.communicate(input=f.read())
           audioFile =  BytesIO(audioFile)
           scaler = pickle.load(open("scaler.ok","rb"))
           x , sr = librosa.load(audioFile,mono=True,duration=5)
           y=x
           #Extract the features
           chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr)
           spec_cent = librosa.feature.spectral_centroid(y=y, sr=sr)
           spec_bw = librosa.feature.spectral_bandwidth(y=y, sr=sr)
           rolloff = librosa.feature.spectral_rolloff(y=y, sr=sr)
           zcr = librosa.feature.zero_crossing_rate(y)
           rmse = librosa.feature.rms(y=y)
           mfcc = librosa.feature.mfcc(y=y, sr=sr)
           features = f'{np.mean(chroma_stft)} {np.mean(rmse)} {np.mean(spec_cent)} {np.mean(spec_bw)} {np.mean(rolloff)} {np.mean(zcr)}'    
           for e in mfcc:
               features += f' {np.mean(e)}'
           input_data2 = np.array([float(i) for i in features.split(" ")]).reshape(1,-1)
           input_data2 = scaler.transform(input_data2)
           return jsonify(input_data2.tolist())

    # driver function
    if __name__ == '__main__':  
       app.run(debug = True)

    Aptfile :

    libsndfile1
    libsndfile-dev
    libav-tools
    libavcodec-extra-53
    libavcodec-extra-53
    ffmpeg

    requirements.txt :

    aniso8601==8.0.0
    audioread==2.1.8
    certifi==2019.11.28
    cffi==1.14.0
    Click==7.0
    decorator==4.4.2
    ffmpeg-python==0.2.0
    Flask==1.1.1
    Flask-RESTful==0.3.8
    future==0.18.2
    gunicorn==20.0.4
    itsdangerous==1.1.0
    Jinja2==2.11.1
    joblib==0.14.1
    librosa==0.7.2
    llvmlite==0.31.0
    MarkupSafe==1.1.1
    marshmallow==3.2.2
    numba==0.48.0
    numpy==1.18.1
    pycparser==2.20
    pydub==0.23.1
    pytz==2019.3
    resampy==0.2.2
    scikit-learn==0.22.2.post1
    scipy==1.4.1
    six==1.14.0
    SoundFile==0.10.3.post1
    Werkzeug==1.0.0
    wincertstore==0.2
  • How to sell Piwik services without any confusion ?

    10 octobre 2017, par InnoCraft — Plugins

    As you may know, Piwik is a Free software under the GPL license which guarantees you :

    • The freedom to run the program for any purpose.
    • The freedom to study how it works and change it.
    • The freedom to improve the program, and release your changes.
    • The freedom to redistribute it under the GPL license, and to sell it if you wish.

    In this article we will focus on the Free aspect of Piwik, which is how to rebrand Piwik, how to offer your clients a better experience, and possibly how to make a profit from it ?

    How to sell Piwik services as an agency ?

    As a web analytics software, Piwik is often installed by web agencies when it comes to designing a brand new website for a given customer.
    Most of the time agencies are using Piwik for the following reasons :

    • free of charge
    • data ownership
    • user privacy compliance
    • feature rich while easy to use
    • open source

    Most of the agencies are charging their customers for the installation process, tracking code implementation, analysing reports to get insights about users… but do you know that you could also sell the software as your own brand ? This is where the “White Label” plugin, developed by the InnoCraft company, comes into play.

    White labelling for Piwik

    Creating a “white label” plugin came into the mind of InnoCraft founders when they realized that on any modern Piwik installation, the following components were visible :

    • Piwik branded widgets within the dashboards
    • Piwik marketplace plugin teasers on the admin page
    • Piwik help and support pages
    • the “Piwik” word in general
    • Piwik Mobile app banners
    Piwik branded widget examples

    Example of Piwik branded widgets

    In order to remove all those mentions of Piwik and to start selling this web analytics under your own name, you can either hack Piwik on your own (it is going to take you some precious time and money) or have a look at the White Label plugin on the marketplace where InnoCraft has solved all the challenges already for you.

    The White Label plugin is straightforward. Once downloaded and installed, you will have access to a dedicated interface where you will be able to change the Piwik name by a new custom brand of your choice :

    Piwik white label plugin settings

    Piwik White Label settings

    Once you click Save, all “Piwik” mentions will be substituted by your company name/service :

    Piwik name changed

    Here the Piwik version is changed by the name of the company

    How to make your installation even more customized ?

    Few Piwik users know about this trick, but since 2014 the Piwik templates can be customized through Themes. You are free to design your own template, installing existing ones, or even monetize them through the marketplace :

    Custom theme sample

    A simple example of how Piwik can be easily customized, here fonts and colours are changed

    If you want to know how you can tweak your existing template and make it match your brand and image, just follow our theme documentation. A simple theme with your colors can be built in a few minutes simply by defining different color codes. You can also browse the public themes on the Marketplace.

    Tell us your story

    If you are an agency or any business related in selling Piwik services, we recommend having a look at our FAQ for rebranding, selling, reusing, re-licensing, and including Piwik in my offering. Are you interested or already re-selling Piwik services ? We would love to hear your story and write a blog post about it.

    Do not hesitate to contact the Piwik core team, we’re looking forward to hearing from you.