Recherche avancée

Médias (2)

Mot : - Tags -/map

Autres articles (60)

  • Gestion des droits de création et d’édition des objets

    8 février 2011, par

    Par défaut, beaucoup de fonctionnalités sont limitées aux administrateurs mais restent configurables indépendamment pour modifier leur statut minimal d’utilisation notamment : la rédaction de contenus sur le site modifiables dans la gestion des templates de formulaires ; l’ajout de notes aux articles ; l’ajout de légendes et d’annotations sur les images ;

  • Dépôt de média et thèmes par FTP

    31 mai 2013, par

    L’outil MédiaSPIP traite aussi les média transférés par la voie FTP. Si vous préférez déposer par cette voie, récupérez les identifiants d’accès vers votre site MédiaSPIP et utilisez votre client FTP favori.
    Vous trouverez dès le départ les dossiers suivants dans votre espace FTP : config/ : dossier de configuration du site IMG/ : dossier des média déjà traités et en ligne sur le site local/ : répertoire cache du site web themes/ : les thèmes ou les feuilles de style personnalisées tmp/ : dossier de travail (...)

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

  • ffmpeg takes a while to start

    17 octobre 2020, par Suspended

    I have this command in python script, in a loop :

    


    ffmpeg -i somefile.mp4 -ss 00:03:12 -t 00:00:35 piece.mp4 -loglevel error -stats


    


    It cuts out pieces of input file (-i). Input filename, as well as start time (-ss) and length of the piece I cut out (-t) varies, so it reads number of mp4 files and cuts out number of pieces from each one. During execution of the script it might be called around 100 times. My problem is that each time before it starts, there is a delay of few seconds and it adds up to significant time. How can I get it to start immediately ?

    


    The script (process_videos.py) :

    


    import subprocess
import sys
import math
import time

class TF:
    """TimeFormatter class (TF).
This class' reason for being is to convert time in short
form, e.g. 1:33, 0:32, or 23 into long form accepted by
mp4cut function in bash, e.g. 00:01:22, 00:00:32, etc"""

def toLong(self, shrt):
    """Converts time to its long form"""
    sx = '00:00:00'
    ladd = 8 - len(shrt)
    n = sx[:ladd] + shrt
    return n

def toShort(self, lng):
    """Converts time to short form"""
    if lng[0] == '0' or lng[0] == ':':
        return self.toShort(lng[1:])
    else:
        return lng

def toSeconds(self, any_time):
    """Converts time to seconds"""
    if len(any_time) < 3:
        return int(any_time)
    tt = any_time.split(':')
    if len(any_time) < 6:            
        return int(tt[0])*60 + int(tt[1])
    return int(tt[0])*3600 + int(tt[1])*60 + int(tt[2])

def toTime(self, secsInt):
    """"""
    tStr = ''
    hrs, mins, secs = 0, 0, 0
    if secsInt >= 3600:
        hrs = math.floor(secsInt / 3600)
        secsInt = secsInt % 3600
    if secsInt >= 60:
        mins = math.floor(secsInt / 60)
        secsInt = secsInt % 60
    secs = secsInt
    return str(hrs).zfill(2) + ':' + str(mins).zfill(2) + ':' + str(secs).zfill(2)

def minus(self, t_start, t_end):
    """"""
    t_e = self.toSeconds(t_end)
    t_s = self.toSeconds(t_start)
    t_r = t_e - t_s
    hrs, mins, secs = 0, 0, 0
    if t_r >= 3600:
        hrs = math.floor(t_r / 3600)
        t_r = t_r - (hrs * 3600)
    if t_r >= 60:
        mins = math.floor(t_r / 60)
        t_r = t_r - (mins * 60)
    secs = t_r
    hrsf = str(hrs).zfill(2)
    minsf = str(mins).zfill(2)
    secsf = str(secs).zfill(2)
    t_fnl = hrsf + ':' + minsf + ':' + secsf
    return t_fnl

