在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