【发布时间】:2018-09-26 23:25:27
【问题描述】:
我正在尝试使用 bash 脚本执行批处理操作以从多个视频文件中提取特定帧并保存为 PNG。我希望通过在 bash 脚本中使用 ffmpeg 来做到这一点,并辅以一个 csv 文件,该文件包含输入视频的名称、要从输入视频中提取的特定帧号以及 PNG 文件的输出名称。
视频文件和 csv 文件都将放在同一个文件夹中。如果需要,脚本也可以放在那里。
我的 csv - 称为“select.csv” - 当前采用以下格式(输入、输出、帧):
mad0.m4v,mad0_out1,9950
mad0.m4v,mad0_out2,4500
mad1.m4v,mad1_out1,3200
我当前的脚本 - 称为“frame.sh” - 采用以下形式:
#!/bin/bash
OLDIFS=$IFS
IFS=“,”
SDIR=/Users/myuser/Desktop/f-input/
cd $SDIR;
while read input output frame
do
echo "$input"
echo "$output"
echo "$frame"
input1=$input
output1=$output
frame1=$frame
ffmpeg -i "$input1" -vf select='eq(n\,'"$frame1"')' -vsync 0
"$output1".png
done < $1
IFS=$OLDIFS
这应该允许我运行./frame.sh select.csv,然后处理我桌面上“f-input”文件夹中的所有相关文件并提取指定的帧。
我最终回显了从 csv 读取的变量,以便它们实际上可以用作变量并在 ffmpeg 命令中循环,因为仅在读取操作之后直接使用 $input、$frame 和 $output 执行 ffmpeg 命令在 csv 的第一行完成了该过程,没有进一步进展。
基本上我希望以下内容真正循环遍历每个 csv 条目,而不仅仅是第一行:
#!/bin/bash
OLDIFS=$IFS
IFS=“,”
SDIR=/Users/myuser/Desktop/f-input/
cd $SDIR;
while read input output frame
do
ffmpeg -i "$input" -vf select='eq(n\,'"$frame"')' -vsync 0 "$output".png
done < $1
IFS=$OLDIFS
感谢所有建议!
非常感谢
【问题讨论】:
-
同意 dbl-quote 解决方案。你在路上,继续!检查您在shellcheck.net 的代码,以加快您的开发周期。祝你好运!