短故事:我想寫一個腳本,將使用FFmpeg將存儲在一個目錄中的許多文件轉換爲「標準」mp4格式並將轉換後的文件保存在另一個目錄中。這是一種學習體驗(一種有趣的體驗!),因爲我沒有做過任何真正的編碼,因爲在IBM 370主機上使用Pascal和FORTRAN很流行。傳遞腳本變量的文件名與空格在外部程序(ffmpeg)bash中失敗
本質上,腳本獲取文件名,剝離路徑和擴展名,用路徑和mp4擴展名重新組合文件名,並用一些設置參數調用FFmpeg來完成轉換。如果該目錄僅包含名稱中沒有空格的視頻文件,則一切正常。如果文件名包含空格,則FFmpeg無法處理該文件並轉到下一個文件。錯誤表明FFMpeg只能看到文件名到第一個空格。我在下面包含腳本和輸出。
感謝您的任何幫助和建議。如果你認爲我應該以另一種方式來做這件事,請採取一切手段,給我你的建議。正如我所說,我做了這樣的事情已經很長時間了。雖然我很享受。
我已經包含代碼第一,然後是示例輸出。
for file in ./TBC/*.mp4
do
echo "Start of iteration"
echo "Full text of file name:" $file
#Remove everything up to "C/" (filename without path)
fn_orig=${file#*C/}
echo "Original file name:" $fn_orig
#Length of file name
fn_len=${#fn_orig}
echo "Filename Length:" $fn_len
#file name without path or extension
fn_base=${fn_orig:0:$fn_len-4}
echo "Base file name:" $fn_base
#new filename suffix
newsuffix=".conv.mp4"
fn_out=./CONV/$fn_base$newsuffix
echo "Converted file name:" $fn_out
ffmpeg -i $file -metadata title="$fn_orig" -c:v libx264 -c:a libfdk_aac -b:a 128k $fn_out
echo "End of iteration"
echo
done
echo "Script completed"
隨着註釋掉ffmpeg的線,並在./TBC目錄兩個文件,這是輸出,我得到
Start of iteration
Full text of file name: ./TBC/Test file with spaces.mp4
Original filename: Test file with spaces.mp4
Filename Length: 25
Base filename: Test file with spaces
Converted file name: ./CONV/Test file with spaces.conv.mp4
End of iteration
Start of iteration
Full text of file name: ./TBC/Test_file_with_NO_spaces.mp4
Original file name: Test_file_with_NO_spaces.mp4
Filename Length: 28
Base file name: Test_file_with_NO_spaces
Converted file name: ./CONV/Test_file_with_NO_spaces.conv.mp4
End of iteration
Script completed
我不會打擾張貼結果時ffmpeg的是取消註釋,除了聲明它失敗並顯示以下錯誤: ./TBC/Test:沒有這樣的文件或目錄
然後,腳本繼續到下一個成功完成的文件,因爲它的名稱中沒有空格。實際的文件名是「帶有spaces.mp4的測試文件」,所以你可以看到ffmpeg在遇到空格時停在「測試」一詞後面。
我希望這個清晰簡明,希望有人能夠指引我正確的方向。還有很多我想要處理的腳本,比如解析子目錄和忽略非視頻文件等。
我期待着您能給予的任何見解!
提問時;儘量減少!這是太多的文本和代碼才能得到真正的問題! –
你試過我的回答嗎?它有用嗎?任何更新? –
嗨,對不起......上牀睡覺了。我嘗試了你的想法,但它仍然無效...沒有運氣。有任何想法嗎? – BostonScott