Recherche avancée

Médias (91)

Autres articles (94)

  • Amélioration de la version de base

    13 septembre 2013

    Jolie sélection multiple
    Le plugin Chosen permet d’améliorer l’ergonomie des champs de sélection multiple. Voir les deux images suivantes pour comparer.
    Il suffit pour cela d’activer le plugin Chosen (Configuration générale du site > Gestion des plugins), puis de configurer le plugin (Les squelettes > Chosen) en activant l’utilisation de Chosen dans le site public et en spécifiant les éléments de formulaires à améliorer, par exemple select[multiple] pour les listes à sélection multiple (...)

  • Menus personnalisés

    14 novembre 2010, par

    MediaSPIP utilise le plugin Menus pour gérer plusieurs menus configurables pour la navigation.
    Cela permet de laisser aux administrateurs de canaux la possibilité de configurer finement ces menus.
    Menus créés à l’initialisation du site
    Par défaut trois menus sont créés automatiquement à l’initialisation du site : Le menu principal ; Identifiant : barrenav ; Ce menu s’insère en général en haut de la page après le bloc d’entête, son identifiant le rend compatible avec les squelettes basés sur Zpip ; (...)

  • Publier sur MédiaSpip

    13 juin 2013

    Puis-je poster des contenus à partir d’une tablette Ipad ?
    Oui, si votre Médiaspip installé est à la version 0.2 ou supérieure. Contacter au besoin l’administrateur de votre MédiaSpip pour le savoir

