Recherche avancée

Médias (1)

Mot : - Tags -/musée

Autres articles (19)

  • Script d’installation automatique de MediaSPIP

    25 avril 2011, par

    Afin de palier aux difficultés d’installation dues principalement aux dépendances logicielles coté serveur, un script d’installation "tout en un" en bash a été créé afin de faciliter cette étape sur un serveur doté d’une distribution Linux compatible.
    Vous devez bénéficier d’un accès SSH à votre serveur et d’un compte "root" afin de l’utiliser, ce qui permettra d’installer les dépendances. Contactez votre hébergeur si vous ne disposez pas de cela.
    La documentation de l’utilisation du script d’installation (...)

  • Utilisation et configuration du script

    19 janvier 2011, par

    Informations spécifiques à la distribution Debian
    Si vous utilisez cette distribution, vous devrez activer les dépôts "debian-multimedia" comme expliqué ici :
    Depuis la version 0.3.1 du script, le dépôt peut être automatiquement activé à la suite d’une question.
    Récupération du script
    Le script d’installation peut être récupéré de deux manières différentes.
    Via svn en utilisant la commande pour récupérer le code source à jour :
    svn co (...)

  • La sauvegarde automatique de canaux SPIP

    1er avril 2010, par

    Dans le cadre de la mise en place d’une plateforme ouverte, il est important pour les hébergeurs de pouvoir disposer de sauvegardes assez régulières pour parer à tout problème éventuel.
    Pour réaliser cette tâche on se base sur deux plugins SPIP : Saveauto qui permet une sauvegarde régulière de la base de donnée sous la forme d’un dump mysql (utilisable dans phpmyadmin) mes_fichiers_2 qui permet de réaliser une archive au format zip des données importantes du site (les documents, les éléments (...)

Sur d’autres sites (1583)

  • ffmpeg shell script globbing

    10 novembre 2015, par AD0AE

    I have a pretty straight forward question. I have a bunch of individual directories that are labeled as ./001 ./002 ... ./201
    within each directory contains files that have the identifier *_IO.PNG

    I can use the shell command : ffmpeg -framerate 20 -pattern_type glob -i './066/*IO.PNG' -c:v libx264 -pix_fmt yuv420p 066.mp4 and this works great. It does exactly what I want.

    However, I tried to write a shell script, which is below but this does not work. It seems to be loading individual files instead of all of them at once. Any help would be appreciated.

    #!/bin/bash
    for i in {1..5}
    do
      FILE=$(printf %03d $i)
      echo " This file: $FILE"
      infile='./$FILE/*IO.PNG'
      echo $infile
      ffmpeg -framerate 20 -pattern_type glob -i $infile -c:v libx264 -pix_fmt yuv420p './$FILE.mp4'
    done
  • FFMPEG works on Console but doesn't work in PHP script on Ubuntu

    16 novembre 2016, par Victor Ferreira

    I have this aplication where I need to convert video files to MP4 and then compress it. I’m trying to use FFMPEG to get this to work. Tried the command lines in the console and it works great

    Converting

    ffmpeg -i teste.avi teste.mp4

    Compressing

    ffmpeg -i teste.mp4 -acodec mp2 teste.mp4

    But when I do the same within a PHP script, it starts yelling that something called GLIBCXX is not installed. This is the error :

    ffmpeg: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib/i386-linux-gnu/libjack.so.0)
    ffmpeg: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by /usr/lib/i386-linux-gnu/libjack.so.0)
    ffmpeg: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.15' not found (required by /usr/lib/i386-linux-gnu/libjack.so.0)
    ffmpeg: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by /usr/lib/i386-linux-gnu/libzmq.so.3)
    ffmpeg: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /usr/lib/i386-linux-gnu/libzmq.so.3)
    ffmpeg: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.11' not found (required by /usr/lib/i386-linux-gnu/libopencv_core.so.2.4)
    ffmpeg: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.9' not found (required by /usr/lib/i386-linux-gnu/libopencv_core.so.2.4)
    ffmpeg: /opt/lampp/lib/libstdc++.so.6: version `GLIBCXX_3.4.20' not found (required by /usr/lib/i386-linux-gnu/libopencv_core.so.2.4)

    This is my script

    $r = shell_exec("ffmpeg -i $file_path $output_path 2>&1"); //convert
    $r = shell_exec("ffmpeg -i $file_path -acodec mp2 $file_path 2>&1"); //compress

    I’m running the script on Ubuntu

    @edit
    I can run, for example, shell_exec(’ls’)

  • My python script using ffmpeg captures video content, but the captured content freezes in the middle and jumps frames

    11 novembre 2022, par Supriyo Mitra

    I am new to ffmpeg and I am trying to use it through a python script. The python functions that captures the video content is given below. The problem I am facing is that the captured content freezes at (uneven) intervals and skips a few frames every time it happens.

    


    `    def capturelivestream(self, argslist):
        streamurl, outnum, feedid, outfilename = argslist[0], argslist[1], argslist[2], argslist[3]
        try:
            info = ffmpeg.probe(streamurl, select_streams='a')
            streams = info.get('streams', [])
        except:
            streams = []
        if len(streams) == 0:
            print('There are no streams available')
            stream = {}
        else:
            stream = streams[0]
            for stream in streams:
                if stream.get('codec_type') != 'audio':
                    continue
                else:
                    break
        if 'channels' in stream.keys():
            channels = stream['channels']
            samplerate = float(stream['sample_rate'])
        else:
            channels = None
            samplerate = 44100
        process = ffmpeg.input(streamurl).output('pipe:', pix_fmt='yuv420p', format='avi', vcodec='libx264', acodec='pcm_s16le', ac=channels, ar=samplerate, vsync=0, loglevel='quiet').run_async(pipe_stdout=True)
        fpath = os.path.dirname(outfilename)
        fnamefext = os.path.basename(outfilename)
        fname = fnamefext.split(".")[0]
        read_size = 320 * 180 * 3 # This is width * height * 3
        lastcaptured = time.time()
        maxtries = 12
        ntries = 0
        while True:
            if process:
                inbytes = process.stdout.read(read_size)
                if inbytes is not None and inbytes.__len__() > 0:
                    try:
                        frame = (np.frombuffer(inbytes, np.uint8).reshape([180, 320, 3]))
                    except:
                        print("Failed to reshape frame: %s"%sys.exc_info()[1].__str__())
                        continue # This could be an issue if there is a continuous supply of frames that cannot be reshaped
                    self.processq.put([outnum, frame])
                    lastcaptured = time.time()
                    ntries = 0
                else:
                    if self.DEBUG:
                        print("Could not read frame for feed ID %s"%feedid)
                    t = time.time()
                    if t - lastcaptured > 30: # If the frames can't be read for more than 30 seconds...
                        print("Reopening feed identified by feed ID %s"%feedid)
                        process = ffmpeg.input(streamurl).output('pipe:', pix_fmt='yuv420p', format='avi', vcodec='libx264', acodec='pcm_s16le', ac=channels, ar=samplerate, vsync=0, loglevel='quiet').run_async(pipe_stdout=True)
                        ntries += 1
                    if ntries > maxtries:
                        if self.DEBUG:
                            print("Stream %s is no longer available."%streamurl)
                        # DB statements removed here
                        
                        break # Break out of infinite loop.
                    continue
        
        return None`



    


    The function that captures the frames is as follows :

    


    
`    def framewriter(self, outlist):
        isempty = False
        endofrun = False
        while True:
            frame = None
            try:
                args = self.processq.get()
            except: # Sometimes, the program crashes at this point due to lack of memory...
                print("Error in framewriter while reading from queue: %s"%sys.exc_info()[1].__str__())
                continue
            outnum = args[0]
            frame = args[1]
            if outlist.__len__() > outnum:
                out = outlist[outnum]
            else:
                if self.DEBUG == 2:
                    print("Could not get writer %s"%outnum)
                continue
            if frame is not None and out is not None:
                out.write(frame)
                isempty = False
                endofrun = False
            else:
                if self.processq.empty() and not isempty:
                    isempty = True
                elif self.processq.empty() and isempty: # processq queue is empty now and was empty last time
                    print("processq is empty")
                    endofrun = True
                elif endofrun and isempty:
                    print("Could not find any frames to process. Quitting")
                    break
        print("Done writing feeds. Quitting.")
        return None`


    


    The scenario is as follows : There are multiple video streams from a certain website at any time during the day, and the program containing these functions has to capture them as they get streamed. The memory available to this program is 6GB and there could be upto 3 streams running at any instant. Given below is the relevant main section of the script that uses the functions given above.

    


    


    


    `itftennis = VideoBot(siteurl)
