在bashpipe道中的ffmpeg
我有一个rmvb文件path列表,并希望将此文件转换为mp4文件。 所以我希望使用bashpipe道来处理它。 代码是
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
但是,它只处理第一个文件和pipe道退出。
那么,ffmpeg会影响bashpipe道吗?
警告:我从来没有使用过ffmpeg
,但是在处理与程序有关的其他问题时,看起来和ssh
一样, ffmpeg
从标准input中读取而没有真正使用它,所以第一次调用Convert
就是占用文件列表的其余部分read
后得到第一行。 尝试这个
Convert() { ffmpeg -i "$1" -vcodec mpe4 -sameq -acodec aac \ -strict experimental "$1.mp4" < /dev/null }
这样, ffmpeg
不会“劫持”来自用于read
命令的标准input的数据。
[…]
for i in `cat list.txt`
切勿使用以下语法:
for i in $(command); do ...; done # or for i in `command`; do ...; done
这个语法通过单词读取命令的输出,而不是逐行读取,这往往会产生意想不到的问题(例如,当行包含一些空格,以及当你想读取一行像一个项目)。
总有一个更聪明的解决scheme:
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" # ...
我写了一个关于这个主题和经常性错误的更多细节的课程,但用法语,不幸:)
要回答原来的问题,你可以使用像这样的东西:
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
亲爱的 ! =)
convert() { ffmpeg -i "$1" \ -vcodec mpe4 \ -sameq -acodec aac \ -strict experimental "${1%.*}.mp4" } while read line; do convert "$line" done < list.txt