def go_main():
    tf = TF()
    vid_n = 0
    arglen = len(sys.argv)
    if arglen == 2:
        with open(sys.argv[1], 'r') as f_in:
            lines = f_in.readlines()
            start = None
            end = None
            cnt = 0
            for line in lines:
                if line[:5] == 'BEGIN':
                    start = cnt
                if line[:3] == 'END':
                    end = cnt
                cnt += 1
            if start == None or end == None:
                print('Invalid file format. start = {}, end = {}'.format(start,end))
                return
            else:
                lines_r = lines[start+1:end]
                del lines
                print('videos to process: {}'.format(len(lines_r)))
                f_out_prefix = ""
                for vid in lines_r:
                     vid_n += 1
                    print('\nProcessing video {}/{}'.format(vid_n, len(lines_r)))
                    f_out_prefix = 'v' + str(vid_n) + '-'
                    dat = vid.split('!')[1:3]
                    title = dat[0]
                    dat_t = dat[1].split(',')
                    v_pieces = len(dat_t)
                    piece_n = 0
                    video_pieces = []
                    cmd1 = "echo -n \"\" > tmpfile"
                    subprocess.run(cmd1, shell=True)                    
                    print('  new tmpfile created')
                    for v_times in dat_t:
                        piece_n += 1
                        f_out = f_out_prefix + str(piece_n) + '.mp4'
                        video_pieces.append(f_out)
                        print('  piece filename {} added to video_pieces list'.format(f_out))
                        v_times_spl = v_times.split('-')
                        v_times_start = v_times_spl[0]
                        v_times_end = v_times_spl[1]
                        t_st = tf.toLong(v_times_start)
                        t_dur = tf.toTime(tf.toSeconds(v_times_end) - tf.toSeconds(v_times_start))
                        cmd3 = ["ffmpeg", "-i", title, "-ss", t_st, "-t", t_dur, f_out, "-loglevel", "error", "-stats"]
                        print('  cutting out piece {}/{} - {}'.format(piece_n, len(dat_t), t_dur))
                        subprocess.run(cmd3)
                    for video_piece_name in video_pieces:
                        cmd4 = "echo \"file " + video_piece_name + "\" >> tmpfile"
                        subprocess.run(cmd4, shell=True)
                        print('  filename {} added to tmpfile'.format(video_piece_name))
                    vname = f_out_prefix[:-1] + ".mp4"
                    print('  name of joined file: {}'.format(vname))
                    cmd5 = "ffmpeg -f concat -safe 0 -i tmpfile -c copy joined.mp4 -loglevel error -stats"
                    to_be_joined = " ".join(video_pieces)
                    print('  joining...')
                    join_cmd = subprocess.Popen(cmd5, shell=True)
                    join_cmd.wait()
                    print('  joined!')
                    cmd6 = "mv joined.mp4 " + vname
                    rename_cmd = subprocess.Popen(cmd6, shell=True)
                    rename_cmd.wait()
                    print('  File joined.mp4 renamed to {}'.format(vname))
                    cmd7 = "rm " + to_be_joined
                    rm_cmd = subprocess.Popen(cmd7, shell=True)
                    rm_cmd.wait()
                    print('rm command completed - pieces removed')
                cmd8 = "rm tmpfile"
                subprocess.run(cmd8, shell=True)
                print('tmpfile removed')
                print('All done')
    else:
        print('Incorrect number of arguments')

############################
if __name__ == '__main__':
    go_main()


    


    process_videos.py is called from bash terminal like this :

    


    $ python process_videos.py video_data   


    


    video_data file has the following format :

    


    BEGIN
!first_video.mp4!3-23,55-1:34,2:01-3:15,3:34-3:44!
!second_video.mp4!2-7,12-44,1:03-1:33!
END


    


    My system details :

    


    System:    Host: snowflake Kernel: 5.4.0-52-generic x86_64 bits: 64 Desktop: Gnome 3.28.4
           Distro: Ubuntu 18.04.5 LTS
Machine:   Device: desktop System: Gigabyte product: N/A serial: N/A
Mobo:      Gigabyte model: Z77-D3H v: x.x serial: N/A BIOS: American Megatrends v: F14 date: 05/31/2012
CPU:       Quad core Intel Core i5-3570 (-MCP-) cache: 6144 KB 
           clock speeds: max: 3800 MHz 1: 1601 MHz 2: 1601 MHz 3: 1601 MHz 4: 1602 MHz
Drives:    HDD Total Size: 1060.2GB (55.2% used)
           ID-1: /dev/sda model: ST31000524AS size: 1000.2GB
           ID-2: /dev/sdb model: Corsair_Force_GT size: 60.0GB
Partition: ID-1: / size: 366G used: 282G (82%) fs: ext4 dev: /dev/sda1
           ID-2: swap-1 size: 0.70GB used: 0.00GB (0%) fs: swap dev: /dev/sda5
