首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在python、shell和stdout中使用ffmepg

在python、shell和stdout中使用ffmepg
EN

Stack Overflow用户
提问于 2014-08-27 20:11:18
回答 1查看 211关注 0票数 1

我想在python中运行以下行:

代码语言:javascript
复制
ffmpeg -i test.avi -ss 0 -r 25 -vframes 100 ./out/image-%3d.jpg 2>&1 | grep output

如果我在shell中直接运行它,它应该输出:

代码语言:javascript
复制
>>Output #0, image2, to './out/image-%3d.jpg':

但是,当我在python中这样做时:

代码语言:javascript
复制
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()

它的产出如下:

代码语言:javascript
复制
 ['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'

显然没有得到正确的论据

哪里出问题了?Thx

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-08-27 20:31:07

shell=True时,应该将命令作为字符串传递,而不是作为参数列表传递:

代码语言:javascript
复制
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=True依赖于用户输入,那么使用command就是command

如果希望使用shell=False,则需要使用两个subprocess.Popen调用的更换外壳管道,并将proc1.stdout连接到proc2.stdin

代码语言:javascript
复制
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()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/25536124

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档