在命令提示符

时间:2018-02-28 11:45:26

标签: python ffmpeg subprocess command-prompt

C:\Windows\System32> ffmpeg -i D:\devaraj\KPIX_test.ts -vf "blackframe" -an -f n
ull - 2>&1|find "Parsed" > D:\devaraj\info.txt

这很好用,写了文件info.txt

subprocess.call('ffmpeg' ,'-i', 'D:\devaraj\KPIX_test.ts' ,'-vf', '"blackframe"', 'D:\devaraj\KPIX_textfinal.mp3', '- 2>&1>','|','find', '"Parsed"', '>' ,'D:\devaraj\info.txt', 'shell=True')

给出错误缓冲区大小必须是整数

subprocess.call('ffmpeg -i D:\devaraj\KPIX_test.ts -vf "blackframe" -an -f n
ull - 2>&1|find "Parsed" > D:\devaraj\info.txt', shell=True) 

给出错误

'发现'不被视为内部或外部命令, 可操作程序或批处理文件。

任何帮助都会从心底深处感激

1 个答案:

答案 0 :(得分:0)

你应该使用原生的python方法来获得过滤的ffmpeg输出:

ffmpeg -i D:\devaraj\KPIX_test.ts -vf "blackframe" -an -f null - 2>&1|find "Parsed"

要做到这一点,你通常需要check_output但是已知这个特定的例子提供了所需的信息,但退出时返回非零(使用Python 3.5中的run将但是工作

所以我会改用Popen。它变为(如列表,没有所有重定向和过滤器),然后读取过程标准输出的所有输出:

p = subprocess.Popen(["ffmpeg","-i",r"D:\devaraj\KPIX_test.ts",
         "-vf","blackframe","-an","-f","null"],stdout=subprocess.PIPE,stderr=subprocess.STDOUT)
output = p.stdout.read()

您不需要shell=True,它会合并错误&输出output变量中的流。

现在output包含ffmpeg命令的输出。让它解码它(得到一个字符串)并拆分行,检查字符串是否在行中:

for line in output.decode().splitlines():  # python 2: output.splitlines()
   if "Parsed" in line:
       print(line.rstrip())  # or store it in a file, string, whatever

对于输出更多文本的进程,最好迭代p.stdout而不是读取全部内容(更少内存耗尽,允许实时回显到控制台)