Recherche avancée

Médias (91)

Autres articles (106)

  • Encoding and processing into web-friendly formats

    13 avril 2011, par

    MediaSPIP automatically converts uploaded files to internet-compatible formats.
    Video files are encoded in MP4, Ogv and WebM (supported by HTML5) and MP4 (supported by Flash).
    Audio files are encoded in MP3 and Ogg (supported by HTML5) and MP3 (supported by Flash).
    Where possible, text is analyzed in order to retrieve the data needed for search engine detection, and then exported as a series of image files.
    All uploaded files are stored online in their original format, so you can (...)

  • (Dés)Activation de fonctionnalités (plugins)

    18 février 2011, par

    Pour gérer l’ajout et la suppression de fonctionnalités supplémentaires (ou plugins), MediaSPIP utilise à partir de la version 0.2 SVP.
    SVP permet l’activation facile de plugins depuis l’espace de configuration de MediaSPIP.
    Pour y accéder, il suffit de se rendre dans l’espace de configuration puis de se rendre sur la page "Gestion des plugins".
    MediaSPIP est fourni par défaut avec l’ensemble des plugins dits "compatibles", ils ont été testés et intégrés afin de fonctionner parfaitement avec chaque (...)

  • Formulaire personnalisable

    21 juin 2013, par

    Cette page présente les champs disponibles dans le formulaire de publication d’un média et il indique les différents champs qu’on peut ajouter. Formulaire de création d’un Media
    Dans le cas d’un document de type média, les champs proposés par défaut sont : Texte Activer/Désactiver le forum ( on peut désactiver l’invite au commentaire pour chaque article ) Licence Ajout/suppression d’auteurs Tags
    On peut modifier ce formulaire dans la partie :
    Administration > Configuration des masques de formulaire. (...)

