请求排查:FFmpeg子进程STDOUT日志为空,无法捕获time=字段
问题原因及解决办法
核心问题
- FFmpeg的日志、进度输出默认走标准错误流(stderr),你的代码仅监听了标准输出流(stdout),因此无法捕获内容。
- 未显式指定FFmpeg日志级别,默认设置可能抑制了
time=这类进度信息的输出。 - 循环内重复打开文件、缓冲区机制可能导致内容无法实时写入日志。
修复后的代码
import ffmpeg import subprocess input_video = ffmpeg.input("test.mp4") audio_stream = input_video.audio video_stream = input_video.video # 添加日志级别参数,确保FFmpeg输出包含time=的进度信息 output_stream = ffmpeg.output( video_stream, audio_stream, 'test_COMPRESSED.mp4', crf=28, vcodec='libx264', vsync=2, v='info' # 指定日志级别为info,会输出详细进度日志 ) cmd = ' '.join(ffmpeg.compile(output_stream, overwrite_output=True)) # 合并stderr到stdout,开启行缓冲确保实时捕获输出 process = subprocess.Popen( cmd, shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, # 将FFmpeg的日志流合并到stdout text=True, bufsize=1, # 行缓冲模式 universal_newlines=True ) # 仅打开一次日志文件,避免重复IO操作 with open('log.txt', 'a') as log_file: while process.poll() is None: line = process.stdout.readline() if line: output_line = line.strip() log_file.write(output_line + '\n') log_file.flush() # 强制刷新缓冲区,确保内容实时写入文件
关键修改说明
v='info'参数:强制FFmpeg输出包含time=的进度日志,默认级别不会输出这类细节。stderr=subprocess.STDOUT:把FFmpeg的日志流(默认走stderr)合并到stdout,统一捕获。- 行缓冲+实时刷新:解决系统缓冲区导致的输出延迟、内容不写入问题。
- 外层打开日志文件:减少重复打开/关闭文件的IO开销,避免潜在写入异常。
内容的提问来源于stack exchange,提问作者anon
相关产品推荐
相关产品推荐

