如何在Python3中用subprocess生成字符串输出及获取视频脚本文件名
在Python3中用subprocess获取ffmpeg分割视频的文件名
嘿,我明白你的需求了!你那个bash命令能完美提取ffmpeg分割后的视频文件名,但现在想把这个逻辑搬到Python3里用subprocess实现对吧?没问题,我来一步步给你拆解和实现。
原bash命令的核心逻辑
先理清你原来的命令做了什么:
- ffmpeg从指定流拉取视频,按2秒分割为mp4文件(你提到是5秒,只需修改
-segment_time参数即可) - 将ffmpeg的错误输出重定向到标准输出(
2>&1),以便捕获日志 - 用
grep过滤分割完成的日志行,再用gawk提取文件名 xargs确保每个文件名单独输出
Python实现方案
我们可以不用依赖外部的grep和gawk,直接用Python的正则表达式处理日志,更高效也更可控。以下是完整代码:
import subprocess import re def capture_and_get_filenames(segment_time="2"): # 构建ffmpeg命令列表(避免shell注入风险) ffmpeg_command = [ "ffmpeg", "-i", "http://0.0.0.0:8080/stream/video.mjpeg", "-vcodec", "copy", "-map", "0", "-f", "segment", "-segment_time", segment_time, # 可修改为你需要的5秒 "-loglevel", "40", "-segment_format", "mp4", "capture-%05d.mp4" ] # 启动子进程,合并stdout和stderr,开启行缓冲 with subprocess.Popen( ffmpeg_command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, bufsize=1, text=True ) as process: # 正则表达式匹配分割完成的日志行,提取文件名 filename_pattern = re.compile(r"segment:.+'(.+)' ended") collected_filenames = [] # 逐行读取输出,实时处理 for line in process.stdout: match_result = filename_pattern.search(line) if match_result: filename = match_result.group(1) collected_filenames.append(filename) print(filename) # 这里可以替换为你需要的处理逻辑,比如写入文件或发送通知 return collected_filenames if __name__ == "__main__": # 调用函数,可传入segment_time="5"改为5秒分割 generated_files = capture_and_get_filenames(segment_time="5") print("所有生成的文件名:", generated_files)
关键细节说明
- 命令列表形式:用列表传递命令参数,比直接传字符串更安全,避免shell注入问题
- 行缓冲配置:
bufsize=1开启行缓冲,确保能实时获取ffmpeg的日志输出(对应bash里的--line-buffered) - 输出合并:
stderr=subprocess.STDOUT把ffmpeg的错误输出合并到标准输出,这样能捕获到分割完成的日志 - 正则提取:用
re.compile预编译正则表达式,高效匹配包含文件名的日志行,提取出单引号中的文件名
内容的提问来源于stack exchange,提问作者Perl Deniel
相关产品推荐
相关产品推荐

