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

使用ffmpeg-python提取指定时段每秒一帧生成视频报错求助

问题与解决思路

需求与问题

需要将视频从第s秒修剪到第e秒,提取每秒一帧(原视频为30fps)并保存为视频文件。当前使用ffmpeg-python编写的代码在添加select滤镜后报错,移除滤镜可正常运行但无法实现抽帧需求。

当前代码

(
    in_file
    .trim(start=s, end=e)
    .filter("select", "not(mod(n\,30))")
    .setpts("PTS-STARTPTS")
    .output("test.mp4", loglevel="quiet")
    .overwrite_output()
    .run()
)

报错信息

Traceback (most recent call last):
  File "/home/***/Videos/test.py", line 26, in <module>
    .run()
  File "/home/***/.local/lib/python3.10/site-packages/ffmpeg/_run.py", line 325, in run
    raise Error('ffmpeg', out, err)
ffmpeg._run.Error: ffmpeg error (see stderr output for detail)

解决思路

1. 修正滤镜表达式转义问题

Python字符串中无需手动转义逗号,你写的not(mod(n\,30))里的\,是多余的,应改为not(mod(n,30))。ffmpeg-python会自动处理参数传递,额外转义反而会导致ffmpeg无法解析表达式。

2. 显式指定输出帧率

抽帧后输出视频需要设置帧率为1fps,否则ffmpeg会沿用原视频30fps的参数,导致输出视频播放速度异常。在output方法中添加r=1参数。

3. 关闭静默日志排查问题

移除loglevel="quiet",可以查看ffmpeg输出的详细错误日志,快速定位其他潜在问题。


修正后代码

(
    in_file
    .trim(start=s, end=e)
    .filter("select", "not(mod(n,30))")
    .setpts("PTS-STARTPTS")
    .output("test.mp4", r=1)
    .overwrite_output()
    .run()
)

更简洁的替代方案

直接使用fps滤镜抽取每秒一帧,无需计算帧序号,逻辑更直观:

(
    in_file
    .trim(start=s, end=e)
    .filter("fps", fps=1)
    .setpts("PTS-STARTPTS")
    .output("test.mp4")
    .overwrite_output()
    .run()
)

内容的提问来源于stack exchange,提问作者Reza Kermani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 16:51:37