Recherche avancée

Médias (91)

Autres articles (36)

  • Pas question de marché, de cloud etc...

    10 avril 2011

    Le vocabulaire utilisé sur ce site essaie d’éviter toute référence à la mode qui fleurit allègrement
    sur le web 2.0 et dans les entreprises qui en vivent.
    Vous êtes donc invité à bannir l’utilisation des termes "Brand", "Cloud", "Marché" etc...
    Notre motivation est avant tout de créer un outil simple, accessible à pour tout le monde, favorisant
    le partage de créations sur Internet et permettant aux auteurs de garder une autonomie optimale.
    Aucun "contrat Gold ou Premium" n’est donc prévu, aucun (...)

  • Ajouter notes et légendes aux images

    7 février 2011, par

    Pour pouvoir ajouter notes et légendes aux images, la première étape est d’installer le plugin "Légendes".
    Une fois le plugin activé, vous pouvez le configurer dans l’espace de configuration afin de modifier les droits de création / modification et de suppression des notes. Par défaut seuls les administrateurs du site peuvent ajouter des notes aux images.
    Modification lors de l’ajout d’un média
    Lors de l’ajout d’un média de type "image" un nouveau bouton apparait au dessus de la prévisualisation (...)

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

Sur d’autres sites (5393)

  • rtmpproto : Add function to read a number response

    14 octobre 2014, par Uwe L. Korn
    rtmpproto : Add function to read a number response
    

    Packets that contain a number as a result to a rtmp function call are
    structured the same way (String, Number, Null, Number). This new method
    also includes more bounds checks to better handle packets that are not
    structured as expected.

    Signed-off-by : Martin Storsjö <martin@martin.st>

    • [DBH] libavformat/rtmpproto.c
  • How to setup my complex filter with zoompan and xfade for ffmpeg using Fluent-FFmpeg .complexFilter method ?

    20 août 2024, par Rémy Groleau

    i'm using fluent-ffmpeg with nodejs. My problem is the setup of my complex filter.

    &#xA;

    const filters = Array.from({ length: imageCount - 1 }).map((_, i) => {&#xA;        const rndInt = Math.floor(Math.random() * 1000) &#x2B; 1&#xA;&#xA;        return {&#xA;            zoompanFilter1: {&#xA;                filter: &#x27;zoompan&#x27;,&#xA;                options: {&#xA;                    z: &#x27;min(zoom&#x2B;0.001,1.3)&#x27;,&#xA;                    d: `${imageDuration * 60}`, &#xA;                    x: `iw/2-iw*(1/2-${rndInt}/100)*iw/zoom`, &#xA;                    y: `ih/2-ih*(1/2-${rndInt}/100)*ih/zoom`, &#xA;                    s: &#x27;1080x1920&#x27;, // Output size&#xA;                    fps: &#x27;60&#x27;&#xA;                },&#xA;                inputs: `[${i}:v]`,&#xA;                outputs: `zoomed${i}`&#xA;            },&#xA;            zoompanFilter2: {&#xA;                filter: &#x27;zoompan&#x27;,&#xA;                options: {&#xA;                    z: &#x27;min(zoom&#x2B;0.001,1.3)&#x27;, &#xA;                    d: `${imageDuration * 60}`, &#xA;                    x: &#x27;iw/2-iw*(1/2-33/100)*iw/zoom&#x27;,&#xA;                    y: &#x27;ih/2-ih*(1/2-33/100)*ih/zoom&#x27;,&#xA;                    s: &#x27;1080x1920&#x27;, // Output size&#xA;                    fps: &#x27;60&#x27;&#xA;                },&#xA;                inputs: [`${i &#x2B; 1}:v`],&#xA;                outputs: `zoomed${i &#x2B; 1}`&#xA;            },&#xA;            xfadeFilter: {&#xA;                filter: &#x27;xfade&#x27;,&#xA;                options: {&#xA;                    transition: &#x27;fade&#x27;, // Crossfade transition effect&#xA;                    duration: &#x27;0.5&#x27;, // Duration of crossfade in seconds&#xA;                    offset: `${imageDuration - 1}` // Offset to start the crossfade&#xA;                },&#xA;                inputs: [`zoomed${i &#x2B; 1}`, `zoomed${i}`],&#xA;                outputs: `crossfaded${i}`&#xA;            },&#xA;        };&#xA;    });&#xA;

    &#xA;

    This is my complete code :

    &#xA;

    async function createVideo() {&#xA;    // Escape file paths for Windows&#xA;    const videoPath = path.resolve(__dirname&#x2B; &#x27;/output.mp4&#x27;).replace(/\\/g, &#x27;\\\\&#x27;);&#xA;    const audioPath = path.resolve(__dirname&#x2B; &#x27;/output.mp3&#x27;).replace(/\\/g, &#x27;\\\\&#x27;);&#xA;    const backgroundMusicPath = path.resolve(__dirname&#x2B; &#x27;/background-music.mp3&#x27;).replace(/\\/g, &#x27;\\\\&#x27;);&#xA;&#xA;    const command = ffmpeg();&#xA;&#xA;    const imagesDir = path.join(__dirname, &#x27;images&#x27;);&#xA;    const images = fs.readdirSync(imagesDir)&#xA;        .filter(file => /.(jpg|jpeg|png)$/i.test(file)) // Filter image files&#xA;        .sort() // Sort filenames to ensure the correct order&#xA;        .map(file => path.join(imagesDir, file));&#xA;&#xA;        images.map((image) => command.input(image))&#xA;&#xA;    const imageCount = images.length;&#xA;    const audioDuration = await getAudioDurationInSeconds(audioPath);&#xA;    const imageDuration =  Math.round(audioDuration / imageCount)&#xA;&#xA;    const filters = Array.from({ length: imageCount - 1 }).map((_, i) => {&#xA;        const rndInt = Math.floor(Math.random() * 1000) &#x2B; 1&#xA;&#xA;        return {&#xA;            zoompanFilter1: {&#xA;                filter: &#x27;zoompan&#x27;,&#xA;                options: {&#xA;                    z: &#x27;min(zoom&#x2B;0.001,1.3)&#x27;, // Reset zoom to 1.0&#xA;                    d: `${imageDuration * 60}`, // Duration of the zoom effect&#xA;                    x: `iw/2-iw*(1/2-${rndInt}/100)*iw/zoom`, // Center x&#xA;                    y: `ih/2-ih*(1/2-${rndInt}/100)*ih/zoom`, // Center y&#xA;                    s: &#x27;1080x1920&#x27;, // Output size&#xA;                    fps: &#x27;60&#x27;&#xA;                },&#xA;                inputs: `[${i}:v]`,&#xA;                outputs: `zoomed${i}`&#xA;            },&#xA;            zoompanFilter2: {&#xA;                filter: &#x27;zoompan&#x27;,&#xA;                options: {&#xA;                    z: &#x27;min(zoom&#x2B;0.001,1.3)&#x27;, // Reset zoom to 1.0&#xA;                    d: `${imageDuration * 60}`, // Duration of the zoom effect&#xA;                    x: &#x27;iw/2-iw*(1/2-33/100)*iw/zoom&#x27;, // Center x&#xA;                    y: &#x27;ih/2-ih*(1/2-33/100)*ih/zoom&#x27;, // Center y&#xA;                    s: &#x27;1080x1920&#x27;, // Output size&#xA;                    fps: &#x27;60&#x27;&#xA;                },&#xA;                inputs: [`${i &#x2B; 1}:v`],&#xA;                outputs: `zoomed${i &#x2B; 1}`&#xA;            },&#xA;            xfadeFilter: {&#xA;                filter: &#x27;xfade&#x27;,&#xA;                options: {&#xA;                    transition: &#x27;fade&#x27;, // Crossfade transition effect&#xA;                    duration: &#x27;0.5&#x27;, // Duration of crossfade in seconds&#xA;                    offset: `${imageDuration - 1}` // Offset to start the crossfade&#xA;                },&#xA;                inputs: [`zoomed${i &#x2B; 1}`, `zoomed${i}`],&#xA;                outputs: `crossfaded${i}`&#xA;            },&#xA;        };&#xA;    });&#xA;&#xA;    command&#xA;    .input(audioPath)&#xA;    .input(backgroundMusicPath)&#xA;    .outputOptions([&#xA;        &#x27;-pix_fmt&#x27;, &#x27;yuv420p&#x27;,&#xA;        &#x27;-c:v&#x27;, &#x27;libx264&#x27;,&#xA;        &#x27;-c:a&#x27;, &#x27;aac&#x27;,&#xA;        &#x27;-y&#x27;,&#xA;        &#x27;-t&#x27;, `${audioDuration}`,&#xA;        &#x27;-r&#x27;, &#x27;60&#x27;,&#xA;        &#x27;-s&#x27;, &#x27;1080x1920&#x27;,&#xA;        &#x27;-preset&#x27;, &#x27;ultrafast&#x27;,&#xA;        &#x27;-map&#x27;, &#x27;[final_video]&#x27;,&#xA;        &#x27;-map&#x27;, &#x27;[mixed_audio]&#x27;,&#xA;    ])&#xA;    .complexFilter([&#xA;        // Apply zoompan filters and xfade transitions&#xA;        ...filters.flatMap(({ zoompanFilter1, zoompanFilter2, xfadeFilter }) => [&#xA;            zoompanFilter1,&#xA;            zoompanFilter2,&#xA;            xfadeFilter,&#xA;        ]),&#xA;        {&#xA;            filter: &#x27;concat&#x27;,&#xA;            options: {&#xA;                n: imageCount - 1, // Number of videos to concatenate&#xA;                v: 1, // Video streams&#xA;                a: 0 // No audio streams&#xA;            },&#xA;            inputs: filters.map((_, i) => `crossfaded${i}`),&#xA;            outputs: &#x27;video_sequence&#x27;&#xA;        },&#xA;        {&#xA;            filter: &#x27;curves&#x27;,&#xA;            options: &#x27;preset=increase_contrast&#x27;,&#xA;            inputs: &#x27;video_sequence&#x27;,&#xA;            outputs: &#x27;curves&#x27;&#xA;        },&#xA;        {&#xA;            filter: &#x27;subtitles&#x27;,&#xA;            options: `./subtitles.ass:fontsdir=./fonts/:force_style=&#x27;FontName=Montserrat Black Italic,FontSize=17,MarginL=10,MarginV=25,Alignment=10,Spacing=0.2,Outline=0.1,Shadow=1.5&#x27;`,&#xA;            inputs: &#x27;[curves]&#x27;,&#xA;            outputs: &#x27;final_video&#x27;&#xA;        },&#xA;        {&#xA;            filter: &#x27;volume&#x27;,&#xA;            options: 0.3,  // Adjust the volume to 25% of the original&#xA;            inputs: `${imageCount &#x2B; 1}:a`,&#xA;            outputs: &#x27;background_music_adjusted&#x27;&#xA;        },&#xA;        // Apply the amix filter to mix the two audio inputs&#xA;        {&#xA;            filter: &#x27;amix&#x27;,&#xA;            options: {&#xA;                inputs: 2,&#xA;                duration: &#x27;first&#x27;,&#xA;                dropout_transition: 0,&#xA;                weights: &#x27;1 0.25&#x27;,&#xA;                normalize: 0&#xA;            },&#xA;            inputs: [`${imageCount}:a`, &#x27;background_music_adjusted&#x27;],&#xA;            outputs: &#x27;mixed_audio&#x27;&#xA;        },&#xA;      ])&#xA;    .save(videoPath)&#xA;    .on(&#x27;progress&#x27;, function(progress) {&#xA;        console.log(&#x27;Processing: &#x27; &#x2B; progress.percent &#x2B; &#x27;% done&#x27;);&#xA;      })&#xA;    .on(&#x27;end&#x27;, function(stdout, stderr) {&#xA;        // emptyFolder(imagesDir)&#xA;        console.log(&#x27;Transcoding succeeded !&#x27;);&#xA;      }) &#xA;    .on(&#x27;error&#x27;, function(err) {&#xA;        console.error(&#x27;Une erreur s\&#x27;est produite :&#x27;, err.message);&#xA;    });&#xA;}&#xA;

    &#xA;

    My problem is i see the 1 image then the transition and i see the 2 image. After that i'm suppose to see the 3 image but i see the 2 image.

    &#xA;

    I don't understand what i'm doing wrong...

    &#xA;

    i tried switching the inputs: [zoomed$i + 1, zoomed$i] to inputs: [zoomed$i, zoomed$i+1] but it just showed the next image and not a loop of consecutive images.

    &#xA;

  • How to calculate the number of frames extracted at certain FPS ?

    3 juillet 2021, par jones

    I have a bunch of videos in a folder at different fps. I need to calculate the number of frames that can be extracted at 0.5 fps.

    &#xA;

    Its kind of a simple mathematical problem, I need help on the formula.

    &#xA;

    Thanks

    &#xA;