2014-08-27 29 views
1

我想运行在python下面一行:使用蟒蛇,贝壳ffmepg和stdout

ffmpeg -i test.avi -ss 0 -r 25 -vframes 100 ./out/image-%3d.jpg 2>&1 | grep output 

它应该,如果我直接运行它的外壳,输出:

>>Output #0, image2, to './out/image-%3d.jpg': 

然而,我这样做的蟒蛇时:

command = 'ffmpeg -i '+video_name+' -ss '+str(T) + ' -r '+str(25) + ' -vframes '+str(N)+' '+out_dir+'/image-%3d.jpg 2>&1 | grep output' 
     argx = shlex.split(command) 
     print argx 
     proc = subprocess.Popen(argx,stdout=subprocess.PIPE,shell = True) 
     (out,err) = proc.communicate() 

它输出这样的:

['ffmpeg', '-i', 'test.avi', '-ss', '0', '-r', '25', '-vframes', '100', './out/image-%3d.jpg', '2>&1', '|', 'grep', 'output'] 
ffmpeg version 1.2.6-7:1.2.6-1~trusty1 Copyright (c) 2000-2014 the FFmpeg developers 
    built on Apr 26 2014 18:52:58 with gcc 4.8 (Ubuntu 4.8.2-19ubuntu1) 
    configuration: --arch=amd64 --disable-stripping --enable-avresample --enable-pthreads --enable-runtime-cpudetect --extra-version='7:1.2.6-1~trusty1' --libdir=/usr/lib/x86_64-linux-gnu --prefix=/usr --enable-bzlib --enable-libdc1394 --enable-libfreetype --enable-frei0r --enable-gnutls --enable-libgsm --enable-libmp3lame --enable-librtmp --enable-libopencv --enable-libopenjpeg --enable-libopus --enable-libpulse --enable-libschroedinger --enable-libspeex --enable-libtheora --enable-vaapi --enable-vdpau --enable-libvorbis --enable-libvpx --enable-zlib --enable-gpl --enable-postproc --enable-libcdio --enable-x11grab --enable-libx264 --shlibdir=/usr/lib/x86_64-linux-gnu --enable-shared --disable-static 
    libavutil  52. 18.100/52. 18.100 
    libavcodec  54. 92.100/54. 92.100 
    libavformat 54. 63.104/54. 63.104 
    libavdevice 53. 5.103/53. 5.103 
    libavfilter  3. 42.103/3. 42.103 
    libswscale  2. 2.100/2. 2.100 
    libswresample 0. 17.102/0. 17.102 
    libpostproc 52. 2.100/52. 2.100 
Hyper fast Audio and Video encoder 
usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... 

Use -h to get full help or, even better, run 'man ffmpeg' 

其中显然的ffmpeg没有得到适当的参数

是哪里不对? THX

回答

2

shell=True,你应该通过命令作为一个字符串,而不是参数列表:

command = 'ffmpeg -i '+video_name+' -ss '+str(T) + ' -r '+str(25) + ' -vframes '+str(N)+' '+out_dir+'/image-%3d.jpg 2>&1 | grep output' 
proc = subprocess.Popen(command, stdout=subprocess.PIPE, shell=True) 
out, err = proc.communicate() 

注意,使用shell=Truesecurity risk如果command取决于用户输入。


如果您希望使用shell=False,那么你就需要replace the shell pipeline有两个subprocess.Popen电话,与proc1.stdout连接到proc2.stdin

import subprocess 
PIPE = subprocess.PIPE 
filename = out_dir+'/image-%3d.jpg' 

args = ['ffmpeg', '-i', video_name, '-ss', T, '-r', 25, '-vframes', N, filename] 
proc1 = subprocess.Popen(args, stdout=PIPE, stderr=PIPE, shell=False) 
proc2 = subprocess.Popen(['grep', 'output'), stdin=proc1.stdout, stdout=PIPE, stderr=PIPE) 
proc1.stdout.close() # Allow proc1 to receive a SIGPIPE if proc2 exits. 
out, err = proc2.communicate()