Sur d’autres sites (11395)

  • Creating a usable H.264 video file

    4 mai 2019, par Ethan McTague

    I am trying to use libavcodec to generate an mp4 video file from individual frames. Each input frame is a qt QImage, and the output file is written to using the Qt QFile class.

    I’ve done this through a VideoTarget class which opens the given ’target’ file when initialized, records frames when addFrame(image) is called, and then saves/closes the file when its destructor is called.

    The class has the following fields :

    AVCodec* m_codec = nullptr;
    AVCodecContext *m_context = nullptr;
    AVPacket* m_packet = nullptr;
    AVFrame* m_frame = nullptr;

    QFile m_target;

    And looks like this :

    VideoTarget::VideoTarget(QString target, QObject *parent) : QObject(parent), m_target(target)
    {
       // Find video codec
       m_codec = avcodec_find_encoder_by_name("libx264rgb");
       if (!m_codec) throw std::runtime_error("Unable to find codec.");

       // Make codec context
       m_context = avcodec_alloc_context3(m_codec);
       if (!m_context) throw std::runtime_error("Unable to allocate codec context.");

       // Make codec packet
       m_packet = av_packet_alloc();
       if (!m_packet) throw std::runtime_error("Unable to allocate packet.");

       // Configure context
       m_context->bit_rate = 400000;
       m_context->width = 1280;
       m_context->height = 720;
       m_context->time_base = (AVRational){1, 60};
       m_context->framerate = (AVRational){60, 1};
       m_context->gop_size = 10;
       m_context->max_b_frames = 1;
       m_context->pix_fmt = AV_PIX_FMT_RGB24;

       if (m_codec->id == AV_CODEC_ID_H264)
           av_opt_set(m_context->priv_data, "preset", "slow", 0);

       // Open Codec
       int ret = avcodec_open2(m_context, m_codec, nullptr);
       if (ret < 0) {
           throw std::runtime_error("Unable to open codec.");
       }

       // Open file
       if (!m_target.open(QIODevice::WriteOnly))
           throw std::runtime_error("Unable to open target file.");

       // Allocate frame
       m_frame = av_frame_alloc();
       if (!m_frame) throw std::runtime_error("Unable to allocate frame.");

       m_frame->format = m_context->pix_fmt;
       m_frame->width = m_context->width;
       m_frame->height = m_context->height;
       m_frame->pts = 0;

       ret = av_frame_get_buffer(m_frame, 24);
       if (ret < 0) throw std::runtime_error("Unable to allocate frame buffer.");
    }

    void VideoTarget::addFrame(QImage &image)
    {
       // Ensure frame data is writable
       int ret = av_frame_make_writable(m_frame);
       if (ret < 0) throw std::runtime_error("Unable to make frame writable.");

       // Prepare image
       for (int y = 0; y < m_context->height; y++) {
           for (int x = 0; x < m_context->width; x++) {
               auto pixel = image.pixelColor(x, y);
               int pos = (y * 1024 + x) * 3;
               m_frame->data[0][pos] = pixel.red();
               m_frame->data[0][pos + 1] = pixel.green();
               m_frame->data[0][pos + 2] = pixel.blue();
           }
       }

       m_frame->pts++;

       // Send the frame
       ret = avcodec_send_frame(m_context, m_frame);
       if (ret < 0) throw std::runtime_error("Unable to send AV frame.");

       while (ret >= 0) {
           ret = avcodec_receive_packet(m_context, m_packet);
           if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
               return;
           else if (ret < 0) throw std::runtime_error("Error during encoding.");

           m_target.write((const char*)m_packet->data, m_packet->size);
           av_packet_unref(m_packet);
       }
    }

    VideoTarget::~VideoTarget()
    {
       int ret = avcodec_send_frame(m_context, nullptr);
       if (ret < 0) throw std::runtime_error("Unable to send AV null frame.");

       while (ret >= 0) {
           ret = avcodec_receive_packet(m_context, m_packet);
           if (ret == AVERROR(EAGAIN) || ret == AVERROR_EOF)
               return;
           else if (ret < 0) throw std::runtime_error("Error during encoding.");

           m_target.write((const char*)m_packet->data, m_packet->size);
           av_packet_unref(m_packet);
       }

       // Magic number at the end of the file
       uint8_t endcode[] = { 0, 0, 1, 0xb7 };
       m_target.write((const char*)endcode, sizeof(endcode));
       m_target.close();

       // Free codec stuff
       avcodec_free_context(&m_context);
       av_frame_free(&m_frame);
       av_packet_free(&m_packet);
    }

    When used, the class seems to work, and data is written to the file, except I am unable to play back the resulting file in any application.

    My main suspect is these lines :

       // Prepare image
       for (int y = 0; y < m_context->height; y++) {
           for (int x = 0; x < m_context->width; x++) {
               auto pixel = image.pixelColor(x, y);
               int pos = (y * 1024 + x) * 3;
               m_frame->data[0][pos] = pixel.red();
               m_frame->data[0][pos + 1] = pixel.green();
               m_frame->data[0][pos + 2] = pixel.blue();
           }
       }

    The libavcodec documentation was extremely vague regarding the layout of image data, so I effectively had to guess and be happy with the first thing that didn’t crash, so chances are I’m writing this incorrectly. There’s also the issue of size mismatch between my pixel color data calls (giving int values) and the 24-bits-per-pixel RGB format I have selected.

    How do I tweak this code to output actual, functioning video files ?

  • Command Line 'hls_segment_size' creates TS files with segment failures

    14 octobre 2019, par Phantom

    I am converting a simple mp4 video to hls but I need the segments to be in approximately a specific size

    I researched and found :

    -hls_segment_size 17000000

    17000000 bytes( 17MB)

    This creates TS files with approximate sizes, (does not have to be exact size)

    ffmpeg.exe -i "in.mp4" -vcodec copy -acodec aac -hls_list_size 0 -hls_segment_size 17000000 -f hls "out.m3u8"

    In the m3u8 file is created ’#EXT-X-BYTERANGE’, which is the way I want it

    #EXTM3U
    #EXT-X-VERSION:4
    #EXT-X-TARGETDURATION:10
    #EXT-X-MEDIA-SEQUENCE:0
    #EXTINF:8.400000,
    #EXT-X-BYTERANGE:1662108@0
    SampleVideo_1280x720_30mb0.ts
    #EXTINF:4.560000,
    #EXT-X-BYTERANGE:383896@0
    SampleVideo_1280x720_30mb1.ts
    #EXTINF:3.120000,
    #EXT-X-BYTERANGE:408712@383896
    SampleVideo_1280x720_30mb1.ts
    #EXTINF:5.640000,
    #EXT-X-BYTERANGE:1161840@0
    SampleVideo_1280x720_30mb2.ts
    #EXTINF:1.880000,
    #EXT-X-BYTERANGE:230864@0
    SampleVideo_1280x720_30mb3.ts
    #EXTINF:2.160000,
    #EXT-X-BYTERANGE:330880@230864
    SampleVideo_1280x720_30mb3.ts
    #EXTINF:2.080000,
    #EXT-X-BYTERANGE:489928@0
    SampleVideo_1280x720_30mb4.ts
    #EXTINF:4.400000,
    #EXT-X-BYTERANGE:1564348@489928
    SampleVideo_1280x720_30mb4.ts
    ...

    It seems alright, but it has a little problem. I’m testing on a player in the browser, and when the seconds goes from one segment to the other the video has a lock in sound and video. Something very annoying, not natural in the video.

    Not using ’-hls_segment_size’ will have functional TS files, and without BYTERANGE in the m3u8 file

    However, the size of the TS file will be according to the seconds defined

    I am currently trying to get a ts file that is close to a size set between 15MB and 20MB, and have BYTERANGE in the m3u8 file.

    Does anyone have any ideas ?

    here’s the problem I’m trying to describe :

    http://phantsc.rf.gd/AAA/Bbb.html

    exactly in the second 7 of the video a ’locking’ happens, this happens when going from one segment to another

  • Live555 truncates encoded data of FFMpeg

    22 novembre 2019, par Harshil Makwana

    I am trying to stream H264 based data using Live555 over RTSP.

    I am capturing data using V4L2, and then encodes it using FFMPEG and then passing data to Live555’s DeviceSource file, in that I using H264VideoStreamFramer class,

    Below is my codec settings to configure AVCodecContext of encoder,

    codec = avcodec_find_encoder_by_name(CODEC_NAME);
    if (!codec) {
       cerr << "Codec " << codec_name << " not found\n";
       exit(1);
    }

    c = avcodec_alloc_context3(codec);
    if (!c) {
       cerr << "Could not allocate video codec context\n";
       exit(1);
    }

    pkt = av_packet_alloc();
    if (!pkt)
       exit(1);

    /* put sample parameters */
    c->bit_rate = 400000;
    /* resolution must be a multiple of two */
    c->width = PIC_HEIGHT;
    c->height = PIC_WIDTH;
    /* frames per second */
    c->time_base = (AVRational){1, FPS};
    c->framerate = (AVRational){FPS, 1};
    c->gop_size = 10;
    c->max_b_frames = 1;
    c->pix_fmt = AV_PIX_FMT_YUV420P;
    c->rtp_payload_size = 30000;
    if (codec->id == AV_CODEC_ID_H264)
       av_opt_set(c->priv_data, "preset", "fast", 0);
    av_opt_set_int(c->priv_data, "slice-max-size", 30000, 0);
    /* open it */
    ret = avcodec_open2(c, codec, NULL);
    if (ret < 0) {
       cerr << "Could not open codec\n";
       exit(1);
    }

    And I am getting encoded data using avcodec_receive_packet() function. which will return AVPacket.

    And I am passing AVPacket’s data into DeviceSource file below is code snippet of my Live555 code :

    void DeviceSource::deliverFrame() {
       if (!isCurrentlyAwaitingData()) return; // we're not ready for the data yet

       u_int8_t* newFrameDataStart = (u_int8_t*) pkt->data;
       unsigned newFrameSize = pkt->size; //%%% TO BE WRITTEN %%%
       // Deliver the data here:
       if (newFrameSize > fMaxSize) { // Condition becomes true many times
           fFrameSize = fMaxSize;
           fNumTruncatedBytes = newFrameSize - fMaxSize;
       } else {
           fFrameSize = newFrameSize;
       }
       gettimeofday(&fPresentationTime, NULL); // If you have a more accurate time - e.g., from an encoder - then use that instead.
       // If the device is *not* a 'live source' (e.g., it comes instead from a file or buffer), then set "fDurationInMicroseconds" here.
       memmove(fTo, newFrameDataStart, fFrameSize);
    }

    But here, sometimes my packet’s size is getting more than fMaxSize value and as per LIVE555 logic it will truncate frame data, so that sometimes I am getting bad frames on my VLC,

    From Live555 forum, I get to know that encoder should not send packet whose size is more than fMaxSize value, so my question is :

    How to restrict encoder to limit size of packet ?

    Thanks in Advance,

    Harshil