Recherche avancée

Médias (91)

Autres articles (28)

  • Soumettre améliorations et plugins supplémentaires

    10 avril 2011

    Si vous avez développé une nouvelle extension permettant d’ajouter une ou plusieurs fonctionnalités utiles à MediaSPIP, faites le nous savoir et son intégration dans la distribution officielle sera envisagée.
    Vous pouvez utiliser la liste de discussion de développement afin de le faire savoir ou demander de l’aide quant à la réalisation de ce plugin. MediaSPIP étant basé sur SPIP, il est également possible d’utiliser le liste de discussion SPIP-zone de SPIP pour (...)

  • D’autres logiciels intéressants

    12 avril 2011, par

    On ne revendique pas d’être les seuls à faire ce que l’on fait ... et on ne revendique surtout pas d’être les meilleurs non plus ... Ce que l’on fait, on essaie juste de le faire bien, et de mieux en mieux...
    La liste suivante correspond à des logiciels qui tendent peu ou prou à faire comme MediaSPIP ou que MediaSPIP tente peu ou prou à faire pareil, peu importe ...
    On ne les connais pas, on ne les a pas essayé, mais vous pouvez peut être y jeter un coup d’oeil.
    Videopress
    Site Internet : (...)

  • Keeping control of your media in your hands

    13 avril 2011, par

    The vocabulary used on this site and around MediaSPIP in general, aims to avoid reference to Web 2.0 and the companies that profit from media-sharing.
    While using MediaSPIP, you are invited to avoid using words like "Brand", "Cloud" and "Market".
    MediaSPIP is designed to facilitate the sharing of creative media online, while allowing authors to retain complete control of their work.
    MediaSPIP aims to be accessible to as many people as possible and development is based on expanding the (...)

Sur d’autres sites (5443)

  • Introducing Matomo SEO Web Vitals

    13 septembre 2021, par Ben Erskine — About, Analytics Tips, Plugins

    SEO Web Vitals track your critical website performance metrics and are a core element of SEO best practice. 

    Start using Matomo SEO Web Vitals to monitor your website performance, optimise your visitor experience, improve your search result rankings, and see how your site compares to your competitors.

    SEO Web Vitals

    What are SEO Web Vitals ?

    Web Vitals are made up of a number of important metrics, such as your website’s page speed and loading performance, these metrics all play an important role in search engine optimisation. 

    The more technical terms for these metrics are Page Speed Score, First Contentful Paint (FCP), Final Input Delay (FID), Last Contentful Paint (LCP) and Cumulative Layout Shift (CLS).

    Why should you use SEO Web Vitals ?

    SEO Web Vitals are being used more and more by search engines such as Google to rank websites so they help ensure a great page experience for users who arrive via links from their search results. 

    By monitoring your SEO Web Vitals you can see how good or bad a single page performs and then prioritise the optimisation of strategically important pages to help improve the ranking position within search engine results.

    For ease of use you can receive regular reports in your email inbox and you can configure custom alerts to automatically notify you when a page score changes significantly. This saves time by not having to check page performance scores manually while ensuring you will be notified should there be any important change that needs to be actioned.

    You should use SEO Web Vitals to understand how your site performance is impacting your overall visitor experience.

    Four key benefits of using SEO Web Vitals :

    Improve your search result rankings

    • SEO Web Vitals are a core element of SEO best practice and directly impact your search rankings.
    • Pages that load quickly and are more stable deliver a better user experience, so they’re ranked higher by search engines.

    Optimise your website visitor experience

    • Know how quickly pages on your website load to ensure you deliver an optimal visitor experience.
    • Identify page stability issues and implement the changes needed to enhance your visitor experience.

    Automate your website performance monitoring

    • Have peace of mind knowing if your metrics decrease, you can find and fix the root cause quickly.
    • Configure performance alerts and get automated reports sent to you.

    Incorporate website performance into your competitor analysis

    • These performance metrics are essentially open for anyone to inspect, so you can measure and benchmark your site against competitors. 

    How can I improve my SEO Web Vitals ?

    There are so many ways to improve these performance metrics, here are five of the common contributing factors.

    1. Your page speed score is a weighted average of your other performance metrics, so focus on improving the underlying metrics that contribute to this score.
    2. Ensure you use a high quality web host with an appropriate plan for your level of traffic to help improve your FCP time.
    3. Try removing large elements that aren’t required on your page to improve your LCP time.
    4. Optimise against Total Blocking Time to Improve your FID score.
    5. Consider using a Layout Shift Debugger to improve Your CLS Score

    Guide to Matomo SEO Web Vitals

    For more information and to learn how to configure SEO Web Vitals in Matomo, check out our full guide to SEO Web Vitals.

    You will learn :

    Need more resources ?

    Matomo Plugin SEO Web Vitals

    Matomo SEO Web Vitals FAQs

  • ffmpeg : cannot save HLS stream to MKV

    15 juillet 2021, par MasterAler

    I am trying to achieve something straightforward : writing the code that captures a video stream and saves it into an *.mkv file "as-is" (yeah, no demuxing or reencoding or whatever). Just want to store those AVPacket-s and the MKV container looks ready for that.

    


    Note that the question is about ffmpeg library usage, the ffmpeg binary works fine and can be used to save the HLS steam data via the following :
    
