subprocess call ffmpeg (command line)

前端 未结 4 639
轻奢々
轻奢々 2020-12-31 11:16

I have been incorporating subprocess calls in my program. I have had no issues with subprocess calls for other commands, but I am having trouble getting the command line inp

相关标签:
4条回答
  • 2020-12-31 11:49

    When you use subprocess, your command must either be a string that looks exactly like what you would type on the command line (and you set shell=True), or a list where each command is an item in the list (and you take the default shell=False). In either case, you have to deal with the variable part of the string. For instance, the operating system has no idea what "%03d" is, you have to fill it in.

    I can't tell from your question exactly what the parameters are, but lets assume you want to convert frame 3, it would look something like this in a string:

    my_frame = 3
    subprocess.call(
        'ffmpeg -r 10 -i frame%03d.png -r ntsc movie%03d.mpg' % (my_frame, my_frame),
        shell=True)
    

    Its kinda subtle in this example, but that's risky. Suppose these things were in a directory whose name name had spaces (e.g., ./My Movies/Scary Movie). The shell would be confused by those spaces.

    So, you can put it into a list and avoid the problem

    my_frame = 3
    subprocess.call(['ffmpeg', '-r', '10', '-i', 'frame%03d.png' % my_frame,
        ['-r',  'ntsc', 'movie%03d.mpg' % my_frame])
    

    More typing, but safer.

    0 讨论(0)
  • 2020-12-31 11:49
    import shlex
    import pipes
    from subprocess import check_call
    
    command = 'ffmpeg -r 10 -i frame%03d.png -r ntsc ' + pipes.quote(out_movie)
    check_call(shlex.split(command))
    
    0 讨论(0)
  • 2020-12-31 12:06

    'ffmpeg -r 10 -i frame%03d.png -r ntsc movie.mpg' should be fine. OTOH, If you don't need the power of frame%03d.png, frame*.png is a bit simpler.

    If you want to "see the syntax for it if I replace 'movie.mpg' with a variable name", it looks something like this:

    cmd = 'ffmpeg -r 10 -i "frame%%03d.png" -r ntsc "%s"' % moviename

    We need to escape the % with an extra % to hide it from Python's % substitution machinery. I've also added double quotes " , to cope with the issues that tdelaney mentioned.

    0 讨论(0)
  • 2020-12-31 12:07

    I found this alternative, simple, answer to also work.

    subprocess.call('ffmpeg -r 10 -i frame%03d.png -r ntsc '+str(out_movie), shell=True)
    
    0 讨论(0)
提交回复
热议问题