2016-01-13 43 views
1

短故事:我想寫一個腳本,將使用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在遇到空格時停在「測試」一詞後面。

我希望這個清晰簡明,希望有人能夠指引我正確的方向。還有很多我想要處理的腳本,比如解析子目錄和忽略非視頻文件等。

我期待着您能給予的任何見解!

+0

提問時;儘量減少!這是太多的文本和代碼才能得到真正的問題! –

+1

你試過我的回答嗎?它有用嗎?任何更新? –

+0

嗨,對不起......上牀睡覺了。我嘗試了你的想法,但它仍然無效...沒有運氣。有任何想法嗎? – BostonScott

回答

1

嘗試引用您的輸出文件:

ffmpeg -i "$file" ... "$fn_out" 

bash的分離基於空格的參數,所以你要告訴他,$ fn_out是一個單獨的參數;因此「」表明這是一個論點。

+0

即使使用變量周圍的引號,帶有空格的文件名的迭代仍會在FFmpeg中引發錯誤。行情似乎並不像一個單位一樣。有任何想法嗎? – BostonScott

+0

同樣的錯誤? –

+0

這確實是輸入字段中缺失的引號。我猜是因爲它成功地從目錄中讀取了帶有空格的文件,但沒有將文件寫入它,所以當它一直是導致故障的輸入參數時,我開始關注輸出。再次感謝你的幫助! – BostonScott