在bash管道中ffmpeg

时间:2013-10-26 12:44:55

标签: bash ffmpeg

我有一个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管吗?

3 个答案:

答案 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