我正在嘗試使用 ffmpeg 在開始和結束時用靜音填充一系列 wav 檔案。
我從這個神奇網站的其他地方收集的代碼行:
ffmpeg -f concat -i input.txt -codec copy output.wav
其中 input.txt 只是一個包含 3 個檔案名的串列:silence.wav 0.wav silent.wav
指示要連接的內容
我可以為單個檔案執行此操作,然后手動更新第 2 行,但有 1000 多個檔案。它們被命名為 0.wav 1.wav 2.wav。
我認為這在回圈中是微不足道的:
COUNTER=1
for FILE in *.wav
do
ffmpeg -f concat -i input.txt -codec copy $FILE
echo $FILE
echo $COUNTER
sed -i "2s/.*/file \'${COUNTER}.wav\'/" input.txt
((COUNTER=COUNTER 1))
done
然而,回圈不會按順序迭代 0.wav 1.wav 2.wav - 更不穩定(0.wav, 10.wav, 11.wav) - 所以我的計數器不同步。并且我保存的檔案名與其原始檔案名不對齊。
是否有解決方法可以從檔案本身中洗掉名稱而不是依賴計數器?
uj5u.com熱心網友回復:
如果計數器已經包含在檔案名中,為什么不直接重用檔案名呢?這將避免字串排序(其中"11" < "9")與數字排序(其中11 > 9)的問題,并且如果檔案名(數字)稀疏,它也可以正常作業。此外,輸出檔案應該不是同一個檔案中的一個輸入。(可能是ffmpeg使用臨時檔案可以優雅地處理它的情況,但我不會打賭。)
for file in *.wav; do
sed -i "2s/.*/file \'${file}\'/" input.txt
ffmpeg -f concat -i input.txt -codec copy "output-${file}"
mv "output-${file}" "$file" # replaces original file!
done
uj5u.com熱心網友回復:
您設定的主要問題是您按字母順序閱讀檔案。所以在 1.wav 之后是 10.wav。
然后您的代碼變為:
ffmpeg -f concat -i input.txt -codec copy 10.wav
sed -i "2s/.*/file \'2.wav\'/" input.txt
所以 ffmpeg 與 10.wav 一起作業,而你在 input.txt 中替換了一些關于 2.wav 的內容。
看起來您按字母順序回圈瀏覽檔案。
也許你可以做這樣的事情來回圈你的檔案:
COUNTER=1
while [ $COUNTER -le 1000 ]
do
echo "Filename: ${COUNTER}.wav"
((COUNTER=COUNTER 1))
done
我不知道 ffmpeg 是否會啟動一個新行程,但回圈可能會啟動 ffmpeg,但不會等到它完成。這樣,您最終可能會同時運行 1000 個 ffmpeg 行程。
uj5u.com熱心網友回復:
你應該嘗試更換
for FILE in *.wav
和
for FILE in $(ls *.wav | sort -t '.' -k 1 -n)
讓我知道它是否有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/343108.html
上一篇:Asp.netmvcSession[""]="xxx"未將物件參考設定為服務器上的物件實體(在本地作業的同一專案)
