Linux
使用嵌套的while循環進行ffmpeg處理
我正在嘗試使用
ffmpeg
’ssignature
函式對文本文件中列出的數千個影片文件進行重複分析vids.list
。我需要擁有它,以便將每個文件與所有其他文件進行比較,然後刪除列表的該行。以下是我到目前為止所擁有的:#!/bin/bash home="/home/user/" declare -i lineno=0 while IFS="" read -r i; do /usr/bin/ffmpeg -hide_banner -nostats -i "${i}" -i "$(while IFS="" read -r f; do echo "${f}" done < ${home}/vids.list)" \ -filter_complex signature=detectmode=full:nb_inputs=2 -f null - < /dev/null let ++lineno sed -i "1 d" ${home}/vids.list done < vids.list 2> ${home}/out.log
ffmpeg
正在輸出“太多參數”,因為內部 while 循環將所有文件名轉儲到第二個-i
. 我不確定我是否需要wait
某個地方(或格式化選項)來保持循環打開,而頂部的 while 循環完成。為了澄清起見,我需要循環從帶有路徑的文本文件的第 1 行開始,將該文件與第 2、3、4…2000 行(或其他)中的文件進行比較,刪除第 1 行,然後繼續。
迴避確切的命令,我認為您想要這樣的東西(帶有明顯的四行輸入)?
$ bash looploop.sh run ffmpeg with arguments 'alpha' and 'beta' run ffmpeg with arguments 'alpha' and 'charlie' run ffmpeg with arguments 'alpha' and 'delta' run ffmpeg with arguments 'beta' and 'charlie' run ffmpeg with arguments 'beta' and 'delta' run ffmpeg with arguments 'charlie' and 'delta'
我們已經知道如何創建一個循環,所以讓我們添加另一個,嵌套在第一個中。這本身會將所有輸入行與其自身和所有對匹配兩次,因此計算行數以跳過已經處理的對。
#!/bin/bash i=0 while IFS= read a; do i=$((i + 1)) j=0 while IFS= read b; do j=$((j + 1)) if [ "$j" -le "$i" ]; then continue; fi # insert the actual commands here printf "run ffmpeg with arguments '%s' and '%s'\n" "$a" "$b" done < vids.list done < vids.list
或者像您所做的那樣,在外部循環處理它們時刪除這些行,這實際上更短:
#!/bin/bash cp vids.list vids.list.tmp while IFS= read a; do while IFS= read b; do if [ "$a" = "$b" ]; then continue; fi # insert the actual commands here printf "run ffmpeg with arguments '%s' and '%s'\n" "$a" "$b" done < vids.list.tmp sed -i '1d' vids.list.tmp done < vids.list.tmp rm vids.list.tmp
我不確定究竟是什麼原因導致腳本中出現“太多參數”,但是 to 的參數
-i
是一個雙引號字元串,裡面只有一個命令替換,所以它將作為單個參數傳遞給ffmpeg
(使用來自echo
嵌入)。它不應該導致太多的爭論。