我正在嘗試使用 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,而你替換了一些關于2.wavin 的東西input.txt。也許你可以做這樣的事情來回圈你的檔案:
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/347834.html