Sur d’autres sites (8812)

  • There was error in the HLS Video stram endpoin in springBoot

    12 août 2024, par Abir Sarkar

    This is my controller When I call for the first time with the actual endpoint with the proper ID, it gives the output but when I send it, it gets error-prone. It will automatically change the video ID with the segment_000.ts

    


    @GetMapping("/stream/{videoId}")&#xA;public ResponseEntity<resource> streamVideo(&#xA;        @PathVariable String videoId,&#xA;        @RequestHeader(value = HttpHeaders.RANGE, required = false) String rangeHeader) {&#xA;&#xA;    try {&#xA;        System.out.println("Video Id : "&#x2B;videoId);&#xA;        // Fetch the video metadata&#xA;        Video video = videoService.findById(videoId);&#xA;&#xA;        if (video == null) {&#xA;            return ResponseEntity.notFound().build();&#xA;        }&#xA;&#xA;        // Construct the path to the HLS playlist&#xA;        Path playlistPath = Paths.get(video.getFilePath());&#xA;&#xA;        // Check if the playlist file exists&#xA;        if (!Files.exists(playlistPath)) {&#xA;            return ResponseEntity.notFound().build();&#xA;        }&#xA;&#xA;        // Load the file as a resource&#xA;        Resource resource = new FileSystemResource(playlistPath);&#xA;        String contentType = "application/vnd.apple.mpegurl";&#xA;        long fileLength = Files.size(playlistPath);&#xA;&#xA;        if (rangeHeader != null) {&#xA;            try {&#xA;                // Handle range requests for seeking&#xA;                String[] ranges = rangeHeader.replace("bytes=", "").split("-");&#xA;                long rangeStart = Long.parseLong(ranges[0]);&#xA;                long rangeEnd = ranges.length > 1 ? Long.parseLong(ranges[1]) : fileLength - 1;&#xA;&#xA;                // Validate range end&#xA;                if (rangeEnd >= fileLength) {&#xA;                    rangeEnd = fileLength - 1;&#xA;                }&#xA;&#xA;                // Validate range start&#xA;                if (rangeStart > rangeEnd) {&#xA;                    return ResponseEntity.status(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE)&#xA;                            .header(HttpHeaders.CONTENT_RANGE, "bytes */" &#x2B; fileLength)&#xA;                            .build();&#xA;                }&#xA;&#xA;                // Calculate content length&#xA;                long contentLength = rangeEnd - rangeStart &#x2B; 1;&#xA;&#xA;                // Prepare headers&#xA;                HttpHeaders headers = new HttpHeaders();&#xA;                headers.add(HttpHeaders.CONTENT_RANGE, "bytes " &#x2B; rangeStart &#x2B; "-" &#x2B; rangeEnd &#x2B; "/" &#x2B; fileLength);&#xA;                headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(contentLength));&#xA;                headers.add(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate");&#xA;                headers.add(HttpHeaders.PRAGMA, "no-cache");&#xA;                headers.add(HttpHeaders.EXPIRES, "0");&#xA;                headers.add(HttpHeaders.CONTENT_TYPE, contentType);&#xA;&#xA;                // Serve the partial content&#xA;                InputStream inputStream = Files.newInputStream(playlistPath);&#xA;                inputStream.skip(rangeStart);&#xA;&#xA;                return ResponseEntity.status(HttpStatus.PARTIAL_CONTENT)&#xA;                        .headers(headers)&#xA;                        .body(new InputStreamResource(inputStream));&#xA;            } catch (NumberFormatException e) {&#xA;                return ResponseEntity.status(HttpStatus.REQUESTED_RANGE_NOT_SATISFIABLE)&#xA;                        .header(HttpHeaders.CONTENT_RANGE, "bytes */" &#x2B; fileLength)&#xA;                        .build();&#xA;            }&#xA;        } else {&#xA;            // Serve the full content&#xA;            HttpHeaders headers = new HttpHeaders();&#xA;            headers.add(HttpHeaders.CONTENT_TYPE, contentType);&#xA;            headers.add(HttpHeaders.CONTENT_LENGTH, String.valueOf(fileLength));&#xA;            headers.add(HttpHeaders.CACHE_CONTROL, "no-cache, no-store, must-revalidate");&#xA;            headers.add(HttpHeaders.PRAGMA, "no-cache");&#xA;            headers.add(HttpHeaders.EXPIRES, "0");&#xA;            System.out.println(resource.toString());&#xA;            return ResponseEntity.ok()&#xA;                    .headers(headers)&#xA;                    .body(resource);&#xA;        }&#xA;&#xA;    } catch (IOException e) {&#xA;        // Handle IOException&#xA;        e.printStackTrace();&#xA;        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();&#xA;    } catch (Exception e) {&#xA;        // Handle other exceptions&#xA;        e.printStackTrace();&#xA;        return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();&#xA;    }&#xA;}&#xA;</resource>

    &#xA;

    I am attaching the error image : IMAGE

    &#xA;

    In the front end i am using the angular application :

    &#xA;

    This is the app.jsx file

    &#xA;

    import "./App.css";&#xA;import VideoPlayer from "./VideoPlayer";&#xA;import { useRef } from "react";&#xA;&#xA;function App() {&#xA;  const playerRef = useRef(null);&#xA;  const videoLink =&#xA;    "http://localhost:8080/api/v1/video/stream/66b9e7853c9b530810bdf4f4";&#xA;  const videoPlayerOptions = {&#xA;    controls: true,&#xA;    responsive: true,&#xA;    fluid: true,&#xA;    sources: [&#xA;      {&#xA;        src: videoLink,&#xA;        type: "application/x-mpegURL",&#xA;      },&#xA;    ],&#xA;  };&#xA;  const handlePlayerReady = (player) => {&#xA;    playerRef.current = player;&#xA;&#xA;    // You can handle player events here, for example:&#xA;    player.on("waiting", () => {&#xA;      videojs.log("player is waiting");&#xA;    });&#xA;&#xA;    player.on("dispose", () => {&#xA;      videojs.log("player will dispose");&#xA;    });&#xA;  };&#xA;  return (&#xA;    &lt;>&#xA;      <div>&#xA;        <h1>Video player</h1>&#xA;      </div>&#xA;&#xA;      &#xA;    >&#xA;  );&#xA;}&#xA;&#xA;export default App;&#xA;

    &#xA;

    This is the VideoPlayer.jsx file :

    &#xA;

    import React, { useRef, useEffect } from "react";&#xA;import videojs from "video.js";&#xA;import "video.js/dist/video-js.css";&#xA;&#xA;export const VideoPlayer = (props) => {&#xA;  const videoRef = useRef(null);&#xA;  const playerRef = useRef(null);&#xA;  const { options, onReady } = props;&#xA;&#xA;  useEffect(() => {&#xA;    // Make sure Video.js player is only initialized once&#xA;    if (!playerRef.current) {&#xA;      // The Video.js player needs to be _inside_ the component el for React 18 Strict Mode.&#xA;      const videoElement = document.createElement("video-js");&#xA;&#xA;      videoElement.classList.add("vjs-big-play-centered");&#xA;      videoRef.current.appendChild(videoElement);&#xA;&#xA;      const player = (playerRef.current = videojs(videoElement, options, () => {&#xA;        videojs.log("player is ready");&#xA;        onReady &amp;&amp; onReady(player);&#xA;      }));&#xA;&#xA;      // You could update an existing player in the `else` block here&#xA;      // on prop change, for example:&#xA;    } else {&#xA;      const player = playerRef.current;&#xA;&#xA;      player.autoplay(options.autoplay);&#xA;      player.src(options.sources);&#xA;    }&#xA;  }, [options, videoRef]);&#xA;&#xA;  // Dispose the Video.js player when the functional component unmounts&#xA;  useEffect(() => {&#xA;    const player = playerRef.current;&#xA;&#xA;    return () => {&#xA;      if (player &amp;&amp; !player.isDisposed()) {&#xA;        player.dispose();&#xA;        playerRef.current = null;&#xA;      }&#xA;    };&#xA;  }, [playerRef]);&#xA;&#xA;  return (&#xA;    &#xA;      <div ref="{videoRef}"></div>&#xA;    &#xA;  );&#xA;};&#xA;&#xA;export default VideoPlayer;&#xA;

    &#xA;

    I am trying to play the video in the player. But the video is not playing in the browser. and when I hit the endpoint with Postman, it gives me the content of the index.m3u8 file. In the player, the video length is coming, but the video is not playing. Please help me to play the video.

    &#xA;

    *

    &#xA;

    Github Project Link : GITHUB*

    &#xA;

  • Need help using libavfilter for adding overlay to frames [closed]

    30 juillet 2024, par Michael Werner

    Hello gentlemen and ladies,

    &#xA;

    I am working with libavfilter and I am getting crazy.

    &#xA;

    On Windows 11 OS with latest libav (full build) a C/C++ app reads YUV420P frames from a frame grabber card.

    &#xA;

    I want to draw a bitmap (BGR24) overlay image from file on every frame via libavfilter. First I convert the BGR24 overlay image via format filter to YUV420P. Then I feed the YUV420P frame from frame grabber and the YUV420P overlay into the overlay filter.

    &#xA;

    Everything seems to be fine but when I try to get the frame out of the filter graph I always get an "Resource is temporary not available" (EAGAIN) return code, independent on how many frames I put into the graph.

    &#xA;

    The frames from the frame grabber card are fine, I could encode them or write them to a .yuv file. The overlay frame looks fine too.

    &#xA;

    My current initialization code looks like below. It does not report any errors or warnings but when I try to get the filtered frame out of the graph via av_buffersink_get_frame I always get an EAGAIN return code.

    &#xA;

    Here is my current initialization code :

    &#xA;

    int init_overlay_filter(AVFilterGraph** graph, AVFilterContext** src_ctx, AVFilterContext** overlay_src_ctx,&#xA;                        AVFilterContext** sink_ctx)&#xA;{&#xA;    AVFilterGraph* filter_graph;&#xA;    AVFilterContext* buffersrc_ctx;&#xA;    AVFilterContext* overlay_buffersrc_ctx;&#xA;    AVFilterContext* buffersink_ctx;&#xA;    AVFilterContext* overlay_ctx;&#xA;    AVFilterContext* format_ctx;&#xA;    const AVFilter *buffersrc, *buffersink, *overlay_buffersrc, *overlay_filter, *format_filter;&#xA;    int ret;&#xA;&#xA;    // Create the filter graph&#xA;    filter_graph = avfilter_graph_alloc();&#xA;    if (!filter_graph)&#xA;    {&#xA;        fprintf(stderr, "Unable to create filter graph.\n");&#xA;        return AVERROR(ENOMEM);&#xA;    }&#xA;&#xA;    // Create buffer source filter for main video&#xA;    buffersrc = avfilter_get_by_name("buffer");&#xA;    if (!buffersrc)&#xA;    {&#xA;        fprintf(stderr, "Unable to find buffer filter.\n");&#xA;        return AVERROR_FILTER_NOT_FOUND;&#xA;    }&#xA;&#xA;    // Create buffer source filter for overlay image&#xA;    overlay_buffersrc = avfilter_get_by_name("buffer");&#xA;    if (!overlay_buffersrc)&#xA;    {&#xA;        fprintf(stderr, "Unable to find buffer filter.\n");&#xA;        return AVERROR_FILTER_NOT_FOUND;&#xA;    }&#xA;&#xA;    // Create buffer sink filter&#xA;    buffersink = avfilter_get_by_name("buffersink");&#xA;    if (!buffersink)&#xA;    {&#xA;        fprintf(stderr, "Unable to find buffersink filter.\n");&#xA;        return AVERROR_FILTER_NOT_FOUND;&#xA;    }&#xA;&#xA;    // Create overlay filter&#xA;    overlay_filter = avfilter_get_by_name("overlay");&#xA;    if (!overlay_filter)&#xA;    {&#xA;        fprintf(stderr, "Unable to find overlay filter.\n");&#xA;        return AVERROR_FILTER_NOT_FOUND;&#xA;    }&#xA;&#xA;    // Create format filter&#xA;    format_filter = avfilter_get_by_name("format");&#xA;    if (!format_filter) &#xA;    {&#xA;        fprintf(stderr, "Unable to find format filter.\n");&#xA;        return AVERROR_FILTER_NOT_FOUND;&#xA;    }&#xA;&#xA;    // Initialize the main video buffer source&#xA;    char args[512];&#xA;    snprintf(args, sizeof(args),&#xA;             "video_size=1920x1080:pix_fmt=yuv420p:time_base=1/25:pixel_aspect=1/1");&#xA;    ret = avfilter_graph_create_filter(&amp;buffersrc_ctx, buffersrc, "in", args, NULL, filter_graph);&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        fprintf(stderr, "Unable to create buffer source filter for main video.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Initialize the overlay buffer source&#xA;    snprintf(args, sizeof(args),&#xA;             "video_size=165x165:pix_fmt=bgr24:time_base=1/25:pixel_aspect=1/1");&#xA;    ret = avfilter_graph_create_filter(&amp;overlay_buffersrc_ctx, overlay_buffersrc, "overlay_in", args, NULL,&#xA;                                       filter_graph);&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        fprintf(stderr, "Unable to create buffer source filter for overlay.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Initialize the format filter to convert overlay image to yuv420p&#xA;    snprintf(args, sizeof(args), "pix_fmts=yuv420p");&#xA;    ret = avfilter_graph_create_filter(&amp;format_ctx, format_filter, "format", args, NULL, filter_graph);&#xA;&#xA;    if (ret &lt; 0) &#xA;    {&#xA;        fprintf(stderr, "Unable to create format filter.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Initialize the buffer sink&#xA;    ret = avfilter_graph_create_filter(&amp;buffersink_ctx, buffersink, "out", NULL, NULL, filter_graph);&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        fprintf(stderr, "Unable to create buffer sink filter.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Initialize the overlay filter&#xA;    ret = avfilter_graph_create_filter(&amp;overlay_ctx, overlay_filter, "overlay", "W-w:H-h:enable=&#x27;between(t,0,20)&#x27;:format=yuv420", NULL, filter_graph);&#xA;    if (ret &lt; 0)&#xA;    {&#xA;        fprintf(stderr, "Unable to create overlay filter.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Connect the filters&#xA;    ret = avfilter_link(overlay_buffersrc_ctx, 0, format_ctx, 0);&#xA;&#xA;    if (ret >= 0)&#xA;    {&#xA;        ret = avfilter_link(buffersrc_ctx, 0, overlay_ctx, 0);&#xA;    }&#xA;    else&#xA;    {&#xA;        fprintf(stderr, "Unable to configure filter graph.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;&#xA;    if (ret >= 0) &#xA;    {&#xA;        ret = avfilter_link(format_ctx, 0, overlay_ctx, 1);&#xA;    }&#xA;    else&#xA;    {&#xA;        fprintf(stderr, "Unable to configure filter graph.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    if (ret >= 0) &#xA;    {&#xA;        if ((ret = avfilter_link(overlay_ctx, 0, buffersink_ctx, 0)) &lt; 0)&#xA;        {&#xA;            fprintf(stderr, "Unable to link filter graph.\n");&#xA;            return ret;&#xA;        }&#xA;    }&#xA;    else&#xA;    {&#xA;        fprintf(stderr, "Unable to configure filter graph.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    // Configure the filter graph&#xA;    if ((ret = avfilter_graph_config(filter_graph, NULL)) &lt; 0)&#xA;    {&#xA;        fprintf(stderr, "Unable to configure filter graph.\n");&#xA;        return ret;&#xA;    }&#xA;&#xA;    *graph = filter_graph;&#xA;    *src_ctx = buffersrc_ctx;&#xA;    *overlay_src_ctx = overlay_buffersrc_ctx;&#xA;    *sink_ctx = buffersink_ctx;&#xA;&#xA;    return 0;&#xA;}&#xA;

    &#xA;

    Feeding the filter graph is done this way :

    &#xA;

    av_buffersrc_add_frame_flags(buffersrc_ctx, pFrameGrabberFrame, AV_BUFFERSRC_FLAG_KEEP_REF)&#xA;av_buffersink_get_frame(buffersink_ctx, filtered_frame)&#xA;

    &#xA;

    av_buffersink_get_frame returns always EAGAIN, no matter how many frames I feed into the graph. The frames (from framegrabber and the overlay frame) itself are looking fine.

    &#xA;

    I did set libav logging level to maximum but I do not see any warnings or errors or helpful, related information in the log.

    &#xA;

    Here the log output related to the filter configuration :

    &#xA;

    [in @ 00000288ee494f40] Setting &#x27;video_size&#x27; to value &#x27;1920x1080&#x27;&#xA;[in @ 00000288ee494f40] Setting &#x27;pix_fmt&#x27; to value &#x27;yuv420p&#x27;&#xA;[in @ 00000288ee494f40] Setting &#x27;time_base&#x27; to value &#x27;1/25&#x27;&#xA;[in @ 00000288ee494f40] Setting &#x27;pixel_aspect&#x27; to value &#x27;1/1&#x27;&#xA;[in @ 00000288ee494f40] w:1920 h:1080 pixfmt:yuv420p tb:1/25 fr:0/1 sar:1/1 csp:unknown range:unknown&#xA;[overlay_in @ 00000288ff1013c0] Setting &#x27;video_size&#x27; to value &#x27;165x165&#x27;&#xA;[overlay_in @ 00000288ff1013c0] Setting &#x27;pix_fmt&#x27; to value &#x27;bgr24&#x27;&#xA;[overlay_in @ 00000288ff1013c0] Setting &#x27;time_base&#x27; to value &#x27;1/25&#x27;&#xA;[overlay_in @ 00000288ff1013c0] Setting &#x27;pixel_aspect&#x27; to value &#x27;1/1&#x27;&#xA;[overlay_in @ 00000288ff1013c0] w:165 h:165 pixfmt:bgr24 tb:1/25 fr:0/1 sar:1/1 csp:unknown range:unknown&#xA;[format @ 00000288ff1015c0] Setting &#x27;pix_fmts&#x27; to value &#x27;yuv420p&#x27;&#xA;[overlay @ 00000288ff101880] Setting &#x27;x&#x27; to value &#x27;W-w&#x27;&#xA;[overlay @ 00000288ff101880] Setting &#x27;y&#x27; to value &#x27;H-h&#x27;&#xA;[overlay @ 00000288ff101880] Setting &#x27;enable&#x27; to value &#x27;between(t,0,20)&#x27;&#xA;[overlay @ 00000288ff101880] Setting &#x27;format&#x27; to value &#x27;yuv420&#x27;&#xA;[auto_scale_0 @ 00000288ff101ec0] w:iw h:ih flags:&#x27;&#x27; interl:0&#xA;[format @ 00000288ff1015c0] auto-inserting filter &#x27;auto_scale_0&#x27; between the filter &#x27;overlay_in&#x27; and the filter &#x27;format&#x27;&#xA;[auto_scale_1 @ 00000288ee4a4cc0] w:iw h:ih flags:&#x27;&#x27; interl:0&#xA;[overlay @ 00000288ff101880] auto-inserting filter &#x27;auto_scale_1&#x27; between the filter &#x27;format&#x27; and the filter &#x27;overlay&#x27;&#xA;[AVFilterGraph @ 00000288ee495c80] query_formats: 5 queried, 6 merged, 6 already done, 0 delayed&#xA;[auto_scale_0 @ 00000288ff101ec0] w:165 h:165 fmt:bgr24 csp:gbr range:pc sar:1/1 -> w:165 h:165 fmt:yuv420p csp:unknown range:unknown sar:1/1 flags:0x00000004&#xA;[auto_scale_1 @ 00000288ee4a4cc0] w:165 h:165 fmt:yuv420p csp:unknown range:unknown sar:1/1 -> w:165 h:165 fmt:yuva420p csp:unknown range:unknown sar:1/1 flags:0x00000004&#xA;[overlay @ 00000288ff101880] main w:1920 h:1080 fmt:yuv420p overlay w:165 h:165 fmt:yuva420p&#xA;[overlay @ 00000288ff101880] [framesync @ 00000288ff1019a8] Selected 1/25 time base&#xA;[overlay @ 00000288ff101880] [framesync @ 00000288ff1019a8] Sync level 2&#xA;

    &#xA;

  • avdevice/dshow : Cleanup also on av_log case

    26 mai 2024, par Michael Niedermayer
    avdevice/dshow : Cleanup also on av_log case
    

    Fixes : CID1598550 Resource leak

    Sponsored-by : Sovereign Tech Fund
    Reviewed-by : Roger Pack <rogerdpack@gmail.com>
    Signed-off-by : Michael Niedermayer <michael@niedermayer.cc>

    • [DH] libavdevice/dshow.c