Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

subprocess call ffmpeg (command line)

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 input

ffmpeg -r 10 -i frame%03d.png -r ntsc movie.mpg

To work inside a subprocess.call()

I tried the following with no success:

subprocess.call('ffmpeg -r 10 -i %s frame%03.d.png - r ntsc movie.mpg')

Any thoughts? Do I separate out different commands, do I specify string, integer etc. with %s, %d?

like image 890
user3295674 Avatar asked Sep 21 '14 02:09

user3295674


3 Answers

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.

like image 171
tdelaney Avatar answered Nov 07 '22 16:11

tdelaney


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)
like image 7
user3295674 Avatar answered Nov 07 '22 18:11

user3295674


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))
like image 2
jfs Avatar answered Nov 07 '22 17:11

jfs