2016-10-04 28 views
2

我試圖重新編碼幾百個視頻,X265,但也有在文件名空間很多目錄,做一些文件。我看了一大堆腳本,並努力找到一個可以處理空格和不同目錄級別的腳本。ffmpeg的批量重新編碼與子

這一件作品,只要沒有子目錄:

#!/bin/bash 
for i in *.avi; 
do 
    ffmpeg -i "$i" -c:v libx265 -c:a copy X265_"$i" 
done 

我一直在試圖與這個bash腳本的工作,但它失敗,我猜測的空格。

#!/bin/bash 
inputdir=$PWD 
outputdir=$PWD 
while IFS= read -r file ; do 
    video=`basename "$file"` 
    dir=`dirname "$file"` 
ffmpeg -fflags +genpts -i "$file" -c:v libx265 -c:a copy "$dir"/X265_"$video" 
done < <(find "$inputdir" -name "*.avi" | head -100) 

在這個線程上它看起來像一個很好的解決方案,而不是Linux用戶。 FFMPEG - Batch convert subfolders

FOR /r %%i in (*.mp4) DO ffmpeg32 -i "%%~fi" -map 0:0 -map 0:1 -map 0:1 -c:v copy -c:a:0 aac -b:a 128k -ac 2 -strict -2 -cutoff 15000 -c:a:1 copy "%%~dpni(2)%%~xi"

如果你能指點正確的解決方案,適用於bash中,我將不勝感激。

回答

2

這是find和一個典型的場景xargs

find /path/to/basedir -name '*.avi' -print0 | xargs -0 convert.sh 

其中-print0-0確保用空格名字妥善處理。

而且在convert.sh,你有你的for循環,幾乎等同於你的第一個腳本

#!/bin/bash 

for i; do 
    d=$(dirname "$i") 
    b=$(basename "$i") 
    ffmpeg -i "$i" -c:v libx265 -c:a copy "$d/X265_$b" 
done 

for i沒有任何意思是一樣的「給定所有參數」,它是通過文件由xargs。

要使用字符串前面加上文件名,則必須將名稱拆分成目錄和底座,然後組裝起來了。

+0

謝謝奧拉夫,這看起來像一個優雅的解決方案,但我得到它正在嘗試當它第一個目錄前面加上X265_到目錄名稱的錯誤。我得到這個錯誤:'X265_./Sub目錄/文件與Spaces.avi:沒有這樣的文件或directory' – Alan

+0

@Alan這可能無法正常工作。也許它需要一些引號和轉義的擺弄,但我現在不在我的電腦上進行測試。 –

+0

感謝@Olaf,您所做的編輯制定完美。 – Alan