乐闻世界logo
搜索文章和话题

Can ffmpeg show a progress bar?

6 个月前提问
5 个月前修改
浏览次数52

1个答案

1

ffmpeg 本身在命令行运行时,默认会在标准输出中显示一种形式的进度信息,但这并不是一个传统意义上的图形化进度条。它会显示当前的转码时间、速度、帧数等信息,但这些信息都是以文本形式呈现,而非一个可视化的进度条。

然而,可以通过一些额外的脚本或者程序来解析 ffmpeg 输出的这些文本信息,进而生成一个图形化的进度条。例如,可以使用 Python 或者 Shell 脚本来读取 ffmpeg 的输出,分析其中的进度数据,并使用这些数据来显示一个图形化进度条。

例子:

比如,您可以使用 Python 的库如 tqdm 来实现这一功能。下面是一个简单的示例代码,展示了如何使用 Python 来解析 ffmpeg 的输出,并显示一个进度条:

python
import subprocess import sys from tqdm import tqdm def run_ffmpeg(input_file, output_file): cmd = f"ffmpeg -i {input_file} -some_options {output_file}" process = subprocess.Popen( cmd, stderr=subprocess.PIPE, universal_newlines=True ) duration = None progress = tqdm(total=100, file=sys.stdout, desc='Processing', leave=True) while True: line = process.stderr.readline() if not line: break if "Duration" in line: duration_str = line.split(",")[0].split("Duration:")[1].strip() hours, minutes, seconds = map(float, duration_str.split(":")) duration = hours * 3600 + minutes * 60 + seconds if "time=" in line: time_str = line.split("time=")[1].split(" ")[0] hours, minutes, seconds = map(float, time_str.split(":")) current_time = hours * 3600 + minutes * 60 + seconds progress.update((current_time / duration) * 100 - progress.n) progress.close() # 示例使用 run_ffmpeg("input.mp4", "output.mp4")

在这段代码中,我们首先启动了一个 ffmpeg 的子进程,并监控它的标准错误输出(因为 ffmpeg 是将进度信息输出到 stderr 的)。我们解析输出中的总时长和当前进度时间,并使用这些信息来更新 tqdm 库提供的进度条。

当然,这只是一个基础的示例,根据具体的需求,您可能需要调整和优化这段代码。例如,更精确地处理时间格式,或者添加错误处理和异常处理等。

2024年6月29日 12:07 回复

你的答案