You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

请求排查:FFmpeg子进程STDOUT日志为空,无法捕获time=字段

问题原因及解决办法

核心问题

  1. FFmpeg的日志、进度输出默认走标准错误流(stderr),你的代码仅监听了标准输出流(stdout),因此无法捕获内容。
  2. 未显式指定FFmpeg日志级别,默认设置可能抑制了time=这类进度信息的输出。
  3. 循环内重复打开文件、缓冲区机制可能导致内容无法实时写入日志。

修复后的代码

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:07:04