如何通过.sh脚本调用ffmpeg提取视频帧并设置每秒抽帧数
修改方法
要实现每秒提取2帧的需求,只需要给ffmpeg增加帧率控制滤镜即可,同时你原脚本里存在一处多余分号的语法错误,一并修正即可。
核心修改点
- 删除
video_frames_folder_path赋值行末尾多余的;;,否则shell运行时会报语法错误 - 在ffmpeg命令中添加
-vf fps=2参数,该参数会控制ffmpeg均匀采样,每秒输出2帧图像 - (可选优化)给jpg输出增加
-q:v 2参数,控制导出帧的画质,数值范围2-31,数值越小画质越高、文件体积越大 - (可选优化)将原脚本的
mkdir改为mkdir -p,目标文件夹已存在时不会报错,重复运行脚本更稳定
修改后的完整脚本
#!/bin/bash frames_folder_path=./data videos_folder_path=./videos ext=mp4 mkdir -p "${frames_folder_path}" for video_file_path in "${videos_folder_path}"/*."${ext}"; do slash_and_video_file_name="${video_file_path:${#videos_folder_path}}" slash_and_video_file_name_without_extension="${slash_and_video_file_name%.${ext}}" video_frames_folder_path="${frames_folder_path}${slash_and_video_file_name_without_extension}" mkdir -p "${video_frames_folder_path}" ffmpeg -i "${video_file_path}" -vf fps=2 -q:v 2 "${video_frames_folder_path}/%d.jpg" done
参数说明
- 后续如果需要调整抽帧密度,只需要修改
fps=后面的数值即可:比如需要每秒抽1帧就写fps=1,每秒抽10帧就写fps=10 - 你之前遇到的"默认按30fps抽帧"本质是原视频本身帧率为30fps,不加帧率控制参数时ffmpeg会导出视频的全部帧,并不是默认固定30fps输出
内容的提问来源于stack exchange,提问作者user19388868
相关产品推荐
相关产品推荐