outlist = []
t = Thread(target=itftennis.framewriter, args=(outlist,))
t.daemon = True
t.start()
tp = Thread(target=handleprocesstermination, args=())
tp.daemon = True
tp.start()
# Create a database connection and as associated cursor object. We will handle database operations from main thread only.
# DB statements removed from here...
feedidlist = []
vidsdict = {}
streampattern = re.compile("\?vid=(\d+)$")
while True:
    streampageurls = itftennis.checkforlivestream()
    if itftennis.DEBUG:
        print("Checking for new urls...")
        print(streampageurls.__len__())
    if streampageurls.__len__() > 0:
        argslist = []
        newurlscount = 0
        for streampageurl in streampageurls:
            newstream = False
            sps = re.search(streampattern, streampageurl)
            if sps:
                streamnum = sps.groups()[0]
                if streamnum not in vidsdict.keys(): # Check if this stream has already been processed.
                    vidsdict[streamnum] = 1
                    newstream = True
                else:
                    continue
            else:
                continue
            print("Detected new live stream... Getting it.")
            streamurl = itftennis.getstreamurlfrompage(streampageurl)
            print("Adding %s to list..."%streamurl)
            if streamurl is not None:
                # Now, get feed metadata...
                metadata = itftennis.getfeedmetadata(streampageurl)
                if metadata is None:
                    continue
                # lines to get matchescounter omitted here...
                if matchescounter >= itftennis.__class__.MAX_CONCURRENT_MATCHES:
                    break
                if newstream is True:
                    newurlscount += 1
                outfilename = time.strftime("./videodump/" + "%Y%m%d%H%M%S",time.localtime())+".avi"
                out = open(outfilename, "wb")
                outlist.append(out) # Save it in the list and take down the number for usage in framewriter
                outnum = outlist.__len__() - 1
                # Save metadata in DB
                # lines omitted here....
                argslist.append([streamurl, outnum, feedid, outfilename])   
            else:
                print("Couldn't get the stream url from page")
        if newurlscount > 0:
            for args in argslist:
                try:
                    p = Process(target=itftennis.capturelivestream, args=(args,))
                    p.start()
                    processeslist.append(p)
                    if itftennis.DEBUG:
                        print("Started process with args %s"%args)
                except:
                    print("Could not start process due to error: %s"%sys.exc_info()[1].__str__())
            print("Created processes, continuing now...")
            continue
    time.sleep(itftennis.livestreamcheckinterval)
