ENAMETOOLONG 錯誤
解決 Windows 上因 FFmpeg 指令長度超出限制而產生的 ENAMETOOLONG 錯誤
錯誤訊息
如果你看到以下錯誤:
Command failed with ENAMETOOLONG: ffmpeg ...
這表示 Remotion 產生的 FFmpeg 指令超過了 Windows 允許的最大指令長度(8192 個字元)。
問題原因
當影片中包含大量音訊軌道時,Remotion 需要在單一 FFmpeg 指令中列出所有音訊輸入檔案,以便混音成最終輸出。
在 Windows 作業系統上,命令列的最大長度為 8192 個字元。若音訊層數量過多,FFmpeg 指令就會超出這個限制,導致 ENAMETOOLONG 錯誤。
FFmpeg 目前沒有其他替代方式能指定大量輸入檔案,因此這個問題從 FFmpeg 本身無法解決,只能從 Remotion 的使用方式著手。
解決方案
方案一:為無聲影片加上 muted 屬性(最推薦)
如果你的組件中有包含多個 <Video> 或 <Audio> 元件,但其中有些其實沒有聲音或不需要聲音,為它們加上 muted 屬性,可以顯著減少 FFmpeg 指令的長度。
import { Video } from "remotion";
// 若這個影片不需要聲音,加上 muted 屬性
<Video src={staticFile("background.mp4")} muted />
// 只有這個影片需要聲音
<Video src={staticFile("narration.mp4")} />對於 <Audio> 元件也是同樣的做法:
import { Audio } from "remotion";
// 不需要的音訊加上 muted
<Audio src={staticFile("sound-effect.mp3")} muted />加上 muted 的媒體元件不會被加入 FFmpeg 的音訊混音指令,可以有效縮短指令長度。
方案二:改在其他作業系統上渲染
macOS 和 Linux 的命令列長度限制遠大於 Windows(通常為 200 萬個字元以上),因此在這些系統上不會遇到 ENAMETOOLONG 問題。
選項:
-
在 macOS 或 Linux 機器上渲染:若手邊有可用的 macOS 或 Linux 機器,直接在那裡執行渲染。
-
使用 Windows Subsystem for Linux(WSL):在 Windows 上啟用 WSL 並在 Linux 環境中渲染:
# 在 WSL 中安裝 Node.js 並執行渲染
npx remotion render src/index.ts MyComposition out/video.mp4- 使用 Remotion Lambda:透過 AWS Lambda 在雲端渲染,Lambda 執行環境為 Linux,沒有 Windows 的指令長度限制:
npx remotion lambda render <serve-url> MyComposition方案三:分段渲染再合併
若無法使用其他作業系統,可以將影片分段渲染,再用 FFmpeg 的 concat 功能合併。
步驟一:分段渲染
使用 --frames 參數渲染影片的不同片段:
# 渲染第 0 到第 299 幀
npx remotion render src/index.ts MyComposition part1.mp4 --frames=0-299
# 渲染第 300 到第 599 幀
npx remotion render src/index.ts MyComposition part2.mp4 --frames=300-599
# 渲染第 600 到第 899 幀
npx remotion render src/index.ts MyComposition part3.mp4 --frames=600-899步驟二:建立 concat 清單
建立一個文字檔 concat.txt,列出所有片段:
file 'part1.mp4'
file 'part2.mp4'
file 'part3.mp4'
步驟三:用 FFmpeg 合併
ffmpeg -f concat -safe 0 -i concat.txt -c copy final.mp4如何判斷音訊層數量
若你想知道目前組件有多少音訊層,可以查看 Remotion Studio 的音訊時間軸,或在組件中暫時加入 console.log 來追蹤音訊元件的數量。
通常當音訊層超過 50 至 100 個時,就有可能在 Windows 上觸發 ENAMETOOLONG 錯誤,實際數量取決於每個輸入路徑的長度。