Bash 如何使用shell脚本将多个文件从mp4转换为flv
假设我有一堆视频放在目录Bash 如何使用shell脚本将多个文件从mp4转换为flv,bash,shell,batch-file,ffmpeg,file-conversion,find,Bash,Shell,Batch File,Ffmpeg,File Conversion,Find,假设我有一堆视频放在目录/home/user/videos/waiting_conversion中,我如何使用cron运行类似于此的脚本,将每个视频批量转换为不同的格式 /bin/sh-c$'nice/usr/bin/ffmpeg-i\044'\'$'/home/user/videos/waiting\u conversion/video\u file\u 1.mp4'\'$'-s\044'\''$'480x320'\''$''''''''-vcodec libx264-acodec libmp
/home/user/videos/waiting_conversion
中,我如何使用cron运行类似于此的脚本,将每个视频批量转换为不同的格式
/bin/sh-c$'nice/usr/bin/ffmpeg-i\044'\'$'/home/user/videos/waiting\u conversion/video\u file\u 1.mp4'\'$'-s\044'\''$'480x320'\''$''''''''-vcodec libx264-acodec libmp3lame-ab\044'\''''$'64k'''''''$'-vpre fast-crf\044''''$'30'\'''''''$'''''''-ar\044''''''''$'''''''''''''''''''$'''-f\fv-220x50''''''''''''''''''''''''
上述脚本对于单个转换工作正常,但是:
它假定视频的名称是静态/已知的(批转换时不会出现这种情况)
它假设只有一个视频要转换(可能是也可能不是),即没有“循环”
它保留原始文件,而不是删除它(这是我希望发生的事情,以防止重复转换)
最终的问题是如何为/home/user/videos/waiting_conversion
中存在的每个视频运行该脚本,并将文件名作为变量传递?尝试执行以下操作:
#!/bin/bash
checkFile(){
[[ -s $1 && -f $1 ]] && return 0 || return 1
}
mp42flv(){
for arg; do
checkFile "$arg" || continue
/usr/bin/ffmpeg \
-i "$arg" \
-s '480x320' \
-vcodec libx264 \
-acodec libmp3lame \
-ab '64k' \
-vpre fast \
-crf '30' \
-ar '22050' \
-f flv \
-y "${arg%.*}.flv" ||
echo >&2 "Error treating $arg"
done
}
if [[ -t 0 ]]; then
mp42flv "$@"
else
while IFS= read -r a; do
checkFile "$a" || continue
mp42flv "$a"
done
fi
用法
- 使用glob
/script.sh/home/user/videos/converted/video\u文件*.mp4
- 文件名为
/script.sh/home/user/videos/converted/video\u file\u 01.mp4
- 通过管道
find/home/user/videos/converted-type f-name'*video*mp4'|/script.sh
(脚本检测STDIN的使用)
尝试这样做:
#!/bin/bash
checkFile(){
[[ -s $1 && -f $1 ]] && return 0 || return 1
}
mp42flv(){
for arg; do
checkFile "$arg" || continue
/usr/bin/ffmpeg \
-i "$arg" \
-s '480x320' \
-vcodec libx264 \
-acodec libmp3lame \
-ab '64k' \
-vpre fast \
-crf '30' \
-ar '22050' \
-f flv \
-y "${arg%.*}.flv" ||
echo >&2 "Error treating $arg"
done
}
if [[ -t 0 ]]; then
mp42flv "$@"
else
while IFS= read -r a; do
checkFile "$a" || continue
mp42flv "$a"
done
fi
用法
- 使用glob
/script.sh/home/user/videos/converted/video\u文件*.mp4
- 文件名为
/script.sh/home/user/videos/converted/video\u file\u 01.mp4
- 通过管道
find/home/user/videos/converted-type f-name'*video*mp4'|/script.sh
(脚本检测STDIN的使用)
在这种情况下,basename
命令是您的朋友。你可以使用这个模式
VIDEOS = /home/user/videos
for srcfile in ${VIDEOS}/awaiting_conversion/*.mp4 ; do
dstfile=${VIDEOS}/converted/`basename ${srcfile} .mp4`.flv
convertcommand ${srcfile} ${dstfile}
done
basename将目录从src文件中剥离,并将后缀也剥离。然后,您只需在新路径的前面加上新的后缀
自动删除旧文件时要小心。您可能可以检查一些内容,例如a)ffmpeg返回代码,b)dstfile的文件大小为某个大小或更大,或者c)让它自动为您播放新文件,以便您可以快速查看它,然后在质量不正确的情况下控制-c转换或其他内容。如果您只是想防止重复转换,最好将文件移动到另一个目录,然后在确认其全部工作正常后将其删除。在这种情况下,basename
命令是您的朋友。你可以使用这个模式
VIDEOS = /home/user/videos
for srcfile in ${VIDEOS}/awaiting_conversion/*.mp4 ; do
dstfile=${VIDEOS}/converted/`basename ${srcfile} .mp4`.flv
convertcommand ${srcfile} ${dstfile}
done
basename将目录从src文件中剥离,并将后缀也剥离。然后,您只需在新路径的前面加上新的后缀
自动删除旧文件时要小心。您可能可以检查一些内容,例如a)ffmpeg返回代码,b)dstfile的文件大小为某个大小或更大,或者c)让它自动为您播放新文件,以便您可以快速查看它,然后在质量不正确的情况下控制-c转换或其他内容。如果您只是想防止重复转换,最好将文件移动到另一个目录,然后在确认其全部正常工作后将其删除