Recherche avancée

Médias (0)

Mot : - Tags -/tags

Aucun média correspondant à vos critères n’est disponible sur le site.

Autres articles (43)

  • Use, discuss, criticize

    13 avril 2011, par

    Talk to people directly involved in MediaSPIP’s development, or to people around you who could use MediaSPIP to share, enhance or develop their creative projects.
    The bigger the community, the more MediaSPIP’s potential will be explored and the faster the software will evolve.
    A discussion list is available for all exchanges between users.

  • Supporting all media types

    13 avril 2011, par

    Unlike most software and media-sharing platforms, MediaSPIP aims to manage as many different media types as possible. The following are just a few examples from an ever-expanding list of supported formats : images : png, gif, jpg, bmp and more audio : MP3, Ogg, Wav and more video : AVI, MP4, OGV, mpg, mov, wmv and more text, code and other data : OpenOffice, Microsoft Office (Word, PowerPoint, Excel), web (html, CSS), LaTeX, Google Earth and (...)

  • Les statuts des instances de mutualisation

    13 mars 2010, par

    Pour des raisons de compatibilité générale du plugin de gestion de mutualisations avec les fonctions originales de SPIP, les statuts des instances sont les mêmes que pour tout autre objets (articles...), seuls leurs noms dans l’interface change quelque peu.
    Les différents statuts possibles sont : prepa (demandé) qui correspond à une instance demandée par un utilisateur. Si le site a déjà été créé par le passé, il est passé en mode désactivé. publie (validé) qui correspond à une instance validée par un (...)

Sur d’autres sites (8480)

  • Concatenate list of streams with ffmpeg

    16 novembre 2019, par oioioi

    I’d like to write python code, automatically rearranging the scenes of a video. How do I use ffmpeg-python to concatenate a list of n streams/scenes ? What is the easiest way to merge those scenes with their audio counterpart ?
    Unfortunately, I couldn’t figure out how to do it properly.

    The status quo :

    import os

    import scenedetect
    from scenedetect.video_manager import VideoManager
    from scenedetect.scene_manager import SceneManager
    from scenedetect.frame_timecode import FrameTimecode
    from scenedetect.stats_manager import StatsManager
    from scenedetect.detectors import ContentDetector

    import ffmpeg

    STATS_FILE_PATH = 'stats.csv'

    def main():

       for root, dirs, files in os.walk('material'):
           for file in files:
               file = os.path.join(root, file)
               print(file)
               video_manager = VideoManager([file])
               stats_manager = StatsManager()
               scene_manager = SceneManager(stats_manager)
               scene_manager.add_detector(ContentDetector())
               base_timecode = video_manager.get_base_timecode()
               end_timecode = video_manager.get_duration()

               start_time = base_timecode
               end_time = base_timecode + 100.0
               #end_time = end_timecode[2]

               video_manager.set_duration(start_time=start_time, end_time=end_time)
               video_manager.set_downscale_factor()
               video_manager.start()
               scene_manager.detect_scenes(frame_source=video_manager)

               scene_list = scene_manager.get_scene_list(base_timecode)

               print('List of scenes obtained:')
               for i, scene in enumerate(scene_list):
                   print('    Scene %2d: Start %s / Frame %d, End %s / Frame %d' % (
                       i+1,
                       scene[0].get_timecode(), scene[0].get_frames(),
                       scene[1].get_timecode(), scene[1].get_frames(),))

                   start = scene[0].get_frames()
                   end = scene[1].get_frames()

                   print(start)
                   print(end)

                   (
                       ffmpeg
                       .input(file)
                       .trim(start_frame=start, end_frame=end)
                       .setpts ('PTS-STARTPTS')
                       .output('scene %d.mp4' % (i+1))
                       .run()
                   )

               if stats_manager.is_save_required():
                   with open(STATS_FILE_PATH, 'w') as stats_file:
                       stats_manager.save_to_csv(stats_file, base_timecode)

    if __name__ == "__main__":
       main()
  • Combine mp4 files by order based on number from filenames in Python

    14 décembre 2022, par ah bon

    I try to merge lots of mp4 files from a directory test into one output.mp4 using ffmpeg in Python.

    


    import os