ffmpeg -i https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8 -c:v copy out.ts
    
I know that but the goal is to save any (or almost any) stream, thus the MKV. Actually, there is some code that already can save the streams' data, it fails specifically when trying it with HLS.

    


    After some efforts to provide a short but readable MCVE, here's a sample code that reproduces the problem. The focus is on making the output codec work with HLS streams, thus it may lack a lot of things and details, like extra error checks, corner-cases, optimizations, proper timestamp handling, etc.

    


    #include <atomic>&#xA;#include &#xA;#include <deque>&#xA;#include <functional>&#xA;#include <iostream>&#xA;#include <memory>&#xA;#include <mutex>&#xA;#include <thread>&#xA;&#xA;extern "C" {&#xA;#include "libavcodec/avcodec.h"&#xA;#include "libavfilter/avfilter.h"&#xA;#include "libavfilter/buffersink.h"&#xA;#include "libavfilter/buffersrc.h"&#xA;#include <libavcodec></libavcodec>avcodec.h>&#xA;#include <libavdevice></libavdevice>avdevice.h>&#xA;#include <libavformat></libavformat>avformat.h>&#xA;#include <libswscale></libswscale>swscale.h>&#xA;}&#xA;&#xA;// Some public stream. The code works with RTSP, RTMP, MJPEG, etc.&#xA;// static const char SOURCE_NAME[] = "http://81.83.10.9:8001/mjpg/video.mjpg"; // works!&#xA;&#xA;// My goal was an actual cam streaming via HLS, but here are some random HLS streams&#xA;// that reproduce the problem quite well. Playlists may differ, but the error is exactly the same&#xA;static const char SOURCE_NAME[] = "http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8"; // fails!&#xA;// static const char SOURCE_NAME[] = "https://bitdash-a.akamaihd.net/content/MI201109210084_1/m3u8s/f08e80da-bf1d-4e3d-8899-f0f6155f6efa.m3u8"; // fails!&#xA;&#xA;using Pkt = std::unique_ptr;&#xA;std::deque<pkt> frame_buffer;&#xA;std::mutex frame_mtx;&#xA;std::condition_variable frame_cv;&#xA;std::atomic_bool keep_running{true};&#xA;&#xA;AVCodecParameters *common_codecpar = nullptr;&#xA;std::mutex codecpar_mtx;&#xA;std::condition_variable codecpar_cv;&#xA;&#xA;void read_frames_from_source(unsigned N)&#xA;{&#xA;    AVFormatContext *fmt_ctx = avformat_alloc_context();&#xA;&#xA;    int err = avformat_open_input(&amp;fmt_ctx, SOURCE_NAME, nullptr, nullptr);&#xA;    if (err &lt; 0) {&#xA;        std::cerr &lt;&lt; "cannot open input" &lt;&lt; std::endl;&#xA;        avformat_free_context(fmt_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    err = avformat_find_stream_info(fmt_ctx, nullptr);&#xA;    if (err &lt; 0) {&#xA;        std::cerr &lt;&lt; "cannot find stream info" &lt;&lt; std::endl;&#xA;        avformat_free_context(fmt_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    // Simply finding the first video stream, preferrably H.264. Others are ignored below&#xA;    int video_stream_id = -1;&#xA;    for (unsigned i = 0; i &lt; fmt_ctx->nb_streams; i&#x2B;&#x2B;) {&#xA;        auto *c = fmt_ctx->streams[i]->codecpar;&#xA;        if (c->codec_type == AVMEDIA_TYPE_VIDEO) {&#xA;            video_stream_id = i;&#xA;            if (c->codec_id == AV_CODEC_ID_H264)&#xA;                break;&#xA;        }&#xA;    }&#xA;&#xA;    if (video_stream_id &lt; 0) {&#xA;        std::cerr &lt;&lt; "failed to find find video stream" &lt;&lt; std::endl;&#xA;        avformat_free_context(fmt_ctx);&#xA;        return;&#xA;    }&#xA;&#xA;    {   // Here we have the codec params and can launch the writer&#xA;        std::lock_guard locker(codecpar_mtx);&#xA;        common_codecpar = fmt_ctx->streams[video_stream_id]->codecpar;&#xA;    }&#xA;    codecpar_cv.notify_all();&#xA;&#xA;    unsigned cnt = 0;&#xA;    while (&#x2B;&#x2B;cnt &lt;= N) { // we read some limited number of frames&#xA;        Pkt pkt{av_packet_alloc(), [](AVPacket *p) { av_packet_free(&amp;p); }};&#xA;&#xA;        err = av_read_frame(fmt_ctx, pkt.get());&#xA;        if (err &lt; 0) {&#xA;            std::cerr &lt;&lt; "read packet error" &lt;&lt; std::endl;&#xA;            continue;&#xA;        }&#xA;&#xA;        // That&#x27;s why the cycle above, we write only one video stream here&#xA;        if (pkt->stream_index != video_stream_id)&#xA;            continue;&#xA;&#xA;        {&#xA;            std::lock_guard locker(frame_mtx);&#xA;            frame_buffer.push_back(std::move(pkt));&#xA;        }&#xA;        frame_cv.notify_one();&#xA;    }&#xA;&#xA;    keep_running.store(false);&#xA;    avformat_free_context(fmt_ctx);&#xA;}&#xA;&#xA;void write_frames_into_file(std::string filepath)&#xA;{&#xA;    AVFormatContext *out_ctx = nullptr;&#xA;    int err = avformat_alloc_output_context2(&amp;out_ctx, nullptr, "matroska", filepath.c_str());&#xA;    if (err &lt; 0) {&#xA;        std::cerr &lt;&lt; "avformat_alloc_output_context2 failed" &lt;&lt; std::endl;&#xA;        return;&#xA;    }&#xA;&#xA;    AVStream *video_stream = avformat_new_stream(out_ctx, avcodec_find_encoder(common_codecpar->codec_id)); // the proper way&#xA;    // AVStream *video_stream = avformat_new_stream(out_ctx, avcodec_find_encoder(AV_CODEC_ID_H264)); // forcing the H.264&#xA;    // ------>> HERE IS THE TROUBLE, NO CODEC WORKS WITH HLS &lt;&lt;------&#xA;&#xA;    int video_stream_id = video_stream->index;&#xA;&#xA;    err = avcodec_parameters_copy(video_stream->codecpar, common_codecpar);&#xA;    if (err &lt; 0) {&#xA;        std::cerr &lt;&lt; "avcodec_parameters_copy failed" &lt;&lt; std::endl;&#xA;    }&#xA;&#xA;    if (!(out_ctx->flags &amp; AVFMT_NOFILE)) {&#xA;        err =  avio_open(&amp;out_ctx->pb, filepath.c_str(), AVIO_FLAG_WRITE);&#xA;        if (err &lt; 0) {&#xA;            std::cerr &lt;&lt; "avio_open fail" &lt;&lt; std::endl;&#xA;            return;&#xA;        }&#xA;    }&#xA;&#xA;    err = avformat_write_header(out_ctx, nullptr); // &lt;&lt;--- ERROR WITH HLS HERE&#xA;    if (err &lt; 0) {&#xA;        std::cerr &lt;&lt; "avformat_write_header failed" &lt;&lt; std::endl;&#xA;        return; // here we go with hls&#xA;    }&#xA;&#xA;    unsigned cnt = 0;&#xA;    while (true) {&#xA;        std::unique_lock locker(frame_mtx);&#xA;        frame_cv.wait(locker, [&amp;] { return !frame_buffer.empty() || !keep_running; });&#xA;&#xA;        if (!keep_running)&#xA;            break;&#xA;&#xA;        Pkt pkt = std::move(frame_buffer.front());&#xA;        frame_buffer.pop_front();&#xA;        &#x2B;&#x2B;cnt;&#xA;        locker.unlock();&#xA;&#xA;        pkt->stream_index = video_stream_id; // mandatory&#xA;        err = av_write_frame(out_ctx, pkt.get());&#xA;        if (err &lt; 0) {&#xA;            std::cerr &lt;&lt; "av_write_frame failed " &lt;&lt; cnt &lt;&lt; std::endl;&#xA;        } else if (cnt % 25 == 0) {&#xA;            std::cout &lt;&lt; cnt &lt;&lt; " OK" &lt;&lt; std::endl;&#xA;        }&#xA;    }&#xA;&#xA;    av_write_trailer(out_ctx);&#xA;    avformat_free_context(out_ctx);&#xA;}&#xA;&#xA;int main()&#xA;{&#xA;    std::thread reader(std::bind(&amp;read_frames_from_source, 1000));&#xA;    std::thread writer;&#xA;&#xA;    // Writer wont start until reader&#x27;s got AVCodecParameters&#xA;    // In this example it spares us from setting writer&#x27;s params properly manually&#xA;&#xA;    {   // Waiting for codec params to be set&#xA;        std::unique_lock locker(codecpar_mtx);&#xA;        codecpar_cv.wait(locker, [&amp;] { return common_codecpar != nullptr; });&#xA;        writer = std::thread(std::bind(&amp;write_frames_into_file, "out.mkv"));&#xA;    }&#xA;&#xA;    reader.join();&#xA;    keep_running.store(false);&#xA;    writer.join();&#xA;&#xA;    return 0;&#xA;}&#xA;&#xA;</pkt></thread></mutex></memory></iostream></functional></deque></atomic>

    &#xA;

    What happens here ? Simply put :

    &#xA;

      &#xA;
    1. Two threads are spawned, one reads packets from source and stores them in a buffer
    2. &#xA;

    3. The writer waits for the reader to get the AVCodecParameters, so that you can see they are the same being used, almost no manual param setting here
    4. &#xA;

    5. The reader is supposed to read N packets and finish, then the writer follows him. That's how it works with RTSP, RTMP, MJPEG, etc.
    6. &#xA;

    &#xA;

    What's the problem ? Once an HLS stream is tried, there goes the following error :

    &#xA;

    &#xA;

    Tag [27][0][0][0] incompatible with output codec id '27' (H264)

    &#xA;

    &#xA;

    After that the writer segfaults on any write attempt via it's context (that is avformat_write_header here) avformat_write_header fails with an error (see UPD2 below) and thus no successfull write operation is possible.

    &#xA;

    What's been tried :

    &#xA;

      &#xA;
    1. Forcing arbitrary codecs (ex. : AV_CODEC_ID_H264). No luck there.
    2. &#xA;

    3. Trying the AV_CODEC_ID_MPEGTS. No way, it's documented as a "fake" codec for internal needs.
    4. &#xA;

    5. Switching some of the multiple options for input or output contexts, no luck there
    6. &#xA;

    &#xA;

    I'm currenly confused a lot 'coz the error sounds like "Tag H264 is not compatible with codec H264". The ffmpeg logs look like the library managed to comprehend it's dealing with MPEG-TS being sent via HLS, reading is fine but writing into the chosen media container fails :

    &#xA;

    [hls @ 0x7f94b0000900] Opening &#x27;https://bitdash-a.akamaihd.net/content/MI201109210084_1/video/540_1200000/hls/segment_0.ts&#x27; for reading&#xA;[hls @ 0x7f94b0000900] Opening &#x27;https://bitdash-a.akamaihd.net/content/MI201109210084_1/video/540_1200000/hls/segment_1.ts&#x27; for reading&#xA;[hls @ 0x7f94b0000900] Opening &#x27;https://bitdash-a.akamaihd.net/content/MI201109210084_1/video/720_2400000/hls/segment_0.ts&#x27; for reading&#xA;[hls @ 0x7f94b0000900] Opening &#x27;https://bitdash-a.akamaihd.net/content/MI201109210084_1/video/720_2400000/hls/segment_1.ts&#x27; for reading&#xA;[hls @ 0x7f94b0000900] Opening &#x27;https://bitdash-a.akamaihd.net/content/MI201109210084_1/video/1080_4800000/hls/segment_0.ts&#x27; for reading&#xA;[hls @ 0x7f94b0000900] Opening &#x27;https://bitdash-a.akamaihd.net/content/MI201109210084_1/video/1080_4800000/hls/segment_1.ts&#x27; for reading&#xA;[hls @ 0x7f94b0000900] Could not find codec parameters for stream 0 (Audio: aac ([15][0][0][0] / 0x000F), 0 channels, 112 kb/s): unspecified sample rate&#xA;Consider increasing the value for the &#x27;analyzeduration&#x27; and &#x27;probesize&#x27; options&#xA;[matroska @ 0x7f94a8000900] Tag [27][0][0][0] incompatible with output codec id &#x27;27&#x27; (H264)&#xA;avformat_write_header failed&#xA;Segmentation fault (core dumped)&#xA;

    &#xA;

    No hard googling helped, I'm a bit desperate.
    &#xA;Plz, share your ideas, would be grateful for any.

    &#xA;

    UPD

    &#xA;

      &#xA;
    • ffmpeg -i https://bitdash-a.akamaihd.net/content/sintel/hls/playlist.m3u8 out.mkv works fine
    • &#xA;

    • ffmpeg -i http://qthttp.apple.com.edgesuite.net/1010qwoeiuryfg/sl.m3u8 -c:v copy out.mkv also works fine
    • &#xA;

    &#xA;

    ... which means ffmpeg can do the trick and the desired result can be achieved

    &#xA;

    UPD2

    &#xA;

    It occured that the tag error can be suppressed via
    &#xA;out_ctx->strict_std_compliance = FF_COMPLIANCE_UNOFFICIAL;
    &#xA;I assume it's smth about spelling the "h264" properly in a string tag, doesn't look serious.

    &#xA;

    Also, after a closer look it occured that it's av_write_frame that actually segfaults. No wonder — with HLS streams avformat_write_header fails and returns error :

    &#xA;

    &#xA;

    Invalid data found when processing input

    &#xA;

    &#xA;

    That still leaves me with no clues, where's the problem here =((

    &#xA;

  • Evolution #4749 : [UX] Comportement des labels : quoi par défaut, quoi ponctuel ?

    8 mai 2021, par RastaPopoulos ♥

    Un autre lien trouvé par marcimat :
    https://medium.com/intech-conseil-expertise/5-pr%C3%A9conisations-afin-doptimiser-la-saisie-de-vos-formulaires-partie-2-362012d39c8a

    (à noter que dans ces exemples il utilise pas mal la technique : label dans le champ tant que pas focus + puis label toujours visible au dessus quand on a focus)