Bash

使用 ffmpeg 自動轉換文件

  • February 16, 2021

我正在尋找一種自動化文件轉換的方法。我正在使用一個 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.) 的文件觸發該行為。)

引用自:https://unix.stackexchange.com/questions/634810