path = '/Users/x/Documents/test'

for filename in os.listdir(path):
    if filename.endswith(".mp4"):
        print(filename)


    


    Output :

    


    4. 04-unix,minix,Linux.mp4
6. 05-Linux.mp4
7. 06-ls.mp4
5. 04-unix.mp4
9. 08-command.mp4
1. 01-intro.mp4
3. 03-os.mp4
8. 07-minux.mp4
2. 02-os.mp4
10. 09-help.mp4


    


    I have tried with the solution below from the reference here : ffmpy concatenate multiple files with a file list

    


    import os
import subprocess
import time


base_dir = "/path/to/the/files"
video_files = "video_list.txt"
output_file = "output.avi"

# where to seek the files
file_list = open(video_files, "w")

# remove prior output
try:
    os.remove(output_file)
except OSError:
    pass

# scan for the video files
start = time.time()
for root, dirs, files in os.walk(base_dir):
    for video in files:
        if video.endswith(".avi"):
            file_list.write("file './%s'\n" % video)
file_list.close()

# merge the video files
cmd = ["ffmpeg",
       "-f",
       "concat",
       "-safe",
       "0",
       "-loglevel",
       "quiet",
       "-i",
       "%s" % video_files,
       "-c",
       "copy",
       "%s" % output_file
       ]

p = subprocess.Popen(cmd, stdin=subprocess.PIPE)

fout = p.stdin
fout.close()
p.wait()

print(p.returncode)
if p.returncode != 0:
    raise subprocess.CalledProcessError(p.returncode, cmd)

end = time.time()
print("Merging the files took", end - start, "seconds.")


    


    I have merged them and get an output.mp4 but the files are not merged in order with the first number split by point (1, 2, 3, ...) : which I can get by filename.split(".")[0] :

    


    1. 01-intro.mp4
