我正在尝试执行批处理操作,以使用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
任何人和所有建议都表示赞赏!
非常感谢
答案 0 :(得分:1)
将IFS=“,”
替换为IFS=","
。