我有这个bash脚本用于批量转换某些mp4文件:
#!/bin/bash
ls dr*.mp4 | grep -v -E "\.[^\.]+\." | sed "s/.mp4//g" | while read f
do
TARGET="$f.ffmpeg.mp4"
if ! [ -f $TARGET ]
then
echo $TARGET
ffmpeg -nostdin -i $f.mp4 -s 320x180 -vc h264 -acodec copy -f mp4 -y $TARGET
fi
TARGET="$f.ffmpeg.flv"
if ! [ -f $TARGET ]
then
echo $TARGET
ffmpeg -nostdin -i $f.mp4 -s 320x180 -acodec copy -y $TARGET
fi
TARGET="$f.jpg"
if ! [ -f $TARGET ]
then
echo $TARGET
ffmpeg -nostdin -i $f.ffmpeg.mp4 -ss 0 -vframes 1 -f image2 $TARGET
fi
TARGET="$f.ffmpeg.ogv"
if ! [ -f $TARGET ]
then
echo $TARGET
ffmpeg -nostdin -i $f.mp4 -s 320x176 -ar 11025 -acodec libvorbis -y $TARGET
fi
done
它运行一次但是将输入文件名转换为4种不同的格式,但不循环到下一个输入文件名。 我试图改变各种转换的顺序,但脚本仍然只运行一次文件名。 我尝试使用-nostdin标志运行ffmpeg,但它说
"Unrecognized option 'nostdin'"
ffmpeg版本是ffmpeg版本0.10.6-6:0.10.6-0ubuntu0jon1~lucid2 - 我只是从http://ppa.launchpad.net/jon-severinsson/ffmpeg/ubuntu更新了ffmpeg软件包,但找不到更新的版本。基础系统是
Distributor ID: Ubuntu
Description: Ubuntu 10.04.1 LTS
Release: 10.04
Codename: lucid
答案 0 :(得分:3)
Don't parse the Output of ls
,您可以改用glob
bing。您还应该引用变量来说明文件名中可能的空格:
for input in dr*.mp4; do
output=${input%.mp4}.ffmpeg.mp4
[ -f "${output}" ] || ffmpeg -nostdin -i "${input}" -s 320x180 -vc h264 -acodec copy -f mp4 -y "${output}"
output=${input%.mp4}.ffmpeg.flv
[ -f "${output}" ] || ffmpeg -nostdin -i "${input}" -s 320x180 -acodec copy -y "${output}"
[...]
done
至于您获得的错误,根据-nostdin
ffmpeg 1.0
添加了ffmpeg
选项,因此您需要从0.1x
更新1.0.x
安装} {{1}}。
答案 1 :(得分:1)
我遇到了与while循环相同的问题,这是因为我在我的一个ffmpeg命令上缺少-nostdin
标志。我认为因为read
从标准输入中读取,其中有一个ffmpeg命令正在吃掉一些数据。就我而言,我的while循环就像:
find /tmp/dir -name '*-video' | while read -r file; do
# note: I forgot -nostdin on the ffmpeg command
ffmpeg -i "$file" -filter:v "amazing_filtergraph" out.mp4
done
我得到一个关于tmp/dir/1-video
未找到的错误(请注意路径中缺少开头的正斜杠)。我添加-nostdin
后,问题就解决了。
另请注意,在您的while循环中,您几乎always want to use the -r
flag会发生一些意外的换行延续。