2. 02-os.mp4
3. 03-os.mp4
4. 04-unix,minix,Linux.mp4
5. 04-unix.mp4
6. 05-Linux.mp4
7. 06-ls.mp4
8. 07-minux.mp4
9. 08-command.mp4
10. 09-help.mp4


    


    How can I merge them correctly and concisely in Python ? Thanks.

    


  • Python script fails execution on subprocess.run() call only when called from context menu

    10 mars 2019, par Jesse McDonald

    I have a python script that I want to call from the windows file browser context menu (https://www.howtogeek.com/107965/how-to-add-any-application-shortcut-to-windows-explorers-context-menu/)

    I am currently debugging calling it from the non-specific context (HKEY_CLASSES_ROOT\Directory\Background\shell) with the command "python "D :\toolbox\mineAudio.py" 0"
    (note python3 is on the path as python and the script is at D :\toolbox\mineAudio.py)

    When I call the script from cmd it works as expected with that command, and when I make debug modifications to the script (adding os.system("pause") to random lines) I can verify it is running correctly up to the point it hits the line meta=cmd(['ffmpeg','-i',target]) (line 46) where it instantly and silently fails (note ffmpeg is also on the path)

    EDIT : it actually gets as far as line 15

    result = subprocess.run(command, stdout=subprocess.PIPE,stderr=subprocess.PIPE,startupinfo=startupinfo)

    I cant figure out why the program is failing there as that line works fine everywhere else I have tested the script from other than the context menu.

    Here is the full script if you want to brows through it

    import subprocess
    import os
    import sys
    from sys import argv
    from tree import tree
    #for command line use:
    #mineAudo.py [prompt=1] [dir=cwd]
    #first arg prompt will prompt user for dir if 1, otherwise it wont
    #second arg is the directory to use, if specified this will override prompt, if not and prompt=0, current working dir is used
    def cmd(command):
       startupinfo = subprocess.STARTUPINFO()
       startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
       startupinfo.wShowWindow = subprocess.SW_HIDE
       result = subprocess.run(command, stdout=subprocess.PIPE,stderr=subprocess.PIPE,startupinfo=startupinfo)
       return result.stderr.decode("utf-8")
    def stripStreams(meta):
       i=1;
       lines=[]
       while i>0 :
           i=meta.find("Stream",i+1)
           lineEnd=meta.find("\n",i)
           lines.append(meta[i:lineEnd])

       return lines
    def mineAudio(streams):
       ret=[]
       for stream in streams:
           if "Audio:" in stream:
               start =stream.find("#")+1
               end=stream.find("(",start)
               ret.append(stream[start:end])
       return ret
    def convDir(dirTarget):
       targets=tree(dirTarget)
       convList(targets,dirTarget)

    def convList(targets,dirTarget):
           print(targets)
           #target="2018-05-31 06-16-39.mp4"
           i=0
           for target in targets:
               i+=1

               if(target[target.rfind("."):]==".mp4"):
                   print("("+str(i)+"/"+str(len(targets))+") starting file "+target)
                   meta=cmd(['ffmpeg','-i',target])
                   streams=stripStreams(meta)
                   streams=mineAudio(streams)
                   count=0
                   output=target[target.rfind("/")+1:target.rfind(".")]
                   file=target[target.rfind("/")+1:]
                   #print (output)
                   try:
                       os.mkdir(dirTarget+"\\"+output)
                   except:
                       pass
                   for s in streams:
                       print("converting track "+str(count+1)+" of "+str(len(streams)));
                       count+=1
                       cmd("ffmpeg -i \""+target+"\" -vn -sn -c:a mp3 -ab 192k -map "+s+" \""+dirTarget+"\\"+output+"\\"+output+" Track "+str(count)+".mp3\"")
                   print("moving "+target+" to "+dirTarget+"\\"+output+"\\"+file)
                   os.rename(target,dirTarget+"\\"+output+"\\"+file)
                   print("Finished file "+target)
               else:
                   print("("+str(i)+"/"+str(len(targets))+") skiping non mp4 file "+target)

    def prompt():
       while True:
           dirTarget=input("input target dir: ")
           convDir(dirTarget)



    if __name__ == "__main__":
           sys.setrecursionlimit(2000)    
           if len(argv)>2:
                   if os.path.isdir(argv[2]):
                       convDir(argv[2])
                   else:
                       convList([argv[2]],os.path.dirname(argv[2]))
           elif(len(argv)>1):
                   if int(argv[1])==1:
                       prompt()
                   else:
                       convDir(os.getcwd())
           else:
               prompt()


           os.system("pause")

    Note that I am not married to this particular implementation, any implementation with the same effect (extracting the .mp3 tracks from an .mp4 file automatically) would be fine too

    also, here is the file Tree

    #Returns the paths of all files in a directory and all sub directories relative to start directory
    import os
    def tree(directory,target="f"):
       paths=[]
       for currentDir,dirs,files in os.walk(directory):
           if target=="f":
               for file in files:
                   paths.append(currentDir+"/"+file)
           if target=="d":
               #paths.append(currentDir)
               for dir in dirs:
                   paths.append(currentDir+"/"+dir)
       for i in range(len(paths)):
           paths[i]=paths[i].replace("\\","/")
       return paths

    Can anyone help me get this working ?

    Edit :
    here is a shorter example code that crashes in the same way (still uses ffmpeg though)

    import subprocess
    import os
    def cmd(command):
       startupinfo = subprocess.STARTUPINFO()
       startupinfo.dwFlags |= subprocess.STARTF_USESHOWWINDOW
       startupinfo.wShowWindow = subprocess.SW_HIDE

       result = subprocess.run(command,stdin=subprocess.DEVNULL, stdout=subprocess.PIPE,stderr=subprocess.PIPE,startupinfo=startupinfo)

       return result.stderr.decode("utf-8")


    os.system("pause")

    out=cmd(['ffmpeg','-i','D:\\ffmpeg test\\test\\2018-05-31 06-16-39\\2018-05-31 06-16-39.mp4'])
    print(out)
    os.system("pause")

    (note the file is hard coded, program output should be
    enter image description here )