Recherche avancée

Médias (29)

Mot : - Tags -/Musique

Autres articles (77)

  • Les autorisations surchargées par les plugins

    27 avril 2010, par

    Mediaspip core
    autoriser_auteur_modifier() afin que les visiteurs soient capables de modifier leurs informations sur la page d’auteurs

  • 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

  • List of compatible distributions

    26 avril 2011, par

    The table below is the list of Linux distributions compatible with the automated installation script of MediaSPIP. Distribution nameVersion nameVersion number Debian Squeeze 6.x.x Debian Weezy 7.x.x Debian Jessie 8.x.x Ubuntu The Precise Pangolin 12.04 LTS Ubuntu The Trusty Tahr 14.04
    If you want to help us improve this list, you can provide us access to a machine whose distribution is not mentioned above or send the necessary fixes to add (...)

Sur d’autres sites (7937)

  • Precise method of segmenting & transcoding video+audio (via ffmpeg), into an on-demand HLS stream ?

    17 novembre 2019, par Felix

    recently I’ve been messing around with FFMPEG and streams through Nodejs. My ultimate goal is to serve a transcoded video stream - from any input filetype - via HTTP, generated in real-time as it’s needed in segments.

    I’m currently attempting to handle this using HLS. I pre-generate a dummy m3u8 manifest using the known duration of the input video. It contains a bunch of URLs that point to individual constant-duration segments. Then, once the client player starts requesting the individual URLs, I use the requested path to determine which time range of video the client needs. Then I transcode the video and stream that segment back to them.

    Now for the problem : This approach mostly works, but has a small audio bug. Currently, with most test input files, my code produces a video that - while playable - seems to have a very small (< .25 second) audio skip at the start of each segment.

    I think this may be an issue with splitting using time in ffmpeg, where possibly the audio stream cannot be accurately sliced at the exact frame the video is. So far, I’ve been unable to figure out a solution to this problem.

    If anybody has any direction they can steer me - or even a prexisting library/server that solves this use-case - I appreciate the guidance. My knowledge of video encoding is fairly limited.

    I’ll include an example of my relevant current code below, so others can see where I’m stuck. You should be able to run this as a Nodejs Express server, then point any HLS player at localhost:8080/master to load the manifest and begin playback. See the transcode.get('/segment/:seg.ts' line at the end, for the relevant transcoding bit.

    'use strict';
    const express = require('express');
    const ffmpeg = require('fluent-ffmpeg');
    let PORT = 8080;
    let HOST = 'localhost';
    const transcode = express();


    /*
    * This file demonstrates an Express-based server, which transcodes &amp; streams a video file.
    * All transcoding is handled in memory, in chunks, as needed by the player.
    *
    * It works by generating a fake manifest file for an HLS stream, at the endpoint "/m3u8".
    * This manifest contains links to each "segment" video clip, which browser-side HLS players will load as-needed.
    *
    * The "/segment/:seg.ts" endpoint is the request destination for each clip,
    * and uses FFMpeg to generate each segment on-the-fly, based off which segment is requested.
    */


    const pathToMovie = 'C:\\input-file.mp4';  // The input file to stream as HLS.
    const segmentDur = 5; //  Controls the duration (in seconds) that the file will be chopped into.


    const getMetadata = async(file) => {
       return new Promise( resolve => {
           ffmpeg.ffprobe(file, function(err, metadata) {
               console.log(metadata);
               resolve(metadata);
           });
       });
    };



    // Generate a "master" m3u8 file, which the player should point to:
    transcode.get('/master', async(req, res) => {
       res.set({"Content-Disposition":"attachment; filename=\"m3u8.m3u8\""});
       res.send(`#EXTM3U
    #EXT-X-STREAM-INF:BANDWIDTH=150000
    /m3u8?num=1
    #EXT-X-STREAM-INF:BANDWIDTH=240000
    /m3u8?num=2`)
    });

    // Generate an m3u8 file to emulate a premade video manifest. Guesses segments based off duration.
    transcode.get('/m3u8', async(req, res) => {
       let met = await getMetadata(pathToMovie);
       let duration = met.format.duration;

       let out = '#EXTM3U\n' +
           '#EXT-X-VERSION:3\n' +
           `#EXT-X-TARGETDURATION:${segmentDur}\n` +
           '#EXT-X-MEDIA-SEQUENCE:0\n' +
           '#EXT-X-PLAYLIST-TYPE:VOD\n';

       let splits = Math.max(duration / segmentDur);
       for(let i=0; i&lt; splits; i++){
           out += `#EXTINF:${segmentDur},\n/segment/${i}.ts\n`;
       }
       out+='#EXT-X-ENDLIST\n';

       res.set({"Content-Disposition":"attachment; filename=\"m3u8.m3u8\""});
       res.send(out);
    });

    // Transcode the input video file into segments, using the given segment number as time offset:
    transcode.get('/segment/:seg.ts', async(req, res) => {
       const segment = req.params.seg;
       const time = segment * segmentDur;

       let proc = new ffmpeg({source: pathToMovie})
           .seekInput(time)
           .duration(segmentDur)
           .outputOptions('-preset faster')
           .outputOptions('-g 50')
           .outputOptions('-profile:v main')
           .withAudioCodec('aac')
           .outputOptions('-ar 48000')
           .withAudioBitrate('155k')
           .withVideoBitrate('1000k')
           .outputOptions('-c:v h264')
           .outputOptions(`-output_ts_offset ${time}`)
           .format('mpegts')
           .on('error', function(err, st, ste) {
               console.log('an error happened:', err, st, ste);
           }).on('progress', function(progress) {
               console.log(progress);
           })
           .pipe(res, {end: true});
    });

    transcode.listen(PORT, HOST);
    console.log(`Running on http://${HOST}:${PORT}`);
  • TypeError : 'function' object is not subscriptable Python with ffmpeg

    25 novembre 2019, par S1mple
    clips = []

    def clipFinder(CurrentDir, fileType):
       clips.clear()
       for r,d,f in os.walk(CurrentDir):
           for file in f:
               if fileType in file:
                   clips.append(r+file)
       random.shuffle(clips)

    def removeVods(r):
       for f in clips:
           if 'vod' in clips:
               os.remove(r+f)

    def clipString():
       string = 'intermediate'
       clipList = []
       clipNum = 1
       for f in clips:
           clipList.append(string+str(clipNum)+'.ts'+'|')
           clipNum+=1
       string1 = ''.join(clipList)
       string2 = string1[0:len(string1)-1]
       return string2

    def concatFiles():
       clipFinder('***', '.mp4')
       removeVods('***')
       i = 0
       intermediates = []
       for f in clips:
           subprocess.call(['***', '-i', clips[i], '-c', 'copy', '-bsf:v', 'h264_mp4toannexb', '-f', 'mpegts', 'intermediate'+ str(i+1) +'.ts'])
           i += 1
       clipsLength = len(clips)
       subprocess.call['***', '-i', '"concat:' + clipString() + '"', '-c', 'copy', '-bsf:a
       aac_adtstoasc', 'output.mp4']

    I am trying to make a clip concatenator, but the last subprocess call won’t run and gives me the error shown in the question.

    Problematic code :

    subprocess.call(['***', '-i', '"concat:' + clipString() + '"', '-c', 'copy', '-bsf:a aac_adtstoasc', 'output.mp4'])

    all places with * were paths such as :
    /davidscomputer/bin/ffmpeg/

  • AWS Lambda for generate thumbnail save empty file

    30 octobre 2019, par Milousel

    I need to create aws lambda for creating thumbnail from video by using ffmpeg, which is saved on S3 and this thumbnail saved into S3 too.

    I downloaded ffmpeg from https://johnvansickle.com/ffmpeg/ page, set ffmpeg into nodejs file and send it into .zip. From this zip file I created ffmpeg layer. After that I connect my lambda with this ffmpeg layer. When I test it I receive Success response, but I save empty file (0 B size) into S3.

    const AWS = require("aws-sdk");
    const { spawn } = require("child_process");
    const { createReadStream, createWriteStream } = require("fs");

    const s3 = new AWS.S3();
    const ffmpegPath = "/opt/nodejs/ffmpeg";
    const allowedTypes = ["mov", "mpg", "mpeg", "mp4", "wmv", "avi", "webm"];
    const width = process.env.WIDTH;
    const height = process.env.HEIGHT;

    module.exports.handler = async (event, context) => {
     const srcKey = "test/0255f240-efef-11e9-862e-3949600f0ec9.mp4";
     const bucket = "video.devel.abc.com";
     const target = s3.getSignedUrl("getObject", {
       Bucket: bucket,
       Key: srcKey,
       Expires: 1000
     });
     let fileType = "mp4";
     console.log("srcKey: " + srcKey);
     console.log("bucket: " + bucket);
     console.log("target: " + target);
     if (!fileType) {
       throw new Error(`invalid file type found for key: ${srcKey}`);
     }

     if (allowedTypes.indexOf(fileType) === -1) {
       throw new Error(`filetype: ${fileType} is not an allowed type`);
     }

     function createImage(seek) {
       return new Promise((resolve, reject) => {
         let tmpFile = createWriteStream(`/tmp/screenshot.jpg`);
         const ffmpeg = spawn(ffmpegPath, [
           "-ss",
           seek,
           "-i",
           target,
           "-vf",
           `thumbnail,scale=${width}:${height}`,
           "-qscale:v",
           "2",
           "-frames:v",
           "1",
           "-f",
           "image2",
           "-c:v",
           "mjpeg",
           "pipe:1"
         ]);

         ffmpeg.stdout.pipe(tmpFile);
         ffmpeg.on("close", function(code) {
             console.log('code: ' + code);
           tmpFile.end();
           resolve();
         });

         ffmpeg.on("error", function(err) {
           console.log(err);
           reject();
         });
       });
     }

     function uploadToS3() {
       return new Promise((resolve, reject) => {
         let tmpFile = createReadStream(`/tmp/screenshot.jpg`);
         let dstKey = srcKey
           .replace(/\.\w+$/, `.jpg`)
           .replace("test/", "test/shots/");
         //const screensFile = "test/shots/";
         console.log("dstKey: " + dstKey);
         var params = {
           Bucket: bucket,
           Key: dstKey,
           Body: tmpFile,
           ContentType: `image/jpg`
         };

         s3.upload(params, function(err, data) {
           if (err) {
             console.log(err);
             reject();
           }
           console.log(`successful upload to ${bucket}/${dstKey}`);
           resolve();
         });
       });
     }

     await createImage(1);
     await uploadToS3();
     return console.log(`processed ${bucket}/${srcKey} successfully`);
    };

    When I test it I receive these logs :

  • srcKey : test/0255f240-efef-11e9-862e-3949600f0ec9.mp4
  • bucket : video.devel.abc.com
  • INFO processed video.devel.abc.com successfully
  • code : 1
  • bucket : video.devel.abc.com
  • dstKey : test/shots/0255f240-efef-11e9-862e-3949600f0ec9.jpg
  • successful upload to video.devel.abc.com/test/shots/0255f240-efef-11e9-862e-3949600f0ec9.jpg
  • processed video.devel.abc.com/test/0255f240-efef-11e9-862e-3949600f0ec9.mp4 successfully
  • So file is really created, but it is empty (size is 0 B), which is not ideal.

Boussole SPIP

SPIP.net-La documentation officielle et téléchargement de (...) SPIP Code-La documentation du code de SPIP Programmer SPIP-La documentation pour développer avec (...) Traduire SPIP-Espace de traduction de SPIP et de ses (...) Plugins SPIP-L'annuaire des plugins SPIP SPIP-Contrib-L'espace des contributions à SPIP Forge SPIP-L'espace de développement de SPIP et de ses (...) Discuter sur SPIP-Les nouveaux forums de la communauté (...) SPIP Party-L'agenda des apéros et autres rencontres (...) Médias SPIP-La médiathèque de SPIP SPIP Syntaxe-Tester l'édition de texte dans SPIP