2

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 パイプに影響しますか?

4

3 に答える 3

3

警告: を使用ffmpegしたことはありませんが、プログラムに関する他の質問に取り組んでいると、 のようsshに、ffmpeg実際には使用せずに標準入力から読み取るため、 の最初の呼び出しは、最初の取得Convert後に残りのファイル リストを消費しているようです。readライン。これを試して

Convert() {
    ffmpeg -i "$1" -vcodec mpe4 -sameq -acodec aac \
           -strict experimental "$1.mp4" < /dev/null
}

このようにして、コマンドffmpeg用の標準入力からデータを「ハイジャック」しません。read

于 2013-10-26T14:24:24.500 に答える
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"
while read -r || [[ -n $REPLY ]]; do ...; done < file # Same as before but also deal with files that doesn't have EOF.

# 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
于 2013-10-26T13:36:09.277 に答える
1

キス!=)

convert() {
    ffmpeg -i "$1" \
           -vcodec mpe4 \
           -sameq -acodec aac \
           -strict experimental "${1%.*}.mp4"
}

while read line; do
    convert "$line"
done < list.txt
于 2013-10-26T15:28:21.797 に答える