Remotion LabRemotion Lab
疑難排解ENAMETOOLONG 錯誤

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 問題。

選項:

  1. 在 macOS 或 Linux 機器上渲染:若手邊有可用的 macOS 或 Linux 機器,直接在那裡執行渲染。

  2. 使用 Windows Subsystem for Linux(WSL):在 Windows 上啟用 WSL 並在 Linux 環境中渲染:

# 在 WSL 中安裝 Node.js 並執行渲染
npx remotion render src/index.ts MyComposition out/video.mp4
  1. 使用 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 錯誤,實際數量取決於每個輸入路徑的長度。


延伸閱讀