使用ffmpeg获取视频分辨率时遇TypeError错误求助
问题分析与解决
这个错误的核心原因很明确:你用字符串类型的正则表达式去匹配了bytes类型的数据。
为什么会出现这个问题?
当你调用in_pipe.stderr.readlines()时,返回的每一行line都是bytes对象(而非Python的字符串str),但re.match()方法只能接收字符串作为匹配目标,直接用字符串正则去匹配bytes就会抛出TypeError: cannot use a string pattern on a bytes-like object这个错误。
另外你的代码还有两个小问题需要一起修正:
- 没有导入
re模块,运行时会先报NameError: name 're' is not defined - ffmpeg命令里的引号写法有问题,直接在参数里加
\"%s\"会导致路径被多套一层引号,反而引发ffmpeg识别错误,正确的做法是直接传入路径参数,不需要手动加引号。
修复后的完整代码
import re from subprocess import Popen, PIPE def getWH(pathvideofile): # 移除手动添加的引号,直接传入路径参数 in_pipe = Popen(["ffmpeg", "-i", pathvideofile], stderr=PIPE) lines = in_pipe.stderr.readlines() for line in lines: # 将bytes对象解码为字符串,指定编码(通常用utf-8,遇到特殊字符可以试试gbk) line_str = line.decode('utf-8', errors='ignore') rx = re.compile(r'.+Video.+, (\d{2,4})x(\d{2,4}).+') m = rx.match(line_str) if m is not None: w = int(m.group(1)) h = int(m.group(2)) return w, h
关键修改点说明
- 添加了
import re语句,解决模块未导入的问题 - 去掉了ffmpeg参数里的手动引号,避免路径解析错误
- 增加了
line.decode('utf-8', errors='ignore'),把bytes类型的行数据转换成字符串,errors='ignore'可以忽略解码时遇到的特殊字符,避免解码失败中断程序 - 正则表达式前加了
r前缀,变成原始字符串,避免转义字符的干扰
内容的提问来源于stack exchange,提问作者MertTheGreat
相关产品推荐
相关产品推荐

