我有以下代码

import subprocess
import re
from itertools import *

command = ['ffprobe', '-i', '/media/some_file.mp4']
p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
text = p.stderr.read()
retcode = p.wait()
text = text.decode('utf-8')
p = re.compile("Duration(.*)")

num = 0 #for debugging
for line in iter(text.splitlines()):
    print(str(num) + line) #for debugging
    m = p.match(str(line))
    if m != None:
        print(m.group(1))

我看一下输出时说,"持续时间"一条线捕获,但是永远不会达到 print(m.group(1))。如果更改为"持续时间 blahblah"的硬编码字符串的文本变量得到"blahblah",这是我的期望。它似乎正则表达式不能识别来自 stderr 返回的文本。如何获取成可识别并匹配正则表达式的格式的文本?


我已经想出了下面的解决方案,它应该帮助任何其他尝试捕获从使用 python 的 ffmpeg 的持续时间

import subprocess
import re

command = ['ffprobe', '-i', '/media/some_file.mp4']
p = subprocess.Popen(command, stderr=subprocess.PIPE)
text = p.stderr.read()
retcode = p.wait()
text = text.decode('utf-8')
p = re.compile(".*Duration:s([0-9:.]*),", re.MULTILINE|re.DOTALL)
m = p.match(text)
print(m.group(1))
2014-12-31 00:00:00
问题评论:

回答:

p = re.compile(r".*?Duration(.*)")

尝试此操作。虽然可能有一些duration之前match从头开始.

尽管只是意识到它,谢谢您

它应该可以使用贪婪此处相反。

@JesseAdam 如果您可以在此处发布stderr很易于调试

请输入您的翻译

Python subprocess: capture output of ffmpeg and run regular expression against it

确认取消