Bash
使用 ffmpeg 自動轉換文件
我正在尋找一種自動化文件轉換的方法。我正在使用一個 Ubuntu 虛擬機,通過它我可以訪問 Windows 安裝。正常的語法應該是:
ffmpeg -i file.mp4 file.mp3
所以這就是我想要做的:
ls | while read i; do echo ffmpeg -i \"$i\" \"${i/mp4/mp3}\"; done
如您所見,我添加了“echo”以首先查看生成的命令,這就是我得到的:
ffmpeg -i "Accepting Amendments.mp4" "Accepting Amendments.mp3"
如您所見,文件名可能有空格,所以我試圖轉義它們。但是,當我刪除“迴聲”時,此命令不起作用。所發生的只是進行了一些轉換,並且我收到了帶有拆分文件名的錯誤消息,例如**“接受 Amendments.mp4”**。所以基本上第一個 ffmpeg 命令執行良好,然後第二個失敗,依此類推。
我注意到,當我執行
ls
命令時,我得到的文件名帶有單引號,但是當我自己創建文件時,沒有引號。$ls 'Accepting Amendments.mp4' $touch test $ls 'Accepting Amendments.mp4' test
這可能是問題嗎?
不,問題是(通過使用
\"
)您要ffmpeg
轉換文件"Accepting Amendments.mp4"
,名稱中包含引號。該文件不存在,因此ffmpeg
失敗。您真正想要做的是使用 shell 解釋為“不要拆分包含的值”的非轉義引號:ffmpeg -i "$i" "${i/mp4/mp3}"
此外,您可以/應該擁有自己的 shell 循環,而不是管道 ls 的輸出:
for i in *.mp4; do ffmpeg -i "$i" "${i/mp4/mp3}"; done
但是,
ffmpeg
這仍然無法正常工作,因為它出於某種原因從標準輸入讀取,並且似乎以這種方式吞下了文件名中的一些字元。該-nostdin
標誌有助於:for i in *.mp4; do ffmpeg -nostdin -i "$i" "${i/mp4/mp3}"; done
(您在
ls
輸出中看到的單引號是由ls
包含例如空格的文件名的版本添加的,因此您可以簡單地將命令行上的輸出作為另一個程序的參數。這與創建者無關該文件,您只是沒有使用名為test
.) 的文件觸發該行為。)