使用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
相关产品推荐
相关产品推荐

