我有一个rmvb文件路径列表,并希望将此文件转换为mp4文件。所以我希望使用bash管道来处理它。代码是
Convert() {
ffmpeg -i "$1" -vcodec mpeg4 -sameq -acodec aac -strict experimental "$1.mp4"
}
Convert_loop(){
while read line; do
Convert $line
done
}
cat list.txt | Convert_loop
但是,它只处理第一个文件并退出管道。
那么,ffmpeg会影响bash管吗?
答案 0 :(得分:3)
[...]
for i in `cat list.txt`
永远不要使用这种语法:
for i in $(command); do ...; done # or
for i in `command`; do ...; done
此语法逐字逐行读取命令的输出,而不是逐行读取,这通常会产生意外问题(例如,当行包含一些空格时,以及当您想要读取像项目一样的行时)。
总有一个更智能的解决方案:
command|while read -r; do ...; done # better general case to read command output in a loop
while read -r; do ...; done <<< "$(command)" # alternative to the previous solution
while read -r; do ...; done < <(command) # another alternative to the previous solution
for i in $DIR/*; do ...; done # instead of "for i in $(ls $DIR); do ...; done
for i in {1..10}; do ...; done # instead of "for i in $(seq 1 10); do ...; done
for (( i=1 ; i<=10 ; i++ )); do ...; done # such that the previous command
while read -r; do ...; done < file # instead of "cat file|while read -r; do ...; done"
# dealing with xargs or find -exec sometimes...
# ...
我写了一门课程,详细介绍了这个主题和反复出现的错误,但不幸的是,用法语:)
要回答原始问题,您可以使用以下内容:
Convert() {
ffmpeg -i “$1” -vcodec mpe4 -sameq -acodec aac -strict experimental “$1.mp4”
}
Convert_loop(){
while read -r; do
Convert $REPLY
done < $1
}
Convert_loop list.txt
答案 1 :(得分:3)
警告:我从未使用ffmpeg
,但在处理有关该程序的其他问题时,似乎与ssh
一样,ffmpeg
从标准输入中读取而未实际使用它,因此Convert
获取第一行后,对read
的第一次调用正在消耗文件列表的其余部分。试试这个
Convert() {
ffmpeg -i "$1" -vcodec mpe4 -sameq -acodec aac \
-strict experimental "$1.mp4" < /dev/null
}
这样,ffmpeg
不会“劫持”用于read
命令的标准输入中的数据。
答案 2 :(得分:1)
KISS! =)
convert() {
ffmpeg -i "$1" \
-vcodec mpe4 \
-sameq -acodec aac \
-strict experimental "${1%.*}.mp4"
}
while read line; do
convert "$line"
done < list.txt