t.join()
tp.join()
for out in outlist:
    out.close()`


    


    


    


    Please accept my apologies for swamping with this amount of code. I wanted to provide maximum context to my problem. I have removed the absolutely irrelevant DB statements, but apart from that this is what the code looks like.

    


    If you need to know anything else about the code, please let me know. What I would really like to know is if I am using the ffmpeg streams capturing statements correctly. The stream contains both video and audio components and I need to capture both. Hence I am making the following call :

    


    process = ffmpeg.input(streamurl).output('pipe:', pix_fmt='yuv420p', format='avi', vcodec='libx264', acodec='pcm_s16le', ac=channels, ar=samplerate, vsync=0, loglevel='quiet').run_async(pipe_stdout=True)


    


    Is this how it is supposed to be done ? More importantly, why do I keep getting the freezes in the output video. I have monitored the streams manually, and they are quite consistent. Frame losses do not happen when I view them on the website (at least it is not obviously noticeable). Also, I have run 'top' command on the host running the program. The CPU usage sometimes go over 100% (which, I came to understand from some answers on SO, is to be expected when running ffmpeg) but the memory usage usually remain below 30%. So what is the issue here. What do I need to do in order to fix this problem (other than learn more about how ffmpeg works).

    


    Thanks

    


    I have tried using various ffmpeg options (while trying to find similar issues that others encountered). I also tried running ffmpeg from command line for a limited period of time (11 mins), using the same options as used in the python code, and the captured content came out quite well. No freezes. No jumps in frames. But I need to use it in an automated way and there would be multiple streams at any time. Also, when I try playing the captured content using ffplay, I sometimes get the message "co located POCs unavailable" when these freezes happen. What does it mean ?