Info:      Processes: 313 Uptime: 16:37 Memory: 3421.4/15906.9MB Client: Shell (bash) inxi: 2.3.56


    


  • Pipe output of ffmpeg using nodejs stdout

    21 mai 2014, par rughimire

    I am not being able to pipe the output of the ffmpeg over a stdout.

    Following are the block of code what I coded so far.

       var http = require('http')
       , fs = require('fs')
       var child_process = require("child_process")

       http.createServer(function (req, res) {
       console.log("Request:", dump_req(req) , "\n")

       // path of the
       var path = 'test-mp4.mp4'  //test-mp4-long.mp4
       , stat = fs.statSync(path)
       , total = stat.size


       var range = req.headers.range
       , parts = range.replace(/bytes=/, "").split("-")
       , partialstart = parts[0]
       , partialend = parts[1]
       , start = parseInt(partialstart, 10)
       , end = partialend ? parseInt(partialend, 10) : total-1
       , chunksize = (end-start)+1


       console.log('RANGE: ' + start + ' - ' + end + ' = ' + chunksize +  "\n")


       var ffmpeg = child_process.spawn("ffmpeg",[
               "-i", path,             // path
               "-b:v" , "64k",         // bitrate to 64k
               "-bufsize", "64k",
               "-"                     // Output to STDOUT
           ]);


       //set header
       res.writeHead(206
       , { 'Content-Range': 'bytes ' + start + '-' + end + '/' + total
       , 'Accept-Ranges': 'bytes', 'Content-Length': chunksize
       , 'Content-Type': 'video/mp4'
       })

       stdout[ params[1] ] = ffmpeg.stdout

       // Pipe the video output to the client response
       ffmpeg.stdout.pipe(res);

       console.log("Response", dump_res(res), "\n")
       }).listen(1337)

    When i replaced the ffmpeg stuffs from above code, all works fine. Following is the part of the code when i replace the ffmpeg stuffs.

    var file = fs.createReadStream(path, {start: start, end: end})

    And piping like :

    file.pipe(res)

    What wrong I am running ?

    Edit :
    The ffmpeg command works fine. I have tested this through the command line and generating proper output.

  • FFmpeg file conversion exceeds maximum execution time

    5 mai 2014, par Paul Ledger

    I have a file upload system the checks the file format, etc and converts to an mp4 if necessary. This works fine as long as the video file(s) total length is less than 30 seconds.
    I have been testing this two short clips about 10 seconds each and it work fine but when I test this with a clip that this 33 seconds I get the error :

    Fatal error : Maximum execution time of 30 seconds exceeded in
    C :\xampp\htdocs\own_it_all\global.func\file_upload.php on line
    59

    I could just increase the maximum execution time in the php.ini file but as the max length of a video is 20 mins this wouldn’t seem very user friendly making the user wait 20 mins per video.
    Is there a way of converting the video instantly or as near as ?

    This is the exec cmd i have :

    $cmd = "ffmpeg -i $input -vcodec h264 -acodec aac -strict -2 $o";

    As the up-loader allows multiple uploads this is inside a for loop.

    foreach($_FILES['file']['name'] as $key => $name){
           if($_FILES['file']['error'][$key] === 0){
               $temp = $_FILES['file']['tmp_name'][$key];
               $ext = explode('.',$name);
               $ext = strtolower(end($ext));
               $_file = md5($temp).time();
               $file = $_file.'.'.$ext;
               if(in_array($ext,$allowed) === true &&  move_uploaded_file($temp,"../uploads/{$file}") === true){
                   $file_type = explode('/',$_FILES['file']['type'][$key]);
                   if($file_type[0] === 'image'){
                       $succedeed[] = array('name' => $name,'file' => $file, 'type' => 'image');              
                   }else{
                       $ffmpeg = 'ffmpeg';
                       $output = dirname(__DIR__).'/uploads/thumbs/'.$_file.'.jpg';
                       $input = dirname(__DIR__).'/uploads/'.$file;
                       $mov = new ffmpeg_movie($input);
                       $d =  $mov->getDuration();
                       $iscopy = $mov->getCopyright();
                       $h = $mov->getFrameHeight();
                       $w = $mov->getFrameWidth();
                       $pos = ceil((int)$d /3);
                       $size = $w.'x'.$h;
                       $i = explode('.',$input);
                       $o = $i[0].'.mp4';
                       if(ceil($d) < 1200){
                           if($ext != 'mp4'){
                               $cmd = "ffmpeg -i $input -vcodec h264 -acodec aac -strict -2 $o";
                               //$cmd = "ffmpeg -i $input -vcodec h264 -acodec aac -s $size $o";
                               shell_exec($cmd);
                               $toclear[] = array('file' => $file);
                           }
                           $cmd = "ffmpeg -ss $pos -i $o -an -s $size $output";
                           shell_exec($cmd);
                           $total_time += $pos;
                           $succedeed[] = array('name' => $name,'file' => 'thumbs/'.$_file.'.jpg', 'type' => 'mp4');                          

                       }else{
                           $failed[] = array('name' => $name, 'file' => $file, 'error' => 'Video length cannot exceed 20mins.');
                       }          
                   }

               }else{
                   $failed[] = array('name' => $name, 'file' => $file, 'error' => 'File type not allowed');
               }
           }
       }